OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3954|回复: 11

求大神解答,用stm32的systick测量计算电机转速

[复制链接]

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2015-9-17
在线时间
16 小时
发表于 2016-2-28 20:36:44 | 显示全部楼层 |阅读模式
5金钱
最近在做一个项目,说是用systick测量计算电机转速得到的电机转速比较精确,但我自己看了下,不知道咋用systick测量计算电机转速,求知道或者做过的大神指导下啊,困扰好久了啊啊啊,。。@原子哥   /(ㄒoㄒ)/~~

最佳答案

查看完整内容[请看2#楼]

用定时器吧。准确一些。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-2-28 20:36:45 | 显示全部楼层
用定时器吧。准确一些。
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3772
金钱
3772
注册时间
2015-4-26
在线时间
765 小时
发表于 2016-2-28 20:45:47 | 显示全部楼层
捕获不是更准确吗
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2016-2-28 20:47:00 | 显示全部楼层
最精确的应该是轴编码器吧……systick只提供定时器功能,具体工作方式参考原子的delay函数。
回复

使用道具 举报

9

主题

507

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3347
金钱
3347
注册时间
2013-4-10
在线时间
333 小时
发表于 2016-2-28 21:48:06 | 显示全部楼层
用定时器的捕获功能,测编码器接收到的脉冲宽度计算不就行了吗?
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-2-28 23:00:10 | 显示全部楼层
systick是Cortex-M3内核的一个24-bit向下计数定时器,和任何引脚都没有联系,谈不上精准测速
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2015-9-17
在线时间
16 小时
 楼主| 发表于 2016-2-29 09:24:36 | 显示全部楼层
likunxue 发表于 2016-2-28 21:48
用定时器的捕获功能,测编码器接收到的脉冲宽度计算不就行了吗?

您能说的再详细一些吗
回复

使用道具 举报

9

主题

507

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3347
金钱
3347
注册时间
2013-4-10
在线时间
333 小时
发表于 2016-2-29 16:12:37 | 显示全部楼层
本帖最后由 likunxue 于 2016-2-29 16:14 编辑
liuweihejia 发表于 2016-2-29 09:24
您能说的再详细一些吗
以下是我做过的一个步进电机速度检测验     PB7接A相编码器输入口
/*******************************************************************************************
函数名: 定时器4配置输入捕获模式
调  用: TIM4_IRD_StartWork_int(void)
参  数: 无
返回值: 无   
*******************************************************************************************/
void TIM4_StartWork_int(void)
     {      
     RCC->APB1ENR |= 1<<2;                //使能定时器4时钟     
     RCC->APB2ENR |= 1<<3;                //使能外设PORTB时钟      
     GPIOB->CRL &= 0x0fffffff;            //PB7输入      
     GPIOB->CRL |= 0x40000000;            //TIM4_CH2 ->PB7      
     GPIOB->ODR |= 1<<7;                  //置上拉         
     TIM4->ARR = 59999;                   //设定计数器自动装载值(100us)
     TIM4->PSC = 36;                      //时钟分频系数36,计数频率为1MHZ  
     BIT_ADM(TIM4->CR1,7) = 1;            //定时器ARPE充许      
     BIT_ADM(TIM4->CCMR1,15) = 0;         //IC2F = 0100; N=6 配置输入捕获2滤波   
     BIT_ADM(TIM4->CCMR1,14) = 1;
     BIT_ADM(TIM4->CCMR1,13) = 0;   
     BIT_ADM(TIM4->CCMR1,12) = 0;
     BIT_ADM(TIM4->CCMR1,11) = 0;         //IC2PSC = 00;不分频
     BIT_ADM(TIM4->CCMR1,10) = 0;     
     BIT_ADM(TIM4->CCMR1, 9) = 0;         //CC2S = 10;选择输入端口IC2映谢到 TI1上
     BIT_ADM(TIM4->CCMR1, 8) = 1;
     BIT_ADM(TIM4->CCER,  4) = 1;         //OC2 输入捕获使能
     BIT_ADM(TIM4->CCER,  5) = 0;         //高电平有效P =0;         
     BIT_ADM(TIM4->DIER,  2) = 1;         //充许捕获2中断     
     BIT_ADM(TIM4->DIER,  0) = 1;         //定时器更新中断使能   
     MY_NVIC_Init(4,0,TIM4_IRQn,4);       //抢占3,子优先级0,组4  
     BIT_ADM(TIM4->CR1,0) = 1;            //使能定时器4         
     }
/*******************************************************************************************
函 数 名: 定时器4中断服务程序        
功能说明: 计算当前电机的工作速度
形    参: width 脉冲宽度,单位 1us
返 回 值: 无  
          速度计算方法说明如下
          采样频率 1MHZ(1us) F,  编码器线数 100线, M, 定时器的计数次数 S
          频率(F) =  转数(N) * 线数(M)/60;   
          转数(N) =  频率(F) * 60/线数(M);
          F = 1000000/S;
          N = (1000000/S*60)/100;
          MoB.STATUS; 速度检测被捕获标记        
          D7  = 1 加速,0 减速
          D4  = 1 上升沿捕获标志位
          D0~ D4 采样次数
********************************************************************************************/
void TIM4_IRQHandler(void)
     {            
     if(BIT_ADM(TIM4->SR,0) == 1)        //溢出中断            
       {
       BIT_ADM(TIM4->SR,0) = 0;          //清除溢出断标志   
       MoB.STATUS = 0;                   //清零脉宽记录寄存器
       MoB.ShuChuMaiKuan = 0;
       MoB.Leve = 0;                         //速度指针清零               
       }
     if(BIT_ADM(TIM4->SR,2) == 1)        //CC2IE中断                           
       {  
       BIT_ADM(TIM4->SR,2) = 0;          //清除CC2IE溢出中断      
       if(ENCODE_A == 1)                 //上升沿捕获
         {
         BIT_ADM(TIM4->CCER,5) = 1;      //CC2P=1设置为下降沿捕获                  
         TIM4->CNT = 0;                         //清空定时器值
         MoB.STATUS |= 0x10;             //标记上升沿已经被捕获         
         }
       else{
           u16 Dval = TIM4->CCR2;         //读取CCR2也可以清CC1IF标志位
           BIT_ADM(TIM4->CCER, 5) = 0;   //CC2P=0 设置为上升沿捕获     
           if(MoB.STATUS & 0x10)
             {
             s32 Error,MaiKuan;                     
             MoB.STATUS  &= 0xef;        //清除上升沿捕获标志位  
             MoB.SumDval += Dval;        //积分计算            
             MoB.SumDval -= MoB.Dval3;   
             MaiKuan = MoB.SumDval>>2;     
             MoB.Dval3 = MoB.Dval2;      //Dval[-3] 上次脉宽
             MoB.Dval2 = MoB.Dval1;          //Dval[-2] 上次前次的脉宽     
             MoB.Dval1 = MoB.Dval0;      //Dval[-1]
             MoB.Dval0 = Dval;                 
             Error = MaiKuan - MoB.ShuChuMaiKuan; //得到两次脉宽的误差           
             MoB.ShuChuMaiKuan += ((Error * 128 +128)>>8); //一阶滤波(权重128, 加128是为了四舍五入   
             if(MoB.ShuChuMaiKuan < MoB.Dval3)MoB.STATUS |= 0x80; //加速
             else{
                 MoB.STATUS &= 0x7f;     //减速      
                 }                        
             if((MoB.STATUS & 0x0f)< 14)MoB.STATUS ++;                     
             }                     
           }               
       }            
     TIM4->SR = 0;  
     }
回复

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2015-9-17
在线时间
16 小时
 楼主| 发表于 2016-3-1 09:15:43 | 显示全部楼层
likunxue 发表于 2016-2-29 16:12
以下是我做过的一个步进电机速度检测验     PB7接A相编码器输入口
/************************************ ...

我们的是无刷直流电机,不是步进电机,貌似不太不一样啊,您做过无刷直流的吗?不过还是谢谢您~~
回复

使用道具 举报

9

主题

507

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3347
金钱
3347
注册时间
2013-4-10
在线时间
333 小时
发表于 2016-3-1 12:55:49 | 显示全部楼层
liuweihejia 发表于 2016-3-1 09:15
我们的是无刷直流电机,不是步进电机,貌似不太不一样啊,您做过无刷直流的吗?不过还是谢谢您~~

不管是哪种电机,速度检测都是一样的嘛
回复

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2015-9-17
在线时间
16 小时
 楼主| 发表于 2016-3-3 09:22:29 | 显示全部楼层
正点原子 发表于 2016-2-28 20:36
用定时器吧。准确一些。

原子哥,能说具体点吗?或者有代码参考没,跪谢了,最近因为这一系列事情挺上头的,谢谢谢谢谢/(ㄒoㄒ)/~~
回复

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2015-9-17
在线时间
16 小时
 楼主| 发表于 2016-3-7 11:12:57 | 显示全部楼层
正点原子 发表于 2016-2-28 20:36
用定时器吧。准确一些。

原子哥,能说具体点吗?或者有代码参考没,跪谢了,最近因为这一系列事情挺上头的,谢谢谢谢谢/(ㄒoㄒ)/~~。。。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 13:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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