硬件包含:STM32f103rct6開發(fā)板、HX711模塊、帶亞克力板的20kg壓力傳感器、砝碼(100g、50g、20g、20g、10g、5g)。
HX711接線:
SCK——PB0
DT——PB1
實驗中測得的數(shù)據(jù)通過串口打印出來
注意:將HX711連接至開發(fā)板管腳請勿接上拉或下拉電阻、下載程序至STM32后請復位,DT引腳被拉低后HX711開始工作,STM32的D0指示燈閃爍(如果D0沒有閃爍則說明HX711沒有工作、DT仍處于高電平,程序會進入循環(huán)一直等待HX711響應)
制作出來的實物圖如下:
205g.jpg (1.8 MB, 下載次數(shù): 47)
下載附件
205g砝碼
2022-2-27 22:24 上傳
3.jpg (107.07 KB, 下載次數(shù): 46)
下載附件
串口
2022-2-27 22:24 上傳
單片機源程序如下:
- #ifndef _HX711_H
- #define _HX711_H
- #include "sys.h"
- #define HX711_SCK PBout(0)// 設置 SCK 引腳為PB0
- #define HX711_DOUT PBin(1)// 設置 DT 引腳為PB1
- extern void Init_HX711pin(void);
- extern u32 HX711_Read(void);
- extern void Get_Maopi(void);
- extern void Get_Weight(void);
- extern u32 HX711_Buffer;
- extern u32 Weight_Maopi;
- extern s32 Weight_Shiwu;
- extern u8 Flag_Error;
- #endif
復制代碼- #include "HX711.h"
- #include "delay.h"
- u32 HX711_Buffer;
- u32 Weight_Maopi;
- s32 Weight_Shiwu;
- u8 Flag_Error = 0;
- //校準參數(shù)
- //因為不同的傳感器特性曲線不是很一致,因此,每一個傳感器需要矯正這里這個參數(shù)才能使測量值很準確。
- //當發(fā)現(xiàn)測試出來的重量偏大時,增加該數(shù)值。
- //如果測試出來的重量偏小時,減小改數(shù)值。
- //該值可以為小數(shù)
- #define GapValue 222
- void Init_HX711pin(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PF端口時鐘
- //HX711_SCK
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 端口配置
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHz
- GPIO_Init(GPIOB, &GPIO_InitStructure); //根據(jù)設定參數(shù)初始化GPIOB
-
- //HX711_DOUT
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//輸入上拉
- GPIO_Init(GPIOB, &GPIO_InitStructure);
-
- GPIO_SetBits(GPIOB,GPIO_Pin_0); //初始化設置為0
- }
- //****************************************************
- //讀取HX711
- //****************************************************
- u32 HX711_Read(void) //增益128
- {
- unsigned long count;
- unsigned char i;
- HX711_DOUT=1;
- delay_us(1);
- HX711_SCK=0;
- count=0;
- while(HX711_DOUT); //判斷HX711是否回應(拉低電平),如果回應則繼續(xù)執(zhí)行下面的程序,否則進入死循環(huán)等待
- for(i=0;i<24;i++)
- {
- HX711_SCK=1;
- count=count<<1;
- delay_us(1);
- HX711_SCK=0;
- if(HX711_DOUT)
- count++;
- delay_us(1);
- }
- HX711_SCK=1;
- count=count^0x800000;//第25個脈沖下降沿來時,轉換數(shù)據(jù)
- delay_us(1);
- HX711_SCK=0;
- return(count);
- }
- //****************************************************
- //獲取毛皮重量
- //****************************************************
- void Get_Maopi(void)
- {
- Weight_Maopi = HX711_Read();
- }
- //****************************************************
- //稱重
- //****************************************************
- void Get_Weight(void)
- {
- HX711_Buffer = HX711_Read();
- if(HX711_Buffer > Weight_Maopi)
- {
- Weight_Shiwu = HX711_Buffer;
- Weight_Shiwu = Weight_Shiwu - Weight_Maopi; //獲取實物的AD采樣數(shù)值。
-
- Weight_Shiwu = (s32)((float)Weight_Shiwu/GapValue); //計算實物的實際重量
- //因為不同的傳感器特性曲線不一樣,因此,每一個傳感器需要矯正這里的GapValue這個除數(shù)。
- //當發(fā)現(xiàn)測試出來的重量偏大時,增加該數(shù)值。
- //如果測試出來的重量偏小時,減小改數(shù)值。
- }
-
- }
復制代碼- #include "stm32f10x.h"
- #include "delay.h"
- #include "hx711.h"
- #include "usart.h"
- #include "led.h"
- int main(void)
- {
- Init_HX711pin();
- delay_init();
- LED_Init();
-
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應優(yōu)先級
- uart_init(9600); //串口初始化為9600
-
- Get_Maopi(); //稱毛皮重量
- delay_ms(1000); //等待數(shù)據(jù)穩(wěn)定
- delay_ms(1000);
- Get_Maopi(); //重新獲取毛皮重量
-
- while(1)
- {
- Get_Weight();
- printf("凈重量 = %d g\r\n",Weight_Shiwu); //通過串口打印HX711稱得的重量
- delay_ms(1000);
- LED0=!LED0; //LED0閃爍提示HX711工作狀態(tài)(閃爍:)
- }
- }
復制代碼
snipaste_20220227_221501.jpg (46.51 KB, 下載次數(shù): 57)
下載附件
文件夾
2022-2-27 22:25 上傳
Keil代碼下載:
基于STMF103RCT6的HX711電子秤實驗.7z
(953.17 KB, 下載次數(shù): 112)
2022-2-28 00:46 上傳
點擊文件名下載附件
工程文件 下載積分: 黑幣 -5
|