一、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 测速流程

  1. 假设测速周期为200ms。
  2. 读取编码器在200ms内计数值的变化量。
  3. 以此推算出1分钟内的变化量为200ms内的变化量 * 5 * 60。
  4. 如果编码器同时对AB相计数,则使用1分钟变化量除4得到产生的脉冲数,而如果仅对A或B中一相进行计数,则使用1分钟变化量除2得到产生的脉冲数。
  5. 最后使用1分钟内的脉冲数除以分辨率得到转动圈数。
  6. 转动圈数除以减速比得到实际速度。

2.4 滤波

在实际使用过程中,直接使用编码器的脉冲计算速度并不稳定,需要对这些数据进行滤波得到更稳稳定的结果。

2.4.1 冒泡排序

int array[] = {9435670}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 时,滤波器对输入的变化不太敏感,输出会更加平滑,因为它更多地依赖于前一时刻的输出值。此时,滤波器的平滑效果较强。
  • 一阶低通滤波器常用于信号去噪、平滑数据或实现简单的预测。在数字信号处理、控制系统和时间序列分析中都有广泛的应用。
    在这里插入图片描述
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐