yzsxzhd 发表于 2024-8-15 11:21:40

在线急救,我怎么判断电机已经停了!!!!!!!

请教一个弱智的问题:我用光电编码器测试电机转速,采用STC8H芯片的PWMA的第一组捕获模块CC1的捕获功能,用PWM1P引脚,捕获来之光电编码器的脉冲信号,在中断中对前后两次的捕获值相减得到周期值,从而得到脉冲频率值,即获得转速;经过验证,方法是可行的。但是现在遇到一个问题,如果电机处于静止状态,编码器没有脉冲信号输出,那么就没有PWM中断发生,单片机怎么知道电机已经停了?在线就解决!!!@梁工

yzsxzhd 发表于 2024-8-15 11:26:32

#define FOSC          11059200UL
#define PWM_PERIOD    6143      //定义PWM频率 = FOSC/(PWM_PERIOD+1)=1.8kHz                           
#define PWM_DUTY      3072      //定义PWM的占空比 = PWM_DUTY/PWM_PERIOD = 50%
                                             
uint cap_old=0;
uint cap_new=0;
uint cap=0;
float freq=0;//脉冲频率

void PWM_Init()
{
        P_SW2 |= 0x80;
       
        PWMA_PS |= (BIT1);PWMA_PS &= ~(BIT0); //PWM1P输出引脚分配P6.0   
       
        PWMA_PSCRH = 0x00;                //预分频寄存器
        PWMA_PSCRL = 0x00;
       
        PWMA_CCER1 = 0x00;                        //写CCMRx前先清零CCxE关闭通道
        PWMA_CCMR1 = 0x01;                //通道模式配置
        PWMA_CCER1 |= BIT0;                //使能通道并配置通道极性
        PWMA_IER = 0x02;                    //使能中断       
        PWMA_CR1 |= 0x01;              //使能计数器
}

void PWMA_Isr()interrupt 26
{
        if(PWMA_SR1 & 0x02)
                {                       
                        cap_old = cap_new;
                        cap_new = PWMA_CCR1;//读取CCR1
                        cap = cap_new - cap_old;                       
                        freq = FOSC / 1000.0 / (float)cap;//脉冲频率        kHz       
                        PWM_Capture=1;//PWM捕捉事件标志
                        PWMA_SR1 &= ~0x02;
                }
}

DebugLab 发表于 2024-8-15 11:37:06

一段时间不进中断就停了呗,可以用定时器计时

Yim_Hom 发表于 2024-8-15 12:30:09

这么试试行不行?
两次捕获,那就每一次捕获都有值,
如果电机不转,两次捕获都为0,不进行计算,认为电机不转;
如果第一次捕获电机转,第一次值不为0,第二次捕获时捕获值为0,这个时候还能计算,但计算值不一定对;
如果两次捕获都有值且不为0,就是正常情况。

根据捕获值决定是否进入计算和判断电机是否在转,应该算一种方法。

要不就是用标志位来判断,有值标志位置1,无值置0,也可以考虑。

至于计算结果正值 负值还是0,用于判断正转 反转还是转速未改变,前面的判断对结果应该没影响。

水平有限,希望思路能帮到你。

yzsxzhd 发表于 2024-8-15 12:42:56

Yim_Hom 发表于 2024-8-15 12:30
这么试试行不行?
两次捕获,那就每一次捕获都有值,
如果电机不转,两次捕获都为0,不进行计算,认为电机 ...

STC8H手册里PWM章节反复看,就是看不懂,上面的程序是抄的范例!
范例里用的中断方式,可是一旦电机停转,就不会有中断响应,我没法读到捕获值,不知道读哪个寄存器?

Yim_Hom 发表于 2024-8-15 13:03:16

玩stc15的6路15位pwm时,没用过中断。
stc8的话,还没看到pwm,但是从范例程序里看,
可以判断cap_new和old的值试试啊,初始定义为0,中断里还是0,不也可以嘛?

Lkck8210 发表于 2024-8-15 13:29:58

yzsxzhd 发表于 2024-8-15 12:42
STC8H手册里PWM章节反复看,就是看不懂,上面的程序是抄的范例!
范例里用的中断方式,可是一旦电机停转 ...

不能单靠寄存器,要配合定时器

yzsxzhd 发表于 2024-8-15 15:50:20

Lkck8210 发表于 2024-8-15 13:29
不能单靠寄存器,要配合定时器

这个办法可行!

梁工 发表于 2024-8-16 10:24:00

两个方法:
1、超时处理:每次捕获到脉冲都重置超时时间,当没有捕获时钟,则超时,可知已停止。
2、计算转速:一般有编码器都会计算转速,转速很低或降为0则电机停止。
页: [1]
查看完整版本: 在线急救,我怎么判断电机已经停了!!!!!!!