这一章在干嘛?
无刷驱动板自带一套「体检」电路:母线电压、板载温度、三相电流。本章分析采集电路原理并实现 ADC 采集——闭环控制(第 24 章)的电流反馈就来自这里。
23.1 三相电流采集:先变电压再放大
每相串一个 20mΩ 采样电阻,流过电流 I 产生压降 ——10A 才 0.2V,太小不利 ADC 采集。后接差分放大电路,放大 6 倍(12K/(1K+1K))并抬升基准:
原书图 23.1.1.1:U 相电流采集电路
原书图 23.1.1.2:差分放大电路
与有刷板(第 6 章)的差别:
有刷板抬升 1.27V、单向采集;无刷板抬升 1.25V、三相各一路。思路一致:小电压放大 + 直流偏置抬到 ADC 量程内。
23.2 母线电压与温度采集
电压: 母线经 12K+12K+1K 分压后进电压跟随器,,即分压比 25:1,ADC 读到 VBUS 乘回去就是电源电压。
原书图 23.1.2.1:电源电压采集电路
温度: NTC(NCP18XH103,B 值 3380、标称 10K)与 4.7K 电阻分压,由分压公式反解出 NTC 阻值,再按数据手册公式换算温度:
原书图 23.1.3.1:温度采集电路
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_CH9 | PB1 | 母线电压 |
| ADC1_CH0 | PA0 | 温度 |
| ADC1_CH8 | PB0 | U 相电流 |
| ADC1_CH6 | PA6 | V 相电流 |
| ADC1_CH3 | PA3 | W 相电流 |
基准校准的巧思: 放大电路自带 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 测温的两步公式。
先由分压求阻值 ,再代入 反解 (开尔文),减 273.15 得摄氏度;本板 Rp=10K、B=3380。