打印
[STM32F1]

单片机称重系统设计

[复制链接]
1021|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhang062061|  楼主 | 2021-1-23 19:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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];

本文介绍的只是一种常见的称重系统设计方案。在一些要求高的场合,可能需要对传感器进行蠕变补偿,采用交流激励等方式。


欢迎关注公众号"嵌入式技术开发",大家可以后台给我留言沟通交流。如果觉得该公众号对你有所帮助,也欢迎推荐分享给其他人。


使用特权

评论回复
沙发
wenunit| | 2023-10-15 21:15 | 只看该作者
好文章,可惜没图了,谢谢。

使用特权

评论回复
板凳
田舍郎| | 2023-10-15 23:07 | 只看该作者
精度到多少啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

41

帖子

0

粉丝