使用100g的砝码修正,使用紫色的hx711,50kg的压电式力传感器,在串口打印助手中,显示的重量是一个负数。使用的是正点的串口打印函数,和购买时51单片机的HX711程序修改的。
不知道是延时函数的问题,还是这个计算公式的问题Weight_Shiwu = (long)((float)Weight_Shiwu/GapValue);
#include "sys.h"
#include "usart.h"
#include "HX711.h"
#include "delay.h"
float Weight = 0;
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(); //延时初始化
uart_init(115200); //串口初始化波特率为115200
Init_Hx711();
delay_ms(2000);
Get_Maopi();
delay_ms(100);
while(1)
{
Weight = Get_Weight();
Weight = (float)Weight/1000.0f;
printf("%0.3f kg \r\n",Weight); //串口显示重量
delay_ms(1000);
}
}
/****
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD=nus*fac_us; //时间加载
SysTick->VAL=0x00; //清空计数器
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //等待时间到达
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
****/
HX711主要函数
#include "HX711.h"
#include "delay.h"
long HX711_Buffer = 0;
long Weight_Maopi = 0;
long Weight_Shiwu = 0;
#define GapValue 71.5 /50kg的量程
/*
可以在产生 VAVDD 和 AGND 电压,即 711 模块上的 E+ 和 E- 电压。该电压通过 VAVDD=VBG(R1 +R2 )/R2 计算。VBG 为模块儿基准电压 1.25v,R1 = 20K,R2 = 8.2K。 因此得出 VAVDD = 4.3V
因传感器线性斜率不同而定。每个传感器都要校准。如果传感器测量值偏大,则需改大该数值,若传感器测量值偏小,则需改小该数值。(不断修正8)
*/
#define HIGH 1
#define LOW 0
#define HX711_GROUP GPIOB
void digitalWrite(GPIO_TypeDef * GPIO,int pin,int value)
{
if(value==HIGH)//set 1
{
GPIO_SetBits(GPIO,pin);
}
if(value==LOW)//reset 0
{
GPIO_ResetBits(GPIO,pin);
}
}
int digitalRead(GPIO_TypeDef * GPIO,int pin)
{
return GPIO_ReadInputDataBit(GPIO,pin);
}
//****************************************************
//初始化HX711
//****************************************************
void Init_Hx711()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端口时钟
//pd_sck
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB0
GPIO_SetBits(GPIOB,GPIO_Pin_0); //PB0输出高
//DOUT
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; // 端口配置, 推挽输出
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IN_FLOATING;//输入模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure); //推挽输出 ,IO口速度为50MHz
GPIO_SetBits(GPIOE,GPIO_Pin_1); //PB1 输出高
}
//****************************************************
//获取毛皮重量
//****************************************************
void Get_Maopi()
{
Weight_Maopi = HX711_Read();
}
//****************************************************
//称重
//****************************************************
long Get_Weight()
{
HX711_Buffer = HX711_Read();
Weight_Shiwu = HX711_Buffer;
Weight_Shiwu = Weight_Shiwu - Weight_Maopi; //获取实物的AD采样数值。
Weight_Shiwu = (long)((float)Weight_Shiwu/GapValue);
return Weight_Shiwu;
}
//****************************************************
//读取HX711
//****************************************************
unsigned long HX711_Read(void) //增益128
{
unsigned long val = 0;
unsigned char i = 0;
GPIO_SetBits(GPIOB,GPIO_Pin_1); //DOUT=1
GPIO_ResetBits(GPIOB,GPIO_Pin_0); //SCK=0
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1));//DOUT
delay_us(1);
for(i=0;i<24;i++)
{
delay_us(100);
GPIO_SetBits(GPIOB,GPIO_Pin_0); //时钟高电平
val=val<<1; //若DT位为左移一位
delay_us(1);
GPIO_ResetBits(GPIOB,GPIO_Pin_0); //时钟低电平
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1))
val++; //若DT位为高sck+1
delay_us(1);
}
GPIO_SetBits(GPIOB,GPIO_Pin_0);
val = val^0x800000;
delay_us(1);
GPIO_ResetBits(GPIOB,GPIO_Pin_0);
delay_us(1);
return val;
}
|