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


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

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

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