压力传感器经过24位的ADCHX711输出数字信号,单片机根据时序读取数据,并对数据进行滤波处理,得到物体的重量。
头文件:
#ifndef __HX711_H__
#define __HX711_H__
#include "sys.h"
#include "delay.h"
//称重传感器特性曲线除法因子,该数值一般在4.0-5.0之间
#define DIV 3.38
//#define DIV 0.378
//IO方向设置
#define HX711_DAT_IN() {GPIOA->CRL&=0X0FFFFFFF;GPIOA->CRL|=(u32)4<<28;}//8-上下拉输入,4-浮空输入
#define HX711_DAT_OUT() {GPIOA->CRL&=0X0FFFFFFF;GPIOA->CRL|=(u32)3<<28;}//推挽输出
//IO接口定义
#define HX711_DOUT PAout(7)
#define HX711_DIN PAin(7)
#define HX711_SCK PAout(6)
源文件
#include "hx711.h"
//****************************************************
//初始化HX711
//****************************************************
void HX711_Init(void)
{
RCC->APB2ENR|=1<<2; //先使能外设IO PORTA时钟
GPIOA->CRL&=0X00FFFFFF; //PA6/7 推挽输出
GPIOA->CRL|=0X33000000;
GPIOA->ODR|=3<<6; //PA6,7 输出高
HX711_SCK=0;//拉低PD_SCK,使芯片处于正常工作状态
}
//****************************************************
//读取HX711
//****************************************************
unsigned long HX711_Read(void)//25个脉冲,增益128
{
unsigned long Count=0;//无符号4个字节
u8 i;
HX711_DAT_OUT();//DAT设置为输出
HX711_DOUT=1;
HX711_SCK=0;//拉低PD_SCK,使芯片处于正常工作状态
HX711_DAT_IN();
while(HX711_DIN);//等待DOUT从高电平变为低电平,即A/D转换器准备好,当HX711_DIN=1,程序不往后执行,当HX711_DIN=0时才往后执行
delay_us(1);
//24个下降沿
for(i=0;i<24;i++)
{
HX711_SCK=1;
Count=Count<<1;//先读出MSB,因此左移
delay_us(1);//PD_SCK正脉冲电平时间
HX711_SCK=0;
if(HX711_DIN)//从时序图可知,上升要准备数据,下降沿锁存数据,所以下降沿读取数据
Count++;
delay_us(1);//PD_SCK负脉冲电平时间
}
//第25个下降沿
HX711_SCK=1;
delay_us(1);//PD_SCK正脉冲电平时间
//bit23取反,去负号
Count=Count^0x800000;//^异或运算符,位值相同为0,不同为1
HX711_SCK=0;
delay_us(1);//PD_SCK负脉冲电平时间
return(Count);
}
//称重,输入HX711采样值,返回值单位为mg
unsigned int Calc_press(unsigned long count)
{
unsigned long press = 0;
press = count;
press -= 24633;
press = (unsigned int)((float)press/DIV + 0.05);//计算实物的实际重量,+0.05是为了四舍五入百分位
return press;
}
//滤波
long double filter(void) //
{
unsigned long max=0,min=0,SUM,BUF[12],Average;
int i=0;
for(i=0;i<12;i++)
{
BUF[i]=HX711_Read();
//printf("%ld\r\n",BUF[i]);
if(i==0)
{
max=BUF[0];
min=BUF[0];
}
if(i>0)
{
if(BUF[i]>max) max=BUF[i];
if(BUF[i]<min) min=BUF[i];
}
}
for(i=0;i<12;i++)
{
if(!(BUF[i]==max||BUF[i]==min))
{
SUM=SUM+BUF[i];
}
}
Average=SUM/(12-2);
return Average;
}