stm32f103c8t6
原理
小的旋转编码器和平时用的带编码器的电机都是一样的
编码器A相/B相/AB相产生的脉冲,作为时基单元的输入,去驱动时基单元的计数器CNT
cubemx配置
我比较喜欢用A/B向来计数,所以选择了模式1
配置时基单元
时基单元的时钟是编码器来提供的,PSC就是编码器的分频系数,PSC=0,拧一次cnt+1,为1时,宁两次才+1,ARR是周期,如果设置为10,就是cnt=10之后清空,我想设置为100
我们以A相为例:
极性:选择上升沿(只需要设置这个)
选择输入信号的来源
分频:这个信号输入后分频与否
输入滤波器
代码
main.c
HAL_TIM_Encoder_Start(&htim2,TIM_CHANNEL_1);
HAL_TIM_Encoder_Start(&htim2,TIM_CHANNEL_2);
int32_t cnt=0;
uint8_t dir;
float rotations=0;
float distance=0;
int32_t cnt_last=0;
float speed_w=0;
float speed_v=0;
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
//转向
dir=__HAL_TIM_IS_TIM_COUNTING_DOWN(&htim2);
//脉冲计数
cnt=(int32_t)__HAL_TIM_GET_COUNTER(&htim2);
//转的圈数 脉冲数/分频数*减速比*编码器线数PRR
rotations=(float)cnt/(2*30*13);
//转过的距离 圈数*周长pai*d
distance=rotations*3.1415926*0.065;
//角速度 (此刻的计数值-10ms前的计数值)/...得到转数,转数/10ms*1s*60,得到每分钟的转数 rpm
speed_w=(float)(cnt-cnt_last)/(2*30*13)* 1000/10*60;
//线速度 v=w*pai*d m/s
speed_v=speed_w/60*3.1415926*0.065;
//printf("cnt:%d dir:%d rot:%.2f dis:%.2f\r\n",cnt,dir,rotations,distance);
printf("w:%.2f,v:%.2f\n\r",speed_w,speed_v);
HAL_Delay(10);
cnt_last=cnt;
}