📖 第 23 章:无刷电机电压温度电流采集(Voltage/Temperature/Current Sampling)

⚙️ 正点原子《DMF407 电机控制专题教程》V1.0 · Chapter 23
🗨️ 本章金句:「换相看霍尔,健康看采样:电压、温度、电流是电机的体检三件套。」
这一章在干嘛? 无刷驱动板自带一套「体检」电路:母线电压、板载温度、三相电流。本章分析采集电路原理并实现 ADC 采集——闭环控制(第 24 章)的电流反馈就来自这里。
23.1 三相电流采集:先变电压再放大23.2 母线电压与温度采集23.3 程序设计:五通道 DMA 与基准校准23.4 下载验证

23.1 三相电流采集:先变电压再放大

每相串一个 20mΩ 采样电阻,流过电流 I 产生压降 $V = I \times 0.02\Omega$——10A 才 0.2V,太小不利 ADC 采集。后接差分放大电路,放大 6 倍(12K/(1K+1K))并抬升基准:

原书图 23.1.1.1
原书图 23.1.1.1:U 相电流采集电路
原书图 23.1.1.2
原书图 23.1.1.2:差分放大电路
$$AMP\_IU = 6 \times (0.02 \times I) + 1.25\,\text{V}$$
与有刷板(第 6 章)的差别: 有刷板抬升 1.27V、单向采集;无刷板抬升 1.25V、三相各一路。思路一致:小电压放大 + 直流偏置抬到 ADC 量程内。

23.2 母线电压与温度采集

电压: 母线经 12K+12K+1K 分压后进电压跟随器,$V_{BUS} = POWER \times 1K/(25K)$,即分压比 25:1,ADC 读到 VBUS 乘回去就是电源电压。

原书图 23.1.2.1
原书图 23.1.2.1:电源电压采集电路

温度: NTC(NCP18XH103,B 值 3380、标称 10K)与 4.7K 电阻分压,由分压公式反解出 NTC 阻值,再按数据手册公式换算温度:

原书图 23.1.3.1
原书图 23.1.3.1:温度采集电路
$$R_t = \frac{3.3 \times 4700}{V_{TEMP}} - 4700\ ,\qquad T_1 = \frac{1}{\ln(R_t/R_p)/B + 1/T_2}$$

T2 = 273.15 + 25(开尔文),算出的 T1 也是开尔文,减 273.15 转摄氏度。

float get_temp(uint16_t para)     /* para: 温度通道滤波后的 ADC 值 */
{
    /* 第一步:反解 NTC 阻值 Rt */
    Rt = 3.3f * 4700.0f / (para * 3.3f / 4096.0f) - 4700.0f;
    /* 第二步:由 Rt = Rp*exp(B*(1/T1-1/T2)) 反解出 T1 */
    temp = Rt / Rp;           /* exp(B*(1/T1-1/T2)) */
    temp = log(temp);         /* B*(1/T1-1/T2) */
    temp /= Bx;               /* 1/T1-1/T2 */
    temp += (1.0f / T2);      /* 1/T1 */
    temp = 1.0f / (temp);     /* T1(开尔文) */
    temp -= Ka;               /* 减 273.15 转摄氏度 */
    return temp;
}

23.3 程序设计:五通道 DMA 与基准校准

ADC1 五通道(12 位、扫描+连续、软件触发)由 DMA2_Stream4 循环搬运到数组,每通道采 50 次求平均(约 2.6ms 一轮):

通道引脚采集对象
ADC1_CH9PB1母线电压
ADC1_CH0PA0温度
ADC1_CH8PB0U 相电流
ADC1_CH6PA6V 相电流
ADC1_CH3PA3W 相电流

基准校准的巧思: 放大电路自带 1.25V 抬升且上电即有基准,直接减 1.25V 不准确。程序在电机停转时把三相 ADC 值累加取平均存为基准;运行时「旋转采样 − 基准」才是实际相电压。

/* 电机停转时(TIM6 中断)采集三相基准并滤波 */
adc_amp_offset[0][adc_amp_offset_p] = g_adc_val[2];   /* U 相基准 */
adc_amp_offset[1][adc_amp_offset_p] = g_adc_val[3];   /* V 相基准 */
adc_amp_offset[2][adc_amp_offset_p] = g_adc_val[4];   /* W 相基准 */
/* 运行时:实际值 = 旋转采样 - 基准 */
adc_amp[i] = adc_val_m1[i] - adc_amp_offset[i][ADC_AMP_OFFSET_TIMES];
/* 母线电流 = 两个有开关动作的相电流之和 */
if (g_bldc_motor1.step_sta == 0x05)
    adc_amp_bus = (adc_amp_un[0] + adc_amp_un[1]) * ADC2CURT;  /* UV 导通 */
换算宏: ADC2CURT = 3.3/4.096/0.12(对应 6 倍放大 × 0.02Ω 采样);ADC2VBUS = 3.3×25/4096(25:1 分压)。母线电流按霍尔状态选导通相:0x05→UV、0x01→UW、0x03→VW、0x02→UV、0x06→WU、0x04→WV。显示用一阶低通滤波。

23.4 下载验证

接线与第 22 章基础驱动完全一致(JP3 跳帽短接 H&Z 与 HALL),仅多 5 个模拟采集引脚。按键同前:KEY0 加速 +500、KEY1 减速 −500、KEY2 停机。验证现象:LCD 与串口实时显示 Power(母线电压)、Temp(板温)、U/V/W 相电流及母线电流(停机时电流清零),占空比越大电流越大——这份「体检报告」下一章就要喂给电流环。

🧠 小测验
1. 相电流采集为什么要加差分放大电路?放大倍数与输出公式是什么?
20mΩ 采样电阻上的电压太小(10A 仅 0.2V),直接采 ADC 精度差;经差分放大 6 倍(12K/(1K+1K))并抬升 1.25V,输出 AMP_IU = 6×(0.02×I) + 1.25V。
2. 为什么不能直接减 1.25V 来还原电流?程序如何处理?
驱动板上电自带基准且存在失调,直接减固定值不准;程序在电机停转时采集三相 ADC 取平均作为实时基准,运行时用「旋转采样 − 基准」得实际相电压。
3. 写出 NTC 测温的两步公式。
先由分压求阻值 $R_t = 3.3 \times 4700 / V_{TEMP} - 4700$,再代入 $R_t = R_p e^{B(1/T_1 - 1/T_2)}$ 反解 $T_1 = 1/(\ln(R_t/R_p)/B + 1/T_2)$(开尔文),减 273.15 得摄氏度;本板 Rp=10K、B=3380。
← 上一篇🏠 顶层目录下一篇 →