使用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;
}
|