时间记录:2024/11/9
一、知识点记录
1、hx711
1)HX711是一款高精度压力传感器专用的24位模数转换芯片,主要功能是将测得的微小电压信号放大到可以被微控制器读取的范围
2)工作电压2.6-5.5V
3)引脚介绍
引脚 | 描述 |
---|---|
VDD | 电源正极 |
GND | 电源地 |
SCK | 时钟信号引脚 |
DT | 数据输入输出引脚 |
4)压力传感器与hx711连线
E+ - 电源正极(红线)
E- - 电源负极(黑线)
A+ - 差分信号A通道+(绿色)
A- - 差分信号A通道-(白色)
B+ - 差分信号B通道+
B- - 差分信号B通道-
一般选择A通道128增益模式
5)时序介绍
DT线高电平时SCK时钟线低电平,等待DT线变为低电平后数据准备完毕可以进行读取重量数据,一共24位ADC数据高位先读,上升沿等待数据变换,下降沿读取数据,通道和增益根据此次周期个数决定,切换通道和增益的话至少需要两个周期进行数据稳定
二、示例程序
头文件
c
#ifndef __HX711_H__
#define __HX711_H__
#include "stm32f10x.h"
void hx711Init(void);
void hx711Zero(void);
float hx711GetWeight(void);
#endif
源程序
c
#include "hx711.h"
/**
* 使用A通道128增益模式,25时钟脉冲
*/
#define SCK_HIGH GPIO_SetBits(GPIOB, GPIO_Pin_9)
#define SCK_LOW GPIO_ResetBits(GPIOB, GPIO_Pin_9)
#define DT_HIGH GPIO_SetBits(GPIOB, GPIO_Pin_8)
#define DT_LOW GPIO_ResetBits(GPIOB, GPIO_Pin_8)
#define DT_READ GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_8)
#define DT_OUTMODE {GPIOB->CRH &= 0xFFFFFFF0; GPIOB->CRH |= 0x00000003;} // 推挽输出
#define DT_INMODE {GPIOB->CRH &= 0xFFFFFFF0; GPIOB->CRH |= 0x00000004;} // 浮空输入
static int hx711Read(void);
int zero = 0;
#define gapValue 404.08 // 校准参数
void hx711Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
int hx711Read(void)
{
int count = 0;
DT_OUTMODE;
DT_HIGH;
SCK_LOW; // 默认初始化模式
DT_INMODE;
while(DT_READ); // 等待数据准备好,大概100ms,10Hz
for(u8 i=0;i<24;i++)
{
SCK_HIGH; // 上升沿准备数据
count <<= 1;
SCK_LOW; // 下降沿采集数据
if(DT_READ)
count |= 0x01;
}
SCK_HIGH; // 产生25个脉冲信号标识使用A通道128增益模式
SCK_LOW;
count ^= 0x800000;
return count;
}
void hx711Zero(void)
{
for(u8 i=0;i<7;i++)
{
zero += hx711Read();
}
zero /= 7;
}
float hx711GetWeight(void)
{
float weight = 0.0;
int tempWeight = 0;
for(u8 i=0;i<7;i++)
{
tempWeight += hx711Read();
}
tempWeight /= 7;
if(tempWeight > zero)
weight = (float)(tempWeight - zero)/gapValue;
else
weight = 0.0;
return weight;
}