在工业电机控制系统中,转速测量是实现闭环控制的基础环节。作为一名长期从事电机控制开发的工程师,我经常使用TI的TMS320C24x系列DSP来实现高精度的转速测量。这个系列芯片内置的捕获单元和定时器硬件,配合霍尔效应传感器,可以构建出性价比极高的转速测量方案。
这种测量方法的本质是通过计算传感器脉冲的周期来反推转速。当电机旋转时,固定在转轴上的齿轮会触发霍尔传感器产生方波信号。DSP捕获单元记录每个脉冲边沿的时刻,通过计算相邻脉冲的时间差(周期),再结合齿轮齿数等参数,就能准确计算出当前转速。听起来简单,但实际应用中需要考虑时钟分频、测量范围、数值处理等一系列工程细节。
典型的测量系统由三个主要部分组成:
转速传感器:最常用的是霍尔效应齿轮传感器,当齿轮齿通过传感器时会产生脉冲信号。一个25齿的齿轮意味着每转会产生25个脉冲,这直接决定了测量的分辨率。
信号调理电路:虽然霍尔传感器输出已经是数字信号,但通常仍需经过施密特触发器整形,确保边沿陡峭,避免误触发。
DSP捕获单元:TMS320C24x的捕获单元可以配置为在脉冲的上升沿或下降沿捕获定时器的当前值。我通常选择上升沿触发,因为信号从低到高的跳变更干净。
提示:在实际布线时,传感器信号线要采用双绞线并做好屏蔽,长距离传输时考虑加入RC滤波,避免电磁干扰导致误触发。
转速计算基于一个基本物理关系:角速度ω等于角度变化Δθ除以时间变化Δt。对于n齿的齿轮:
ω = Δθ/Δt = (2π/n)/Δt = 2π/(n·Δt)
其中Δt是通过捕获单元测量的相邻脉冲时间差。这个Δt实际上是通过计算两个捕获时刻的定时器计数值差值得出的:
Δt = Δcount × TCLK × KP
这里:
因此,最终的转速公式为:
ω = 2π/(n × Δcount × TCLK × KP)
在实际工程中,我们更常用RPM(转/分钟)作为单位,因此公式转换为:
RPM = 60/(n × Δcount × TCLK × KP)
TMS320C24x的定时器配置直接影响测量范围和精度。以下是我的经验配置:
c复制// 定时器1配置示例
T1PR = 0xFFFF; // 周期寄存器设为最大值
T1CONbits.TPS = 3; // 预分频KP=32 (20MHz/32=625kHz)
T1CONbits.TMODE = 0; // 连续增计数模式
T1CONbits.TENABLE = 1; // 使能定时器
关键参数选择原则:
系统可测量的最大转速由以下公式决定:
Nmax = 60/(n × 1 × TCLK × KP)
这里Δcount=1对应最高转速。例如对于n=25,TCLK=50ns,KP=32的系统:
Nmax = 60/(25×50×10^-9×32) ≈ 1,500,000 RPM
这显然远超过实际电机转速,因此我们需要考虑如何优化数值处理,在目标转速范围内获得最佳精度。
参数:
选择归一化基速23,438 RPM(这个特殊值是为了后续位操作优化),对应的缩放因子为64(1,500,000/23,438≈64)。
关键计算步骤:
在这种配置下,当电机运行在23,000 RPM时,Δcount≈65,这为高速测量提供了足够的计数变化空间。
保持其他参数不变,仅调整归一化基速为5,859 RPM,此时缩放因子变为256(1,500,000/5,859≈256)。
计算流程:
此时5,500 RPM对应的Δcount≈273,确保了中速区的测量精度。
调整参数:
特点:
定点DSP中使用Q格式表示小数是关键技巧。选择原则:
例如案例1中:
转速计算的核心是倒数运算(1/Δcount)。在定点DSP中,这通常通过SUBC(条件减)指令实现的除法来完成。以下是优化后的代码结构:
assembly复制; 输入:event_period = Δcount (16位)
; 输出:speed_hi:speed_lo = 1/Δcount (32位Q31)
LACC #07FFFh ; 被除数高16位=0x7FFF (Q31)
RPT #15 ; 重复16次
SUBC event_period ; 条件减除法
SACL speed_hi ; 存储商高16位
XOR speed_hi ; 清零ACC
OR #0FFFFh ; 被除数低16位=0xFFFF
RPT #15
SUBC event_period
SACL speed_lo ; 商低16位
结合案例1的完整实现:
assembly复制SPEED_SCALER_ .set 64
RPM_MAX_ .set 23438
; 初始化
LDP #speed_var
SPLK #SPEED_SCALER_, speed_scaler
SPLK #RPM_MAX_, rpm_max
; 1. 计算1/period (32位Q31)
; ...(上述除法代码)...
; 2. 转换为Q21格式
RPT #5
SFL ; 左移5位 (Q31→Q36)
SACH speed_prd_max ; 取高16位 (Q36→Q20)
SPM 0 ; 乘积模式复位
; 3. 应用缩放因子
LT speed_prd_max ; Q20
MPY speed_scaler ; Q0
PAC ; Q20
RPT #2
SFL ; Q20→Q22
SACH speed_prd,7 ; 存储Q15
; 4. 计算实际RPM
LT speed_prd ; Q15
MPY rpm_max ; Q0
PAC
SACH speed_rpm,1 ; Q0结果
当转速很低时,Δcount可能跨越定时器溢出点(0xFFFF→0x0000)。必须特殊处理:
c复制if (time_stamp_new < time_stamp_old) {
delta = 0x10000 + time_stamp_new - time_stamp_old;
} else {
delta = time_stamp_new - time_stamp_old;
}
在实际系统中,由于机械振动、电磁干扰等因素,脉冲周期可能会有抖动。我常用的处理方法:
c复制#define FILTER_LEN 8
static uint16_t history[FILTER_LEN];
static uint8_t index = 0;
history[index++] = delta_count;
if (index >= FILTER_LEN) index = 0;
uint32_t sum = 0;
for (int i=0; i<FILTER_LEN; i++) {
sum += history[i];
}
delta_count = sum / FILTER_LEN;
中值滤波:对于异常值较多的场景更有效
数字低通滤波:一阶IIR滤波器,计算量小
c复制delta_count = alpha * new_delta + (1-alpha) * old_delta;
当转速极低时,两个脉冲间隔可能超过定时器最大周期(KP×65,535×TCLK)。解决方案:
对于宽转速范围应用(如1:1000),单一参数难以兼顾高低速。我的实践经验:
以案例1代码为例,关键操作耗时:
测试条件:n=25,KP=32,TCLK=50ns
| 理论RPM | 实测RPM | 误差(%) |
|---|---|---|
| 1000 | 1002 | +0.2 |
| 5000 | 4993 | -0.14 |
| 10000 | 10007 | +0.07 |
| 20000 | 19988 | -0.06 |
在电机控制实践中,这种测量方法已经能够满足绝大多数应用场景的需求。通过合理选择系统参数和优化算法,可以在不增加硬件成本的情况下实现0.1%级的测量精度。