|
用STM32 HX711實現(xiàn)了讀取壓力傳感器數(shù)據(jù),現(xiàn)在數(shù)據(jù)已經(jīng)能讀到了,但是傳一次數(shù)據(jù)蜂鳴器就會響一聲,很頻繁刺耳,代碼在壓縮文件里面。
單片機(jī)源程序如下:
- #include "sys.h"
- #include "delay.h"
- #include "lcd.h"
- #include "w25qxx.h"
- #include "text.h"
- #include "HX711.h"
- #include "usart.h"
- #include "filter.h"
- #include "key.h"
- /******************************************************************
- 校準(zhǔn)參數(shù):
- 因為不同的傳感器特性曲線不是很一致,因此,每一個傳感器需要矯正這里
- 這個參數(shù)才能使測量值很準(zhǔn)確。當(dāng)發(fā)現(xiàn)測試出來的重量偏大時,增加該數(shù)值;
- 如果測試出來的重量偏小時,減小改數(shù)值。該值可以為小數(shù)。
- ******************************************************************/
- void GPIO_Config(void){
- //io引腳初始化
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //端口配置
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHz
- GPIO_Init(GPIOA, &GPIO_InitStructure); //根據(jù)設(shè)定?
- GPIO_ResetBits(GPIOA,GPIO_Pin_8);
- }
- int main(void)
- {
- //ADCon_InitVal:HX711的AD采樣初始值
- //ADCon_CurrentVal:加載后的HX711的AD當(dāng)前采樣值
- u32 ADCon_InitVal, ADCon_CurrentVal;
- float Weight, GapValue,Adjust = 0;
- float Weight_Array[10];
- u8 i = 0,KeyIn = 5;
- delay_init(); //延時函數(shù)初始化
- KEY_Init();
- GPIO_Config();
-
- //LCD初始化
- LCD_Init(); //初始化LCD
- W25QXX_Init(); //初始化W25Q128
- font_init(); //字庫信息初始化
- LCD_Clear(BLACK); //顯示屏底色
- BACK_COLOR = BLACK;
- POINT_COLOR=GREEN; //顯示顏色
- LCD_Display_Dir(0); //默認(rèn)為豎屏
- /***********************************************************
- 本次實驗使用USART1通信口,該通信口使用USART1接收完成中斷,
- 傳輸波特率為115200
- ***********************************************************/
- //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應(yīng)優(yōu)先級
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
- uart_init(115200); //串口初始化為115200
- Init_HX711pin(); //HX711初始化
- /***********************************************************
- 讀取壓力傳感器經(jīng)HX711轉(zhuǎn)換后得到的AD轉(zhuǎn)換初始值A(chǔ)DCon_InitVal
- 進(jìn)入稱重前清0,即使ADCon_InitVal = ADCon_CurrentVal, 將十
- 進(jìn)制AD采樣值的最后3位清0,主要是因為這低三位在重量不變時仍
- 然不斷波動
- ***********************************************************/
- ADCon_InitVal = (HX711_Read() / 1000) * 1000;
- ADCon_CurrentVal = (HX711_Read() / 1000) * 1000;
- while (ADCon_InitVal != ADCon_CurrentVal) {
- ADCon_InitVal = (HX711_Read() / 1000) * 1000;
- ADCon_CurrentVal = (HX711_Read() / 1000) * 1000;
- }
- /***********************************************************
- 因為不同的傳感器特性曲線不一樣,因此,每一個傳感器需要矯正
- 這里的GapValue這個除數(shù)。當(dāng)發(fā)現(xiàn)測試出來的重量偏大時,增加該
- 數(shù)值。如果測試出來的重量偏小時,減小該數(shù)值。該數(shù)值受電阻應(yīng)
- 變片的應(yīng)變的影響,與應(yīng)變基本呈線性關(guān)系,而且當(dāng)加載的重量不
- 同時,電阻應(yīng)變片的應(yīng)變會有所不同,所以,可以將量程劃分區(qū)間,
- 各區(qū)間的GapValue值不同,以獲得比較精確的測量值
- ***********************************************************/
- GapValue = 520; //該值根據(jù)測量值進(jìn)行調(diào)整,
- while (1)
- {
- //讀取壓力傳感器經(jīng)HX711轉(zhuǎn)換后得到的AD轉(zhuǎn)換當(dāng)前值A(chǔ)DCon_CurrentVal
- ADCon_CurrentVal = (HX711_Read() / 1000) * 1000;
- if (ADCon_CurrentVal <= ADCon_InitVal)
- {
- //獲取實物的AD采樣數(shù)值。由于在沒有任何重量的情況下,
- //轉(zhuǎn)換值最后三位為非0,所以將轉(zhuǎn)換值的最后3位忽略不計
- ADCon_CurrentVal = ADCon_InitVal-ADCon_CurrentVal ;
- //計算實物的實際重量,根據(jù)實際情況可以改變GapValue的
- //值,或?qū)eight再加或減補(bǔ)償一個小數(shù)
- Weight_Array[i] = (float)ADCon_CurrentVal / GapValue;
- i++;
- //參數(shù)分段擬合
- if(Weight_Array[i]<15)
- GapValue = 502;
- else if(Weight_Array[i]<30)
- GapValue = 501;
- else if(Weight_Array[i]<45)
- GapValue = 501;
- else if(Weight_Array[i]<60)
- GapValue = 515;
- else if(Weight_Array[i]<75)
- GapValue = 516;
- else if(Weight_Array[i]<90)
- GapValue = 516;
- else
- GapValue = 520;
- }
- if(i>9)
- {
- i = 0;
- Weight = Filter(Weight_Array,10);
-
- //電腦通過串口調(diào)試助手顯示ADCon_CurrentVal
- // printf("ADCon_CurrentVal = %d \r\n", ADCon_CurrentVal);
- //電腦通過串口調(diào)試助手顯示得到的重量值,單位為g
- printf("Weight = %.3f g \r\n", Weight - Adjust-417.3);
- //Weight = (float)Weight*0.9745+0.6432; //回歸后的線性方程
- Weight = (float)Weight - Adjust; //回歸后的線性方程
- //電腦通過串口調(diào)試助手顯示得到的調(diào)整重量值,單位為g
- printf("Adjust_Weight = %.3f g \r\n", Weight-417.3);
- /* POINT_COLOR = RED;
- LCD_ShowString(30,100,300,16,24,"Pressure sensor experiment");
- POINT_COLOR = GREEN;
- LCD_ShowString(30,150,100,16,24, "Weight:");
- LCD_ShowString(74+84+65,150,12,16,24,"g");
- LCD_ShowNum(30+84,150,(int)Weight,3,24);
- LCD_ShowString(66+84,150,16,16,24,".");
- LCD_ShowNum(74+84,150,(Weight-(int)Weight)*100000,5,24);
- LCD_ShowString(250,300,200,16,24,"Sw Young");
- LCD_ShowString(30,180,200,16,24,"Weighing peeled:");
- LCD_ShowNum(30+12*16,180,Adjust*1000,5,24);
- LCD_ShowString(30+12*21,180,200,16,24,"mg"); */
- }
-
- if( Weight >800){
- GPIO_SetBits(GPIOA,GPIO_Pin_8);
- }
-
- KeyIn = KEY_Scan(1);
- if(KeyIn==WKUP_PRES)
- Adjust+=0.1;
- if(KeyIn==KEY1_PRES&&Adjust>0)
- Adjust-=0.1;
- delay_ms(80);
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
Pressure-transducer-Based-on-STM32-HX711-master.rar
(362.09 KB, 下載次數(shù): 29)
2018-11-23 03:24 上傳
點擊文件名下載附件
STM32 HX711
|
|