#include "HX711.h" //读711 AD数据子程序
#include "LED.h"
//sbit ADDO=PA^0;
//sbit ADSK=PA^1;
#define ADSK_H GPIO_SetBits(GPIOA,GPIO_Pin_1)
#define ADSK_L GPIO_ResetBits(GPIOA,GPIO_Pin_1)
#define ADDO_H GPIO_SetBits(GPIOA,GPIO_Pin_2)
#define ADDO_L GPIO_ResetBits(GPIOA,GPIO_Pin_2)
void static Delay(u32 del)
{
while(del--);
}
void GPIO_Configuration_HX711(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能PA端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //ADSK-->
A.1 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA.0
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //ADDO-->
A.2 端口配置, 推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入,IO口速度为50MHz
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA.1
}
u32 ReadCount(void)
{
u32 Count;
u16 ADval;
u8 i;
ADDO_H;
Delay(5);
ADSK_L;
Count=0;
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2)==1);
for(i=0;i<24;i++)//读取24个bit
{
ADSK_H;
Delay(5);
Count=Count<<1;
ADSK_L;
Delay(5);
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2)==1)Count++;
}
ADSK_H; //发送第25个脉冲,表示下载转换使用A通道128bd
Delay(5);
ADSK_L;
Delay(5);
ADval = (int)(Count>>8); //取高十六位有效值
return(ADval);
}
u32 Weighing(void)
{
u32 X1;
u8 t,t1,count=0;
u16 databuffer[30]; //采样缓存区
u16 temp=0;
u32 X;
do{ //循环读取30次
X=ReadCount();
if(X>100) //如果是在测量有效区范围的值,标记此读数有效
{
databuffer[count]=X;
count++;
}
}while(count<30);
if(count==30) //每次读数一定要读到30次数据,否则丢弃
{
do
{
t1=0;
for(t=0;t<count-1;t++)
{
if(databuffer[t]>databuffer[t+1])//升序排列
{
temp=databuffer[t+1];
databuffer[t+1]=databuffer[t];
databuffer[t]=temp;
t1=1;
}
}
}while(t1);
}
X1=0;
//从排序过的数组里抽取连续的10组数据,进行取平均值,获得较高的精度
for(count=10;count<20;count++)
{
X1=X1+databuffer[count];
}
X1=X1/10;
return X1;
}
一周热门 更多>