初级会员

- 积分
- 91
- 金钱
- 91
- 注册时间
- 2017-7-3
- 在线时间
- 17 小时
|
从HX711返回来的数据不稳定,但是一定时间内是稳定的:比如在一分钟内返回的数据是0.02左右,但是过几分钟再看(不做任何变动的情况下),数据可能就变为0.1左右了,程序如下,希望大佬可以帮忙看一下,另外小弟是小白,还有电子秤的清零和设置单价没有思路,希望有经验的大佬可以指教一二。
#include <stm32f10x.h>
#include <HX711.h>
#include <delay.h>
#include <lcd.h>
#include <key.h>
#include "sys.h"
long HX711_Buffer = 0.0;
long Weight_Maopi = 0.0;
long Weight_Shiwu = 0.0;
#define GapValue 180.0
void HX711_Init(void)
{
GPIO_InitTypeDef GPIO_InitLED;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitLED.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitLED.GPIO_Pin=GPIO_Pin_10;
GPIO_InitLED.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitLED);
GPIO_InitLED.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitLED.GPIO_Pin=GPIO_Pin_4;
GPIO_InitLED.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitLED);
}
unsigned long Read_HX711(void)
{
unsigned long C = 0;
unsigned char i = 0;
delay_init();
GPIO_ResetBits(GPIOC,GPIO_Pin_4);
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10));
delay_us(1);
for(i=0;i<24;i++)
{
GPIO_SetBits(GPIOC,GPIO_Pin_4);
C = C<<1;
delay_us(1);
GPIO_ResetBits(GPIOC,GPIO_Pin_4);
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10))
C++;
delay_us(1);
}
GPIO_SetBits(GPIOC,GPIO_Pin_4);
C = C^0x800000;
delay_us(1);
GPIO_ResetBits(GPIOC,GPIO_Pin_4);
delay_us(1);
return C;
}
long Get_Maopi()
{
Weight_Maopi = Read_HX711();
return Weight_Maopi;
}
long Get_Weight()
{
HX711_Buffer = Read_HX711();
Weight_Shiwu = HX711_Buffer;
Weight_Shiwu = (long)((float)Weight_Shiwu/GapValue);
return Weight_Shiwu;
}
u8 Weight[4];//存放重量的数组
float R;int W;//返回的电压和最后显示的重量
void USART1_IRQHandler(void)//中断服务函数
{
int i;
float R;
float W;
if(USART_GetITStatus(USART1,USART_IT_RXNE))
{
USART_ReceiveData(USART1);
W = Get_Weight();
R =(float)(W/9500.0-4.885);//显示的电压
printf("R=%f",R);
W = 1723 * R - 37.19;//拟合出来的关系式,下面四行是计算重量的
Weight[0] = (int)W/100; //百位
Weight[1] = (int)(W/10)%10; //十位
Weight[2] = ((int)W%10); //个位
Weight[3] = (int)((W*10))%10;//小数点后一位
//这个switch的功能是显示重量的百位数,因位有BUG,百位不能和其他的位一块显示,所以我才这样写的
switch(Weight[0])
{
case 0 CD_ShowString(99,60,1,16,16,"0");break;
case 1 CD_ShowString(99,60,1,16,16,"1");break;
case 2 CD_ShowString(99,60,1,16,16,"2");break;
case 3 CD_ShowString(99,60,1,16,16,"3");break;
case 4 CD_ShowString(99,60,1,16,16,"4");break;
case 5 CD_ShowString(99,60,1,16,16,"5");break;
}
//for的功能是显示重量的十位 个位
for(i=1;i<3;i++)
{
sprintf((char*)Weight,"%d",Weight[i]);
LCD_ShowString(99+i*10,60,1,16,16,Weight);
}
//这两行是显示小数点后一位
sprintf((char*)Weight,"%d",Weight[3]);
LCD_ShowString(139,60,1,16,16,Weight);
}
}
|
|