找回密码
 立即注册
查看: 479|回复: 8

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-01-17 11:42:04

2

主题

5

回帖

56

积分

注册会员

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-01-17 11:42:04

2

主题

5

回帖

56

积分

注册会员

积分
56
发表于 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;
                }
}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2024-8-15 11:37:06 | 显示全部楼层
一段时间不进中断就停了呗,可以用定时器计时
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:213
  • 最近打卡:2025-04-23 20:59:03
已绑定手机

36

主题

560

回帖

1885

积分

荣誉版主

积分
1885
发表于 2024-8-15 12:30:09 | 显示全部楼层
这么试试行不行?
两次捕获,那就每一次捕获都有值,
如果电机不转,两次捕获都为0,不进行计算,认为电机不转;
如果第一次捕获电机转,第一次值不为0,第二次捕获时捕获值为0,这个时候还能计算,但计算值不一定对;
如果两次捕获都有值且不为0,就是正常情况。

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

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

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

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

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-01-17 11:42:04

2

主题

5

回帖

56

积分

注册会员

积分
56
发表于 2024-8-15 12:42:56 | 显示全部楼层
Yim_*** 发表于 2024-8-15 12:30
这么试试行不行?
两次捕获,那就每一次捕获都有值,
如果电机不转,两次捕获都为0,不进行计算,认为电机 ...

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:213
  • 最近打卡:2025-04-23 20:59:03
已绑定手机

36

主题

560

回帖

1885

积分

荣誉版主

积分
1885
发表于 2024-8-15 13:03:16 | 显示全部楼层
玩stc15的6路15位pwm时,没用过中断。
stc8的话,还没看到pwm,但是从范例程序里看,
可以判断cap_new和old的值试试啊,初始定义为0,中断里还是0,不也可以嘛?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:294
  • 最近打卡:2025-03-06 09:25:41

8

主题

318

回帖

1835

积分

金牌会员

积分
1835
发表于 2024-8-15 13:29:58 | 显示全部楼层
yzsx*** 发表于 2024-8-15 12:42
STC8H手册里PWM章节反复看,就是看不懂,上面的程序是抄的范例!
范例里用的中断方式,可是一旦电机停转 ...

不能单靠寄存器,要配合定时器
2024-08-15_132846.png
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-01-17 11:42:04

2

主题

5

回帖

56

积分

注册会员

积分
56
发表于 2024-8-15 15:50:20 | 显示全部楼层
Lkck*** 发表于 2024-8-15 13:29
不能单靠寄存器,要配合定时器

这个办法可行!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-30 22:59:03

73

主题

5882

回帖

1万

积分

超级版主

积分
12073
发表于 2024-8-16 10:24:00 | 显示全部楼层
两个方法:
1、超时处理:每次捕获到脉冲都重置超时时间,当没有捕获时钟,则超时,可知已停止。
2、计算转速:一般有编码器都会计算转速,转速很低或降为0则电机停止。
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 00:13 , Processed in 0.119039 second(s), 102 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表