3. 直流电机编码器测速与转速计算
正交编码器测速原理与M法实现
直流电机尾部安装增量式正交编码器,A、B两相输出相位差90°的方波。通过定时器编码器接口对A/B相边沿计数,可同时获得脉冲数与转向。本例采用M法(固定时间测频):在固定采样周期 Ts 内读取编码器计数值增量 ΔC,再换算为转速。
转速计算公式:
n (r/min) = ΔC × 60 / (N × Ts × 倍频系数)
其中 N 为编码器线数,倍频系数由计数方式决定(1×、2×、4×)。
n (r/min) = ΔC × 60 / (N × Ts × 倍频系数)
其中 N 为编码器线数,倍频系数由计数方式决定(1×、2×、4×)。
以常见参数为例:编码器 N = 500 线,四倍频计数,采样周期 Ts = 10 ms。则每个计数脉冲对应转速为:
分辨率 = 60 / (500 × 4 × 0.01) = 3 r/min / count
这意味着在10 ms采样周期下,转速读数只能以3 r/min为步进跳变。当电机实际转速低于约3 r/min时,ΔC可能为0或1,量化误差极大。若将采样周期延长至100 ms,分辨率提升至0.3 r/min,但动态响应变慢。采样周期与分辨率、低速量化误差之间存在直接权衡。
编码器接口配置与测速代码实现
以STM32定时器编码器模式为例,配置TIM3为编码器接口模式,PA6/PA7接编码器A/B相。关键配置如下:
// 编码器接口初始化(4倍频)
void Encoder_Init(void) {
// PA6=TIM3_CH1, PA7=TIM3_CH2, 复用推挽输入
GPIO_InitTypeDef gpio;
gpio.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
gpio.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入
GPIO_Init(GPIOA, &gpio);
TIM_TimeBaseInitTypeDef tim;
tim.TIM_Prescaler = 0;
tim.TIM_Period = 65535; // 16位计数器
tim.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &tim);
TIM_EncoderInterfaceConfig(TIM3,
TIM_EncoderMode_TI12, // A/B两相都计数 → 4倍频
TIM_ICPolarity_Rising,
TIM_ICPolarity_Rising);
TIM_SetCounter(TIM3, 0);
TIM_Cmd(TIM3, ENABLE);
}
测速函数在固定周期中断中调用,读取计数值并清零:
#define ENCODER_LINES 500
#define GEAR_RATIO 1
#define SAMPLE_MS 10
float Get_Speed_RPM(void) {
int16_t delta = (int16_t)TIM_GetCounter(TIM3);
TIM_SetCounter(TIM3, 0);
// 4倍频:每转脉冲数 = 500 × 4 = 2000
// n = delta × 60 / (2000 × 0.01) = delta × 3
float rpm = (float)delta * 60.0f
/ (ENCODER_LINES * 4.0f * (SAMPLE_MS / 1000.0f));
return rpm;
}
若需兼顾低速精度与动态响应,可采用变周期M法:高速时用短周期(如5 ms),低速时自动切换长周期(如50 ms),或改用T法(测周法)在低速段测量脉冲间隔时间。
测速验证与误差分析
验证方法:给定固定PWM占空比,用示波器测量编码器A相频率 f_A,理论转速为 n = f_A × 60 / N。将串口输出的M法计算值与理论值对比,观察低速段跳变情况。
| 实际转速 (r/min) | 10 ms内ΔC | M法计算值 (r/min) | 绝对误差 (r/min) |
|---|---|---|---|
| 1.5 | 0 或 1 | 0 或 3 | 1.5 |
| 4.5 | 1 或 2 | 3 或 6 | 1.5 |
| 30 | 10 | 30 | 0 |
| 300 | 100 | 300 | 0 |
低速时ΔC可能为0,导致转速显示为0而电机实际在缓慢转动。此时应增大采样周期或切换至T法测周。同时注意编码器计数器溢出问题:16位计数器在高速长周期下可能溢出,需使用32位扩展或缩短采样周期。