你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32F429编码器测速经验分享

[复制链接]
攻城狮Melo 发布时间:2023-3-26 19:05
  1. void TIM4_Init(u16 arr,u16 psc)
  2. {  
  3.         TIM4_Handler.Instance=TIM4;
  4.         TIM4_Handler.Init.Prescaler=psc;                     //分频系数
  5.         TIM4_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;    //向上计数器
  6.         TIM4_Handler.Init.Period=arr;                        //自动装载值
  7.         TIM4_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//时钟分频因子
  8.       
  9.         TIM4_Encoder_Handler.EncoderMode=TIM_ENCODERMODE_TI12;
  10.         TIM4_Encoder_Handler.IC1Filter=0;
  11.         TIM4_Encoder_Handler.IC1Polarity=TIM_ICPOLARITY_RISING;
  12.         TIM4_Encoder_Handler.IC1Prescaler=TIM_ICPSC_DIV1;
  13.         TIM4_Encoder_Handler.IC1Selection=TIM_ICSELECTION_DIRECTTI;
  14.                
  15.         TIM4_Encoder_Handler.IC2Filter=0;
  16.         TIM4_Encoder_Handler.IC2Polarity=TIM_ICPOLARITY_RISING;
  17.         TIM4_Encoder_Handler.IC2Selection=TIM_ICSELECTION_DIRECTTI;
  18.         TIM4_Encoder_Handler.IC2Prescaler=TIM_ICPSC_DIV1;
  19.         HAL_TIM_Encoder_Init(&TIM4_Handler,&TIM4_Encoder_Handler);
  20.       
  21.         HAL_TIM_Encoder_Start(&TIM4_Handler,TIM_CHANNEL_ALL);
  22.         HAL_TIM_Encoder_Start_IT(&TIM4_Handler,TIM_CHANNEL_ALL);//开启中断
  23.         TIM4->CNT=1000;
  24.     __HAL_TIM_ENABLE_IT(&TIM4_Handler,TIM_IT_UPDATE);   //使能更新中断
  25.     __HAL_TIM_ENABLE(&TIM4_Handler);
  26. }
复制代码

在这里我们配置编码器模式,开启时钟和溢出中断
  1. //回调函数,定时器中断服务函数调用
  2. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  3. {


  4.         if(htim==(&TIM4_Handler))
  5.         {
  6.                 if ( (TIM4->CR1&0x0010) == 0 )  //向上计数溢出                 {
  7.                         Interupt_Num++ ;
  8.                 }
  9.                 else //向下计数溢出
  10.                 {
  11.                         Interupt_Num-- ;
  12.                 }               
  13.         }
  14. }
复制代码

5090d9c63fe1a889c01dc598b6668d68.png

在中断回调函数里,我们将TIM4->CR1的第5位不变,假如第五位是0,应选择递增计数,我们让计数器增加1。(0x0010==0000 0000 0001 0000)这里的次数我们是在计算溢出次数。要注意我们在TIM4_Init() 是把计数器CNT的值设为了1000,而ARR设置成了2000,这样计数器每次开始工作都是从1000->2000,0->2000,0->2000这样循环,Interupt_Num的值就是我们记录的溢出总数,而最开始的一次溢出是从1000开始,所以总的脉冲数就是 (溢出总数-1)*2000+1000(最开始的1000)+ CNT(计数器内未达到2000的值),之所以用溢出总数-1是因为我们总的脉冲数里把最开始1000->2000的值加进去了,所以要减去1000->2000的一次溢出次数。
TIM4_Init(2000,3);在主函数内初始化TIM4时设置了ARR为2000。
  1. void Circle_Print()
  2. {      
  3.         AAA =Pulse_Num;
  4.         if (Interupt_Num ==0 )                        //CNT从1000开始,刚开始的时候计算脉冲的方法
  5.                 Pulse_Num = TIM4->CNT-1000 ;
  6.         else
  7.         {  
  8.                 Pulse_Num = 1000 + (Interupt_Num - 1) *2000 +TIM4->CNT ; //在第一圈完成之后,计算脉冲数多的方法
  9.         }


  10.         speed =(Pulse_Num-AAA);//每100ms转过的脉冲,近似看成速度了
  11.         Circle_NUm =  Pulse_Num/1560.0f                ;                 //所有人脉冲除以细分数就可以得到转的圈数(正负之分)
  12.         printf("Interupt_Num的值是:%ld--捕获到的总数是%ld*****转过的圈数是%f*****本次脉冲为%f\r\n" , Interupt_Num, Pulse_Num , Circle_NUm ,speed );
  13. }
复制代码

AAA是我设置用来计算速度的变量。在每次最开始调用Circle_Print()的时候我们首先把测过的总的脉冲数赋给变量AAA,此时AAA=0,,然后在Pulse_Num = 1000 + (Interupt_Num - 1) *2000 +TIM4->CNT ; //在第一圈完成之后,计算脉冲数多的方法这一句计算总的脉冲数,计算原理我们已经在上一条说过了。然后在这一句speed =(Pulse_Num-AAA);我们用至今为此总的脉冲数减去AAA即为每两次调用Circle_Print()的脉冲差,而我们在主函数中使用一个100ms的延时,所以时间差为100ms,脉冲反映小车路程,可以得到速度。
***硬件***
我使用的编码器(6线,分AB相,客服叫做13相?不太懂)转一圈是390个脉冲,使用四倍频,转一圈即为1560个脉冲。用总脉冲数除以1560即为至今为止转过的圈数。
小车直径为6.3cm(没找到参数,手动测量的0.0),  周长约为0.204m.
***下载验证***

b5298a9f75974715e273d8260bb0040f.png

可以看到,第一个返回总的溢出数,第二个为总圈数,第三个为速度。
因为在主函数中使用一个100ms的延时,每0.1秒转过的脉冲数为160左右,约为0.1圈,每秒转过1圈。

中断回调函数程序里有一句PB0!=PB0;而我的电机一IN1接的就是PB0,我改的时候忘记删掉了这句,然后我的第一个轮子(编码器接的第二个轮子)就一会转一会不转0.0

在文件中写入了函数之后要在头文件和主函数里添加初始化,否则不会识别。

TIM4_Init(2000,3);在主函数内初始化TIM4时设置了ARR为2000。

————————————————
版权声明:被大佬糊弄的只会点灯的小菜鸡
如有侵权请联系删除

收藏 评论0 发布时间:2023-3-26 19:05

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版