请教一个问题,PWM测光电传感器的信号频率获得速度值,如果没有脉冲输出,怎么判断?
本帖最后由 yzsxzhd 于 2024-8-15 11:19 编辑请教一个弱智的问题:我用光电编码器测试电机转速,采用STC8H芯片的PWMA的第一组捕获模块CC1的捕获功能,用PWM1P引脚,捕获来之光电编码器的脉冲信号,在中断中对前后两次的捕获值相减得到周期值,从而得到脉冲频率值,即获得转速;经过验证,方法是可行的。但是现在遇到一个问题,如果电机处于静止状态,编码器没有脉冲信号输出,那么就没有PWM中断发生,单片机怎么知道电机已经停了?在线就解决!!!@梁工
把我的代码抄下来,就是这样,如果没有脉冲信号,就进不了PWM中断,我就没法知道电机停了下来,怎么判断电机停啦?
------------------------------------------------------------------------------------------------------------------------------------------------------------
#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;//脉冲频率
bit PWM_Capture=0;//PWM捕捉事件标志
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;
}
} 一段时间不进中断就停了呗,可以用定时器计时 wnagming 发表于 2024-8-15 12:34
正常编码器有数据,但是速度越慢编码器信号时间越长,人为设定一个时间,当编码器信号时间超过该设定,就认 ...
电机停转,编码器信号就是一个固定的电平,我没法测试信号固定电平时间,总不能再用STC8H的任意IO口中断判断吧?请再指教 两个方法:
1、超时处理:每次捕获到脉冲都重置超时时间,当没有捕获时钟,则超时,可知已停止。
2、计算转速:一般有编码器都会计算转速,转速很低或降为0则电机停止。
页:
[1]