一、霍尔传感器与电机转动的本质关系
-
霍尔传感器工作原理:
-
3个霍尔元件呈120°分布,检测转子磁极位置
-
电机每旋转60°电角度,霍尔组合状态变化一次
-
完整电周期(360°电角度)产生6次状态变化
-
-
机械角度与电角度转换:
电角度 = 机械角度 × 极对数(P)
示例:4极电机(P=2),转1圈机械角度=360°,电角度=720°
3. 关键参数定义:
机械频率就是转速
二、速度计算公式的完整推导
设:
-
Δt
:两次霍尔变化的时间间隔(秒) -
P
:电机极对数(磁极数/2) -
f_m
:机械转速(转/秒)
推导过程:
-
每个
Δt
对应60°电角度 -
完整电周期(360°)时间:
T_e = 6 × Δt
-
机械转速:
f_m = 1/(P × T_e) = 1/(P × 6 × Δt)
-
RPM(转/分):
RPM = 60 × f_m = 60/(6PΔt) = 10/(PΔt)
最终公式:
RPM = 10 / (P × Δt) [Δt单位:秒]
三、STM32定时器的实现机制
1. 定时器配置关键点
// 高级定时器配置示例(TIM1)
TIM_HandleTypeDef htim1;
void ConfigureHallSensorTimer(void) {
// 时钟配置:72MHz主频
htim1.Instance = TIM1;
htim1.Init.Prescaler = 71; // 分频后1MHz (72MHz/(71+1))
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = 0xFFFF; // 最大计数值65535
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_Base_Init(&htim1);
// 霍尔传感器接口配置
TIM_HallSensor_InitTypeDef sHallConfig;
sHallConfig.IC1Polarity = TIM_ICPOLARITY_BOTHEDGE; // 双沿触发
sHallConfig.IC1Prescaler = TIM_ICPSC_DIV1;
sHallConfig.IC1Filter = 8; // 滤波系数
sHallConfig.CommutationDelayed = TIM_COMMUTATION_DELAY_NONE;
HAL_TIMEx_HallSensor_Init(&htim1, &sHallConfig);
// 启动捕获
HAL_TIMEx_HallSensor_Start_IT(&htim1);
}
2. 捕获中断处理流程
volatile uint32_t prev_capture = 0;
volatile uint32_t overflow_count = 0;
volatile float rpm = 0.0f;
// 捕获中断服务函数
void TIM1_CC_IRQHandler(void) {
if (__HAL_TIM_GET_FLAG(&htim1, TIM_FLAG_CC1)) {
uint32_t curr_capture = TIM1->CCR1;
// 计算时间差(考虑溢出)
uint32_t delta_count;
if (curr_capture >= prev_capture) {
delta_count = curr_capture - prev_capture;
} else {
// 计数器溢出处理
delta_count = (0xFFFF - prev_capture) + curr_capture + 1;
delta_count += overflow_count * 0x10000;
overflow_count = 0;
}
// 计算实际时间(秒)
float delta_t = delta_count / 1000000.0f; // 1MHz时钟=1us/count
// 速度计算(假设P=2极对数)
const uint8_t pole_pairs = 2;
rpm = 10.0f / (pole_pairs * delta_t);
prev_capture = curr_capture;
__HAL_TIM_CLEAR_IT(&htim1, TIM_IT_CC1);
}
}
// 溢出中断处理
void TIM1_UP_IRQHandler(void) {
if (__HAL_TIM_GET_FLAG(&htim1, TIM_FLAG_UPDATE)) {
overflow_count++;
__HAL_TIM_CLEAR_IT(&htim1, TIM_IT_UPDATE);
}
}
四、速度计算实例分析
假设场景:
-
4极电机(P=2)
-
定时器时钟:72MHz
-
预分频:71 → 计数频率1MHz
-
测得Δcount = 25,000
计算过程:
-
实际时间间隔:
Δt = 25,000 / 1,000,000 = 0.025秒
-
应用公式:
RPM = 10 / (P × Δt) = 10 / (2 × 0.025) = 10 / 0.05 = 200 RPM
公式物理意义:
-
分母
P × Δt
:每60°电角度所需时间 -
系数
10
:由60秒/分 ÷ 6个区间
推导而来 -
整体表示:每分钟能完成多少个60°电角度区间
五、实际应用中的关键问题处理
1. 低速测量优化:
// 使用溢出计数扩展量程
uint32_t total_count = (overflow_count * 65536) + delta_count;
float delta_t = total_count / 1000000.0f;
2. 噪声滤波技术:
-
硬件滤波:配置
IC1Filter=8
(约1μs滤波) -
软件滤波:
#define FILTER_SAMPLES 5
float rpm_buffer[FILTER_SAMPLES];
float filtered_rpm = 0;
// 在中断中更新
rpm_buffer[sample_index] = rpm;
sample_index = (sample_index + 1) % FILTER_SAMPLES;
// 主循环中计算平均值
for(int i=0; i<FILTER_SAMPLES; i++) {
filtered_rpm += rpm_buffer[i];
}
filtered_rpm /= FILTER_SAMPLES;
3. 动态范围处理:
// 根据速度动态调整预分频
void AdjustTimerPrescaler(float rpm) {
if(rpm > 5000) {
TIM1->PSC = 0; // 72MHz计数
} else if(rpm > 1000) {
TIM1->PSC = 35; // 2MHz计数
} else {
TIM1->PSC = 71; // 1MHz计数
}
HAL_TIM_GenerateEvent(&htim1, TIM_EVENTSOURCE_UPDATE);
}
六、霍尔安装偏差补偿
当霍尔传感器与理想位置存在角度偏差时:
// 偏差补偿公式
float compensated_rpm = rpm * (1 + calibration_factor);
// 校准过程示例
void HallCalibration(void) {
// 1. 锁定电机至已知位置
// 2. 读取霍尔状态
// 3. 计算偏差角度θ
// 4. 计算补偿因子:k = 60° / (60° - θ)
}
七、总结:从捕获值到速度的完整路径
通过理解霍尔状态变化与电机角位移的关系,掌握RPM=10/(P·Δt)
公式的物理意义,并配合STM32定时器的捕获功能,即可实现精确的电机转速测量。实际应用中需注意噪声滤波、溢出处理和安装偏差补偿等关键技术点。