代码
HX711GPIO初始化
void Init_HX711pin(void)//初始化
{
GPIO_setAsOutputPin(GPIO_PORT_P3,GPIO_PIN5);//sck
GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P3, GPIO_PIN7);//dout
}
称重传感器的信号放大和转换
uint32_t HX711_Read(void) //增益128
{
unsigned long count;
unsigned char i;
GPIO_setOutputHighOnPin(GPIO_PORT_P3, GPIO_PIN7);//HX711_DOUT=1;
delay_us(1);
GPIO_setOutputLowOnPin(GPIO_PORT_P3,GPIO_PIN5);//HX711_SCK=0;
count=0;
while(GPIO_getInputPinValue(GPIO_PORT_P3, GPIO_PIN7));
for(i=0;i<24;i++)
{
GPIO_setOutputHighOnPin(GPIO_PORT_P3,GPIO_PIN5);//HX711_SCK=1;
count=count<<1;
delay_us(1);
GPIO_setOutputLowOnPin(GPIO_PORT_P3,GPIO_PIN5);//HX711_SCK=0;
if(GPIO_getInputPinValue(GPIO_PORT_P3, GPIO_PIN7))//HX711_DOUT=1
count++;
delay_us(1);
}
GPIO_setOutputHighOnPin(GPIO_PORT_P3, GPIO_PIN5);//HX711_SCK=1;
count=count^0x800000;//第25个脉冲下降沿来时,转换数据
delay_us(1);
GPIO_setOutputLowOnPin(GPIO_PORT_P3,GPIO_PIN5);//HX711_SCK=0;
return(count);
}
讲解
- 首先,将HX711_DOUT引脚置为高电平,表示准备开始读取数据。
- 延时1微秒。
- 将HX711_SCK引脚置为低电平,表示准备发送时钟脉冲。
- 初始化计数器count为0。
- 使用while循环等待HX711_DOUT引脚变为低电平,表示数据准备好了。
- 进行24次循环,每次读取一位数据。
- 在每次循环开始时,将HX711_SCK引脚置为高电平,发送一个时钟脉冲。
- 将count左移一位,为新的数据位留出位置。
- 延时1微秒。
- 将HX711_SCK引脚置为低电平,结束时钟脉冲。
- 检查HX711_DOUT引脚的值,如果为高电平,则将count加1,表示该位是1。
- 延时1微秒。
- 循环结束后,将HX711_SCK引脚置为高电平,发送一个时钟脉冲。
- 将count与0x800000异或运算,相当于对第25个脉冲下降沿时的数据进行转换。
- 延时1微秒。
- 将HX711_SCK引脚置为低电平,结束时钟脉冲。
- 返回读取到的数据count。
获取毛皮重量
void Get_Maopi(void)
{
Weight_Maopi = HX711_Read();
}
uint32_t Get_Weight(void)
{
HX711_Buffer = HX711_Read();
if(HX711_Buffer > Weight_Maopi)
{
Weight_Shiwu = HX711_Buffer;
Weight_Shiwu = Weight_Shiwu - Weight_Maopi; //获取实物的AD采样数值。
Weight_Shiwu = (int32_t)((double)Weight_Shiwu / GapValue); //计算实物的实际重量
//因为不同的传感器特性曲线不一样,因此,每一个传感器需要矫正这里的GapValue这个除数。
//当发现测试出来的重量偏大时,增加该数值。
//如果测试出来的重量偏小时,减小改数值。
Weight_Shiwu=KLM(Weight_Shiwu);
}
return(Weight_Shiwu);
}
如果对HX711称重模块不是很了解的可以参考:HX711压力传感器学习一(STM32)_hx711引脚及其功能_三马分享家的博客-CSDN博客