在电机控制系统中,转速测量如同汽车仪表盘上的速度计,是闭环控制的基础。而霍尔传感器作为最常见的非接触式转速检测元件,其输出的方波信号背后隐藏着电机转动的精确信息。本文将深入探讨如何利用STM32等MCU的定时器输入捕获功能,从三相双极性霍尔传感器的开关信号中提取出精准的转速数据,并通过软件滤波算法消除噪声干扰,最终得到平滑可靠的转速曲线。
三相双极性霍尔传感器通常由三个独立的霍尔元件组成,在电机内部呈120度机械角度分布。这种传感器具有以下关键特性:
当电机旋转时,每个霍尔元件会输出类似下图所示的方波信号:
code复制H1: __|‾‾|__|‾‾|__|‾‾|__
H2: _|‾‾|__|‾‾|__|‾‾|__|
H3: |‾‾|__|‾‾|__|‾‾|__|‾
在STM32中配置定时器进行霍尔信号捕获时,需要注意以下关键参数:
| 参数项 | 推荐配置 | 说明 |
|---|---|---|
| 定时器时钟 | 最高可用频率(如200MHz) | 提高时间测量分辨率 |
| 输入滤波器 | 4-8个时钟周期 | 抑制信号抖动 |
| 捕获极性 | 上升沿和下降沿 | 双极性霍尔需要捕获两种边沿 |
| 中断优先级 | 高于PWM生成中断 | 确保速度测量实时性 |
提示:使用定时器的从模式设置为"复位模式",可以在每个霍尔边沿自动复位计数器,简化周期测量逻辑。
转速计算的核心是测量两个相同极性边沿之间的时间间隔。对于极对数为P的电机:
c复制// 示例代码:转速计算函数
float calculate_rpm(uint32_t t1, uint32_t t2, uint8_t pole_pairs) {
float delta_theta = 360.0f / pole_pairs; // 机械角度变化
float time_diff = (t2 - t1) / (float)TIMER_CLOCK; // 转换为秒
return (delta_theta * 60) / (360 * time_diff); // RPM
}
在实际应用中,转速测量会面临多种误差源:
针对这些误差,可采用以下补偿策略:
滑动平均是最简单有效的滤波方法之一。针对转速测量特点,可做以下优化:
c复制#define FILTER_WINDOW 8
typedef struct {
float buffer[FILTER_WINDOW];
uint8_t index;
float sum;
} MovingAverage;
float update_moving_average(MovingAverage *filter, float new_value) {
filter->sum -= filter->buffer[filter->index];
filter->buffer[filter->index] = new_value;
filter->sum += new_value;
filter->index = (filter->index + 1) % FILTER_WINDOW;
return filter->sum / FILTER_WINDOW;
}
这种实现方式避免了每次重新计算总和,显著提高了计算效率。
对于高动态性能要求的场合,卡尔曼滤波能更好地处理测量噪声和系统动态特性。简化的单维卡尔曼滤波实现如下:
c复制typedef struct {
float q; // 过程噪声协方差
float r; // 测量噪声协方差
float x; // 估计值
float p; // 估计误差协方差
float k; // 卡尔曼增益
} KalmanFilter;
float update_kalman(KalmanFilter *kf, float measurement) {
// 预测步骤
kf->p = kf->p + kf->q;
// 更新步骤
kf->k = kf->p / (kf->p + kf->r);
kf->x = kf->x + kf->k * (measurement - kf->x);
kf->p = (1 - kf->k) * kf->p;
return kf->x;
}
下表比较了不同滤波算法在转速测量中的表现:
| 算法类型 | 响应速度 | 计算复杂度 | 抗噪性能 | 适用场景 |
|---|---|---|---|---|
| 滑动平均 | 慢 | 低 | 中等 | 低速稳定运行 |
| 指数加权平均 | 中等 | 低 | 中等 | 一般转速范围 |
| 卡尔曼滤波 | 快 | 高 | 优秀 | 高动态性能要求 |
| 中值滤波 | 中等 | 中等 | 良好 | 存在脉冲噪声的环境 |
当电机转速低于100RPM时,常规测量方法会面临两个主要问题:
解决低速测量问题的有效方法包括:
在实际运行中,霍尔信号可能因以下原因暂时丢失:
稳健的系统应实现以下保护机制:
c复制// 信号丢失检测示例
#define MAX_MISSING_PULSES 3
uint8_t missing_pulse_count = 0;
void handle_hall_signal(void) {
missing_pulse_count = 0;
// 正常处理信号...
}
void check_timeout(void) {
if(++missing_pulse_count > MAX_MISSING_PULSES) {
enter_safe_mode();
}
}
在需要同时测量多个电机转速的系统中,可采用以下优化策略:
在调试过程中,发现滤波算法的参数需要根据具体电机特性进行调整。例如,大惯量电机可以接受更强的滤波,而小惯量电机则需要更快的响应速度。实际项目中,建议先记录原始数据,再离线分析确定最佳滤波参数。