/*******************************************************本文件中,是操作称重传感器专用AD芯片HX711的程序。********************************************************/#includestm32f10x.h#includead_hx711.h#includedelay.h#includetransform.h#defineADIOGPIOA//定义AD芯片使用的I/O端口组。#defineDATAGPIO_Pin_11//定义AD芯片的数据线使用的引脚。#defineCLKGPIO_Pin_8//定义AD芯片的时钟线使用的引脚。#defineADCLKRCC_APB2Periph_GPIOA//定义AD芯片所使用的I/O端口的时钟。#defineN12//定义滤波时,存放采样值的队列的长度。使用循环队列。unsignedlongBUF[N];//定义作为队列的全局数组。longdoubleSUM;//定义存放采样值之和的全局变量。inti=0;//定义指向队列当前位置的数组下标变量。voidADInit(void)//初始化AD芯片使用的I/O端口。{GPIO_InitTypeDefGPIO_InitStructure;RCC_APB2PeriphClockCmd(ADCLK,ENABLE);GPIO_InitStructure.GPIO_Pin=CLK;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//CLK引脚定义为输出。GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(ADIO,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin=DATA;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//DATA引脚定义为输入。GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(ADIO,&GPIO_InitStructure);}unsignedlongReadAD(void)//读AD芯片输出的数据。{unsignedlongval=0;unsignedchari=0;GPIO_SetBits(ADIO,DATA);GPIO_ResetBits(ADIO,CLK);while(GPIO_ReadInputDataBit(ADIO,DATA));delay_us(1);for(i=0;i24;i++){GPIO_SetBits(ADIO,CLK);val=val1;delay_us(1);GPIO_ResetBits(ADIO,CLK);if(GPIO_ReadInputDataBit(ADIO,DATA))val++;delay_us(1);}GPIO_SetBits(ADIO,CLK);val=val^0x800000;delay_us(1);GPIO_ResetBits(ADIO,CLK);delay_us(1);returnval;}/*函数UsartDebugAD(),用于,串口与电脑通信,在串口调试助手中显示AD模块返回的数据,以调试AD模块。无滤波算法。*/voidUsartDebugAD(void){unsignedlongad;u8str[26];inti=0,j=0,k=0;delay_init(72);UsartConf(9600);ADInit();while(1){ad=ReadAD();IntToStr(ad,str);for(i=0;str[i]!='\0';i++);//计算数字是几位数。if(i==7)//如果只有7位数,前面用一个空格补齐8位。USendStr();USendStr(str);USendStr();j++;//j实现输出数字个数的计数,每输出6个数字,换2行。if(j==6){j=0;USendStr(\n);USendStr(\n);}k++;if(k==100)break;//输出100个数据后,结束调试。delay_ms(500);}}/*函数UsartDebugAD_F(),用于,串口与电脑通信,在串口调试助手中显示AD模块返回的数据,以调试AD模块。有滤波算法。*/voidUsartDebugAD_F(void){u8str[26];inti=0,j=0,k=0;delay_init(72);UsartConf(9600);ADInit();BUFInit();//往队列数组BUF里面存入N个采样值,初始化SUM为N个采样值的和。while(1){IntToStr(filter(),str);//IntToStr()函数在进行形参传递时,把filter()函数返回的浮点数转化为了整型数,//所以,此处调用IntToStr()函数不会出错。for(i=0;str[i]!='\0';i++);//计算数字是几位数。if(i==7)//如果只有7位数,前面用一个空格补齐8位。USendStr();USendStr(str);USendStr();j++;//j实现输出数字个数的计数,每输出6个数字,换2行。if(j==6){j=0;USendStr(\n);USendStr(\n);}k++;if(k==100)break;//输出100个数据后,结束调试。delay_ms(500);}}voidBUFInit(void)//初始化队列数组BUF和SUM,即,往里面先存入N个采样值,SUM为N个采用值的和。{intj=0;for(j=0;jN;j++){BUF[j]=ReadAD();SUM+=BUF[j];}}longdoublefilter(void)//滑动均值滤波法的函数。{unsignedlongtemp=0,max=0,min=0;intj=0;temp=ReadAD();/*下面一句不使用SUM+=temp-BUF[i]的形式,是为了避免temp-BUF[i]的运算,以免产生负数,引起误差。*/SUM=SUM+temp-BUF[i];BUF[i]=temp;i++;if(i==N)i=0;max=BUF[0];min=BUF[0];for(j=0;jN;j++){if(maxBUF[j])max=BUF[j];if(minBUF[j])min=BUF[j];}/*下面一句中的(SUM-max-min)/(N-2),不能用SUM=SUM-max-min;SUM/(N-2);这两句来替代,因为,这样会改变SUM的值,越减越小,到最后,会出现负数了。*/return(SUM-max-min)/(N-2);}