一、电源电压采集
由于直流有刷电机驱动板的电源电压远超 STM32 内部 ADC 所能采集的范围,并不能直接使用 ADC 进行电压采集,而是需要使用一些硬件电路对电源电压进行处理,使其减小到 ADC 采集范围。
1.原理图
① 电阻分压,利用三个电阻(R13、R17、R21)对电源电压 POWER 进行分压,可得 a点的电压 Va = POWER /(12+12+1);
② 电压跟随电路,其作用就是让 VBUS = Va,即 VBUS = POWER /(12+12+1)= POWER/25; 通过这两部分电路的处理,我们就可以直接使用 ADC 采集 VBUS 的电压,再根据公式:
POWER= 25 * VBUS,即可算出电源电压。
2、代码实现
代码实现:
1、ADC1的通道9(PB1)检测VBUS对应的ADC值,计算VBUS。
VBUS = ADC值 * 3.3 / 4096
2、根据VBUS计算POWER的电压, POWER = 25 * VBUS
即POWER= ADC值 * 3.3 / 4096 * 25
二、母线电流采集
1.原理图
由于 STM32 内部 ADC 并不能直接对电流进行采集,所以需要先把电流的信号转换为电压的信号。
我们在 H 桥的回路中串接一个 20mR 的采样电阻,这样就可以得到一个采样电压 I-V = 0.02R * 实际电流 I,但是这个采样电压太小了,直接用 ADC 进行采集的话偏差较大,我们需要对它进行差分放大。

差分放大倍数= 12 /(1+1)=6 倍,参考电压为 1.27V,由此可得输出电压 Iout(即 CURT 点的电压)=6 * 0.02R * 实际电流 I + 1.27V,我们只需要采集 Iout 的电压,再根据公式:实际电流 I=(输出电压 Iout-1.27)/0.12A,即可算出实际电流。
2.代码实现
代码实现:
1、通过ADC1的通道8(PB0)检测电机未启动时Iout的电压,作为参考电压Vref
2、检测电机允许启动后Iout的电压Vrun
3、计算实际电流I
I= (Vrun - 参考电压Vref ) / 0.12 A
三、控制器温度采集
1.原理图
我们采集的是驱动板的温度,同样需要用到 ADC 进行采集。

利用 NCP18XH103F03RB 热敏电阻对温度进行检测,该热敏电阻是负温度系数电阻,温度越高,其电阻值越低。温度采集电路的原理实现如下:
① 电阻分压,利用热敏电阻和 R35 电阻(4.7K)对 VCC3.3 进行分压,可得 a 点的电压Va = 4.7 * 3.3 V /(4.7 + 热敏电阻阻值 Rt);
② 电压跟随电路,其作用就是让 VTEMP = Va,即 VTEMP = 4.7 * 3.3 V /(4.7 + 热敏电阻阻值 Rt);
通过这两部分电路的处理,我们就可以直接使用 ADC 采集 VTEMP 的电压,再通过公式即可算出热敏电阻阻值 Rt。最后我们再根据厂家给出的公式,即可算出该阻值所对应的实际温度值,具体的换算公式将会在代码注释中介绍。
2.代码实现
代码实现:
1、通过ADC1的通道0(PA0)检测VTEMP ,算出Rt
Rt = 3.3 * 4700 / VTEMP – 4700
2、根据Rt算出实际温度值
Rt = Rp * exp( B* ( 1/T1 - 1/T2 ) )
四、电压、电流、温度滤波取平均值
它的功能就是把电压、温度以及电流采集通道的 ADC 值分别累计1000 次,然后取平均值(滤波),最后再把 ADC 平均值存入相应的数组元素中。

