信号链路——从采样电阻到电流数值

📅 2026/6/30 1:53:41
信号链路——从采样电阻到电流数值
核心问题三相电流从电机相线流出来经过采样电阻、运放、ADC最后变成代码里的i_fb——这条路每一步做了什么怎么推导换算系数我的板子参数Rshunt1mΩ,Gain50,V_bias1.5V,Vs3.3V1.为什么需要偏置电压先回答一个根本问题为什么不能把采样电阻上的电压直接送ADC因为ADC的输入范围是0~Vs这里Vs3.3V不能接受负电压。但电机的相电流是正弦交流信号——每个电周期里电流自然地在正负之间交替。采样电阻上的电压V_shuntI×Rshunt自然也有正有负。I0→V_shunt0→ADC能读þI0→V_shunt0→ADC能读0VþI0→V_shunt0→ADC不能读Q解法在运放端叠加一个直流偏置电压V_bias。运放输出V_opampV_shunt×GainV_biasV_bias把整个信号向上平移。零电流时运放输出不是0V而是V_bias。电流为正时V_opamp从V_bias向上摆电流为负时从V_bias向下摆——只要摆幅不超过0~VsADC就能完整读到正负电流。这就是偏置的核心作用把双极性信号映射到单极性ADC的输入范围内。2.正向推导从电流到ADC数值完整链路I→V_shuntI×Rshunt→V_opampV_shunt×GainV_bias→ADC_codeV_opamp/Vs×40952.1第一步采样电阻V_shuntI×RshuntRshunt1mΩ相电流每变化1AV_shunt变化1mVmV级的电压太小STM32G4的ADC分辨率是3.3V/4095≈0.8mV/bit——勉强能分辨但精度很差。必须放大。2.2第二步运放放大偏置V_opampV_shunt×GainV_bias代入我的参数Gain50,V_bias1.5VV_bias1.5V来自一个独立的3.0V基准源经电阻分压得到。没有直接从3.3V分压因为MCU的3.3V供电线上混着数字噪声几十mV级别引入V_bias会让零电流点跟着抖。独立的低噪声基准源能保证零电流点稳定。V_opampI×0.001×501.5I×0.051.52.3第三步ADC量化ADC把模拟电压除以Vs乘以分辨率得到数字量ADC_codeV_opamp/Vs×4095代入V_opampI×0.051.5、Vs3.3VADC_code(I×0.051.5)/3.3×4095电流IV_opamp计算过程ADC_code10A2.0V2.0/3.3×409524825A1.75V1.75/3.3×409521720A1.5V1.5/3.3×40951861理论值−5A1.25V1.25/3.3×40951551−10A1.0V1.0/3.3×409512413.反向推导从ADC数值到电流ADC中断里读到的是整数ADC_code要还原成电流。从正向公式反推正向ADC_code(I×0.051.5)/3.3×4095第一步两边同时除以4095、乘以Vs还原V_opampV_opampADC_code/4095×Vs第二步减去偏置V_bias还原放大的信号V_signalV_opamp-V_biasADC_code/4095×Vs-V_bias第三步除以Gain和Rshunt还原电流IV_signal/(Rshunt×Gain)(ADC_code/4095×Vs-V_bias)/(Rshunt×Gain)代入参数验算ADC_code2172对应5AI(2172/4095×3.3-1.5)/(0.001×50)(1.75-1.5)/0.050.25/0.055.0A4.代码实现公式直接翻译成C代码c//完整公式——每次计算floatcurrent(adc_value/4095.0f*VREF-VBIAS)/(RSHUNT*GAIN);但每次都做两次除法和两次乘法太慢。工程上预计算一个系数//预计算系数——编译时算好//ampere_per_countVs/(4095×Rshunt×Gain)//3.3/(4095×0.001×50)//≈0.01612A/count#defineAMPERE_PER_COUNT(3.3f/(4095.0f*0.001f*50.0f))//零电流对应的ADC读数理论值//zero_codeV_bias/Vs×40951.5/3.3×4095≈1861//注意这是从V_bias算出的理论值。//实际零电流读数会有偏差运放、电阻精度//需通过ADC偏置校准实测得到#defineZERO_CURRENT_CODE(1861)//→实际使用前务必校准//运行时——一次减法一次乘法floatcurrent(adc_value-ZERO_CURRENT_CODE)*AMPERE_PER_COUNT;验算ADC_code减偏置乘系数电流24822482−1861621621×0.0161210.0A21722172−1861311311×0.016125.01A18611861−186100×0.016120A15511551−1861−310−310×0.01612−5.00A12411241−1861−620−620×0.01612−9.99A误差来自系数截断在±0.2%以内不影响控制精度。5.几个值得注意的点这块板子偏置电压不是Vs/2Vs/21.65V能使零电流居中正负电流对称。我的板子V_bias1.5V略低于1.65V——这不影响功能只是正负方向的最大可测电流范围不对称了零电流理论值在1861而不是2048正向余量4095−18612234counts→2234×0.0161236A负向余量1861−01861counts→1861×0.01612−30A正向能测到36A负向能测到−30A——对于±10A的工况绰绰有余。关于ZERO_CURRENT_CODE的取值上面用了1861。这是从V_bias1.5V推出来的理论值用于推导和验算没问题。但实际板子上的零电流ADC读数不会是精确的1861——运放、电阻精度、走线差异都会产生偏差。所以实际代码里的ZERO_CURRENT_CODE应该通过ADC偏置校准来获得。