ADC模块之HX711

        今天,回顾了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博客

猜你喜欢

转载自blog.csdn.net/m0_53573725/article/details/132521779