1,040
社区成员




这是我参加朝闻道知识分享大赛的第三篇文章
目录
本期将为大家介绍怎么如果编码器进行计数值变化以及测量计算转速从而达到良好得速度闭环控制效果。
1.什么是编码器
旋转编码器,也称为轴编码器,是一种将轴或轴的角度位置或运动转换为模拟或数字输出信号的机电设备。
旋转编码器广泛用于需要监视或控制机械系统(或两者兼而有之)的应用,包括工业控制、机器人、摄影镜头、计算机输入设备(如光学机械鼠标和轨迹球)、受控应力流变仪和旋转雷达平台。
2.正交编码器两路的脉冲输出,在判断电机的正反转时,是更加A、B两相的波形来的,其实就是看哪路波形超前,这里用32的定时器编码器功能就只需要去查计数器的方向位来判断电机的正反转。
3.(1)脉冲计数法,直接根据单位时间内所采集到的脉冲数作为电机的转速
编码器在实际的测数使用时确实是根据,电机转一圈:编码器转多少圈的方式来实际测量电机的转速的,但是在其本质就还是编码器的输出的脉冲数,所以直接计算编码器的单位时间的脉冲数推算电机的速度是一样的,数据来的比较直接、精准。
4.编码器速度的读取
前面已经说过了编码器的脉冲计数对应电机速度的数据处理方法,这里就继续说明了。
速度是单位时间为前提的,我这里采用的是直接计算单位时间对应的脉冲数来推算电机的速度的。这里的单位时间也就是采样率的意思,就是我们间隔多少时间去采集然后清零脉冲计数值一次。这里的采样率不能太高,也不能太低。对电机的控制,一般采样率=5毫秒越小就越接近瞬时速度,
设置定时器2和定时器4为编码器模式
编码器代码:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim == &htim1)//500HZ 2ms中断一次,用于电机编码器以及pid控制
{
TimerCount++;
if(TimerCount %5 == 0)//10ms 执行一次
{
Encode1Count = (short)__HAL_TIM_GET_COUNTER(&htim4);
Encode2Count = (short)__HAL_TIM_GET_COUNTER(&htim2);
__HAL_TIM_SET_COUNTER(&htim4,0);//将定时器1计数清零
__HAL_TIM_SET_COUNTER(&htim2,0);//将定时器2计数清零
//获得单编码器计数值变化量
Speed1 = (float)Encode1Count*100/9.6/11/4/2.5;
Speed2 = (float)Encode2Count*100/9.6/11/4/2.5;
}
// if(TimerCount %10 == 0)//20ms 执行一次
// {
//// Motor_SetDIANPING(20,20);
// Mileage += 0.02*Speed1*14;
//// Motor_Set(PID_realize(&pidMotor1Speed, Motor1Speed),PID_realize(&pidMotor2Speed, Motor2Speed));
//// Motor_SetDIANPING(PID_realize(&pidMotor1Speed, Motor1Speed),PID_realize(&pidMotor2Speed, Motor2Speed));
// Motor_SetPWM(PID_realize(&pidMotor1Speed, Speed1),PID_realize(&pidMotor2Speed, Speed2));
// TimerCount=0;
// }
}
if(htim == &htim3)
{
upCount++;
}
}
主函数调用代码:
HAL_TIM_Encoder_Start(&htim2,TIM_CHANNEL_ALL);//开启定时器2(编码器)
HAL_TIM_Encoder_Start(&htim4,TIM_CHANNEL_ALL);//开启定时4(编码器)
通过此代码打开编码器通道。