运动控制 编码器测速
文章目录
- 一、H桥驱动
- 1.1 电机启停
- 1.2 电机调速
- 二、编码器测速
- 2.1 脉冲计数
- 2.2 测速相关参数
- 2.3 测速流程
- 2.4 滤波
- 2.4.1 冒泡排序
- 2.4.2 一阶低通滤波
一、H桥驱动
本文采用电驱动板为正点原子的直流有刷电机驱动板,由两个半桥组成一个H桥。
1.1 电机启停
- 通过IO控制SD输入信号可以控制电机启动或者停止。
电机正反转:
- PWM_UH输入高电平,PWM_UL输入低电平,此时电流从M-流向M+,电机反转。
- PWM_UH输入低电平,PWM_UL输入高电平,此时电流从M+流向M-,电机正转。
- 注:IO反转周期不能低于死区时间。
1.2 电机调速
- 一个端口输出固定,另一个端口输出PWM。
- 通过硬件定时器的PWM互补输出可以实现电机速度控制和正反转。
- 互补PWM设置死区的意义主要在于提高系统的可靠性和稳定性,避免由于开关速度问题导致的设备损坏或性能下降。具体来说,互补PWM信号常用于驱动如电机等设备,其中一路PWM信号用于控制设备的正向运动,另一路PWM信号用于控制设备的反向运动。为了避免设备的两相同时工作,引入死区时间,即两路PWM信号之间的时间差。这样,在设备从正向运动切换到反向运动时,可以确保两路PWM信号之间有足够的时间间隔,从而防止因开关速度不匹配导致的短路或其他损坏情况。
二、编码器测速
2.1 脉冲计数
使用STM32高级定时器的编码器模式对编码器输出的脉冲进行计数,定时器可以根据配置的工作模式对边沿进行计数。
2.2 测速相关参数
- 分辨率
- 供电电压
- 电机减速比
2.3 测速流程
- 假设测速周期为200ms。
- 读取编码器在200ms内计数值的变化量。
- 以此推算出1分钟内的变化量为200ms内的变化量 * 5 * 60。
- 如果编码器同时对AB相计数,则使用1分钟变化量除4得到产生的脉冲数,而如果仅对A或B中一相进行计数,则使用1分钟变化量除2得到产生的脉冲数。
- 最后使用1分钟内的脉冲数除以分辨率得到转动圈数。
- 转动圈数除以减速比得到实际速度。
2.4 滤波
在实际使用过程中,直接使用编码器的脉冲计算速度并不稳定,需要对这些数据进行滤波得到更稳稳定的结果。
2.4.1 冒泡排序
int array[] = {9,4,3,5,6,7, 0};void swap(int *xp, int *yp)
{ int temp = *xp; *xp = *yp; *yp = temp;
} void bubbleSort(int arr[], int n)
{ for (int i = 0; i < n-1; i++) {for (int j = 0; j < n-i-1; j++) { if (arr[j] > arr[j+1]) { swap(&arr[j], &arr[j+1]); } } }
}
使用冒泡排序将数据从小到大排列,并去掉最大最小值求出平均值,得到一个稳定的输出。
2.4.2 一阶低通滤波
Y(n) = q * X(n) + (1-q) * Y(n-1)
- Y(n) 是当前时刻的输出值。
- X(n) 是当前时刻的输入值。
- Y(n−1) 是前一时刻的输出值。
- q 是一个介于 0 和 1 之间的常数,它决定了滤波器对输入变化的响应速度和平滑程度。
- 当 q 接近 1 时,滤波器对输入的变化非常敏感,输出会紧密跟随输入的变化。此时,滤波器的平滑效果较弱。
- 当 q 接近 0 时,滤波器对输入的变化不太敏感,输出会更加平滑,因为它更多地依赖于前一时刻的输出值。此时,滤波器的平滑效果较强。
- 一阶低通滤波器常用于信号去噪、平滑数据或实现简单的预测。在数字信号处理、控制系统和时间序列分析中都有广泛的应用。