今天,回顾了HX711模数转换模块,HX711模块经常用于电子秤的设计。
模数转换模块的输入有三种(HX711的输入为差分输入):
HX711的驱动程序
#include "HX711.h"
//****************************************************
//延时函数
//****************************************************
void Delay__hx711_us(void)
{
_nop_();
_nop_();
}
//****************************************************
//读取HX711
//****************************************************
unsigned long HX711_Read(void) //增益128
{
unsigned long count;
unsigned char i;
HX711_DOUT=1;
Delay__hx711_us();
HX711_SCK=0;
count=0;
while(HX711_DOUT);
for(i=0;i<24;i++)
{
HX711_SCK=1;
count=count<<1;
HX711_SCK=0;
if(HX711_DOUT)
count++;
}
HX711_SCK=1;
count=count^0x800000;//第25个脉冲下降沿来时,转换数据
Delay__hx711_us();
HX711_SCK=0;
return(count);
}
count=count^0x800000;
HX711的输入是差分输入,所以输入有正有负,其数字量以补码的方式存放在24位寄存器中,首位是符号位。
为什么要将count与0x800000异或,这其实是对补码进行偏移,便于处理数据。 如下图所示,偏移值是有序的。
其次,由于定义了count是无符号长整型的(32位),所以编译器对count最高位的解释是数值位,而不是符号位,而且24位并没有充满32位,初始化的时候,count=0,最高位是0,因此对于补码形式的24位,依次放到count内,编译器对count中的第24位并不会认为是符号位,只会觉得这就是2^23的权值。当输入为负数时,第24位是1,输入为正数,第24位为0,这样就会导致一个问题,输入为负值时,得到的count反而越大。所以才会使count与0x800000异或,当第24位为0时,代表正数,置为1,当第24位为1时,代表负数,置为0,这样当输入比如从-5V到5V,count的数值是逐步增长的。
附录:
ADC的单端输入、伪差分输入、差分输入区别?_学海无涯_come on的博客-CSDN博客
ADC的单端、伪差分和差分输入_adc差分输入原理图_小叶爱吃汤圆的博客-CSDN博客
全差分伪差分单端输入ADC理解 - 百度文库 (baidu.com)
浅谈ADC分辨率和精度的差异,别再混为一谈了 (baidu.com)
RA6T2的16位模数转换器操作[15]性能分析(上)-电子工程专辑 (eet-china.com)
浅谈ADC分辨率和精度的差异,别再混为一谈了 (baidu.com)
ADC的分辨率和最低有效位(LSB) - 知乎 (zhihu.com)
称重传感器的24位A/D模块——HX711_hx711ad模块_软件架构师-叶帅的博客-CSDN博客
ADC偏移二进制码与实际电压的换算_CCCMiyagi的博客-CSDN博客