STM32F103ZET6读取ADHX711数据

压力传感器经过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]

你可能感兴趣的:(STM32F103ZET6读取ADHX711数据)