本帖最后由 zhang062061 于 2021-1-23 20:00 编辑
1.传感器简介 称重系统在工业级日常生活中应用非常广泛,从小型的电子称到大型的地磅。其中传感器大部分为电阻应变式压力传感器。一般由四个电阻应变片组成惠更斯电桥,安装在弹性体上。当有压力时,应变片随弹性体发生形变,电阻产生变化,电桥产生不平衡电压。一般压力与电桥不平衡电压成线性比例关系。 传感器的输出电压一般比较小,为mV级别。具体取决于激励电压和传感器灵敏度。常见的灵敏度有1mV/V、2mV/V、3mV/V。对于2mV/V的传感器,在激励电压为5V时,满量程时输出电压为2mV/V*5V=10mV。 2.硬件设计 传感器信号比较小,需要放大后再进行AD采集。目前有很多称重系统专用的AD芯片,内部集成了放大器,大大简化了硬件电路的设计。如TI的ADS1231,芯海科技的CS1231、海芯科技的HX710等。这些芯片都是24位AD,且集成了128倍的放大器(部分芯片放大倍数可设置)。本文以HX710为例进行介绍。其电路图如下: 查询手册可以看到芯片5V供电时的性能要优于3V供电。但需要注意的是HX710的AVDD不能大于DVDD,而目前大部分单片机为3.3V供电,所以这里都用3.3V供电。ADS1231是没有这个限制的,即DVDD可以是3.3V,AVDD可以是5V。 芯片共模输入电压范围为AGND+0.9V到AVDD-1.3V,这一点在其它应用时需要注意。 芯片差分输入电压范围为±0.5VREF/放大倍数(128)≈±12.89mV。对于3.3V激励电压,2mV/V灵敏度的传感器,最大输出电压为±6.6mV,在芯片要求范围内。两个值相差近一倍,会损失约1位的分辨率。激励电压越大,传感器输出电压越接近AD的输入范围,AD的分辨率就越能得到有效利用。但也要综合考虑整个电源系统的设计。 另外,传感器的激励电压尽量与芯片的VREF采用同一个电源,这样可以抑制一些共模干扰。 3.软件设计 芯片与单片机接口简单,一个数据输出引脚DOUT,一个时钟引脚SCK。 当AD一次转换完成后,DOUT由高电平变为低电平,此时SCK引脚输入25~27个不等的时钟脉冲,每个时钟的上升沿从DOUT读取数据。时序图如下。其它芯片的读取数据时序与此芯片基本相同。 程序编写 int32_t ad_val=0;//AD值
void Get_HX710()
{
HX710_SCLK_CLR;
if(READ_HX710_DOUT_PIN)return ;
for(i=0;i<24;i++)
{
HX710_SCLK_SET;
ad_val=ad_val<<1;
HX710_SCLK_CLR;
if(READ_HX710_DOUT_PIN)
ad_val++;
}
HX710_SCLK_SET;
if(ad_val&0x800000)ad_val|=0xFF000000;
HX710_SCLK_CLR;
}
传感器校准 上面读取的是AD原始值,转换成重量前需要对传感器进行校准。一般传感器校准至少需要两个点:零点和任满量程(当然,其它任意两个点也可以,因为两点确定一条直线)。对于一些要求高的场合,则需要多个点进行分段校准,甚至不同温度区间进行校准。本文以两个点的校准为例。校准数据包括零点校准值、零点AD值、满量程校准值、满量程AD值。 计算称重值比较简单,即在通过两个校准点确定一条直线,找到该曲线上AD值对应的重量。程序如下: int32_t CaliADCValue[2];//校准的AD值
int32_t CaliSensorValue[2];//校准的传感器值
int32_t ZeroValue;//去皮AD值
void CalcWeight(int32_t AD_Value)
{
int32_t Sensor_Value = 0;
int32_t TempCaliADCValue[2];//校准AD值
TempCaliADCValue[0] = CaliADCValue[0] + ZeroValue;
TempCaliADCValue[1] = CaliADCValue[1] + ZeroValue;//去皮
if(AD_Value < TempCaliADCValue[0])//小于0点值
{
Sensor_Value = 0;
}
else if(AD_Value > TempCaliADCValue[1])//大于最大校准值
{
Sensor_Value = CaliSensorValue[1] + (float)(AD_Value - TempCaliADCValue[1])/(float)(TempCaliADCValue[1] - TempCaliADCValue[0]) * (float)(CaliSensorValue[1] - CaliSensorValue[0]);
}
else//在校准范围内
{
Sensor_Value = CaliSensorValue[0] + (float)(AD_Value - TempCaliADCValue[0])/(float)(TempCaliADCValue[1] - TempCaliADCValue[0]) * (float)(CaliSensorValue[1] - CaliSensorValue[0]);
}
}
称重系统的一个重要功能就是去皮。上面程序中包括了去皮的功能,去皮即在原来校准AD值的基础上加上去皮AD值,作为新的校准AD值去计算。 AD去皮值=当前AD值-零点校准AD值。 ZeroValue = ad_val - CaliADCValue[0];
本文介绍的只是一种常见的称重系统设计方案。在一些要求高的场合,可能需要对传感器进行蠕变补偿,采用交流激励等方式。
欢迎关注公众号"嵌入式技术开发",大家可以后台给我留言沟通交流。如果觉得该公众号对你有所帮助,也欢迎推荐分享给其他人。
|