觉得这个题目应该很适合练手,于是就搞了一下。查了一番,觉得这个题目中的难点就是那个悬臂梁的制作与应变片的选择。这个应该属于机械、力学专业的人强项,对于我这个学控制的,还是有点挑战性的。那就先不搞传感器。我先自己买了一个商用的称重传感器(500g精度),以此作为标准先来测试我的程序。等程序方面没问题了,在集中精力去制作一个可以与商用传感器媲美的应变片式传感器。
好了,不懂的地方就不多说了,下面介绍一下我的程序思路:
首先传感器我们有了,就是类似与下面的这个东西:
它内部是一个应变片接成的惠斯通电桥,之所以把应变片贴成电桥的形式,其实是为了弥补应变片因温度影响而带来的偏差。同样的温度下,四个应变片的阻值受温度影响的变化是一样的 。这个一样的偏差就被桥式给平衡掉。从而避免了温度的影响。
这个东西能把受力转化为电压差,但是这个电压差非常微小,需要一个放大电路,又因为他是模拟电压,后面需要单片机处理的时候需要转化为数字电压。
所以我选用了CS1237 ADC芯片。它
画的PCB小板:
后面就方便了,按照芯片手册给出的通信时序,2线SPI,读取内部转化的24位ADC数值,在按照公式计算出重量即可。
主控:STM32C8T6
LCD触摸屏实时刷新重量
在进行读写CS1237的时候,最重要的又是对其进行功能配置,一旦我们能够成功的配置并读取内部的控制字,那么后面的数据读取就不是问题。
查询芯片手册,可以看到它的功能配置时序图:
这个时序相对来说还是比较复杂的,因为它不是重复的,它分为以下8步:
我们按照这个要求,就可以比较方便的写出它的功能配置函数了。
其中最重要的是DOUT管脚的配置。因为他是双向管脚。
在输出的时候需要配置成推挽输出,读取的时候配成上拉输入。
但是要注意这里不能使用开漏加外部上拉电阻的形式,虽然在之前我用这种方式配置过双向IO口,但是不知道为什么,在这个芯片上面不能用。读不出数据。
我用逻辑分析仪看了波形之后,才发现时序在第38-46个时钟周期内,DOUT引脚没有反应。无法被拉高。
但是上面那个程序是能够与CS1237正常通信的。
建立了通信之后,就是读取内部寄存器存储的ADC数值了:
这里读出的是20位的ADC原始数据,离我们想要的重量数据还是有一定的差距。
把读取的数据用波形显示出来,可以发现增加砝码的时候数据的抖动还是非常大的。
所以我选择先对数据进行低通滤波,消抖滤波。让数据能很快的稳定下来。
其中消抖滤波部分:
思想就是对比几次输出的值,在一定的输出个数内,如果是不一样的,就更新数据,否则保持原始数据不变。
得到了稳定的ADC数据之后,就可以将ADC数据转化为重量了。
转化为重量的前提是传感器输出的数据和增加的重量是线性变化的。
那么就可以根据两点直线法,先读出一个没加重物的ADC值,在读出一个加了500g重物的ADC值,根据这两个点就可以确定一个线性关系。后面读出的ADC数据都可以根据这个线性关系进行结算重量。
感觉原理一旦说出来,逼格突然降低了好几个档次。。。。
上面这段程序在计算重量的时候,同时进行了数据的保留一位小数点和四舍五入。
最后吧这个数据输出到触摸屏上即可。