开一个新系列,总结数学在电路中的运用
找不出数学关系式,我们的代码无从下手
后台回复电路获取相关文档
原理概述
根据分压定理 U_i = R_i / (R+R_i) * U,
只要测量出上图“Res_ADC”的电压,由于参考电压VREF、电阻R已知,电阻R_i也就可以计算出。
电路分析
分压后,信号经过电压跟随器,转化为Res_ADC,该信号直接给到ADC,因而V_Res与ADC转换值成线性关系。
VREF由基准源提供,温漂系数好,但仍有压差,故电压是未知的。
令模拟多选一器件选中“S1”,即可求得VREF。此时令U3选中待测电阻,根据ADC读值,求出待测电阻阻值。
约定部分参数的名称
ADC读值与待测电阻的关系
假定ADG658的导通阻抗皆为 r,则:
待测电阻的关系式
Val 是ADC的读值,R 是参考电阻。
分式函数形式
分式函数的图形如下:
当然,公式11、12的定义域只有上图的一部分
ADC读值越大,表示待测电阻分压越多,也即电阻越大
定义基本的
const float refResis[4] = {__REF_1K, __REF_47K, __REF_100K, __REF_499K};
const uint8_t refChannel[] = {CH_AFTER_1K, CH_AFTER_47K, CH_AFTER_100K, CH_AFTER_499K};
电阻测量算法
最机械的方式如下:
/**
* @channel:待测电阻的通道号,0~3
* @front_resis:电阻挡位,0~3
*/
uint32_t drive_resis_read(uint8_t channel, uint8_t front_resis)
{
uint32_t resis;
uint32_t ref, temp;
float r_float;
drive_io_channel_cfg(channel, front_resis);
__DELAY_MS(200);
drive_ads1259_read(&resis, 1);
drive_io_channel_cfg(refChannel[front_resis], front_resis);
__DELAY_MS(200);
drive_ads1259_read(&ref, 1);
/* 计算电阻值 */
temp = (ref << 1) - resis;
// r_float = refResis[front_resis] / (float)((ref<<1) - resis) * (float)resis;
r_float = (float)resis / (float)temp * refResis[front_resis] -
(float)ref * 2 / (float)temp * __ADG658_INTERNAL_RESIS -
__RELAY_INTERNAL_RESIS;
if(r_float < 0)
r_float = 0;
return (uint32_t)r_float;
}
其它的
若对精度要求不高,那么基准电压的ADC读值,我们可以初始化时去获取,后续ADC只采样待测电阻,这样速度快。
也可以考虑使用恒流源的方案,给待测电阻灌恒定的电流,需要理清楚校准问题。
该方式不过多考虑成本问题,因而不适宜消费类。
-END-