用STM32 HX711實現了讀取壓力傳感器數據,現在數據已經能讀到了,但是傳一次數據蜂鳴器就會響一聲,很頻繁刺耳,代碼在壓縮文件里面。
單片機源程序如下:
- #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"
- /******************************************************************
- 校準參數:
- 因為不同的傳感器特性曲線不是很一致,因此,每一個傳感器需要矯正這里
- 這個參數才能使測量值很準確。當發現測試出來的重量偏大時,增加該數值;
- 如果測試出來的重量偏小時,減小改數值。該值可以為小數。
- ******************************************************************/
- 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); //根據設定?
- GPIO_ResetBits(GPIOA,GPIO_Pin_8);
- }
- int main(void)
- {
- //ADCon_InitVal:HX711的AD采樣初始值
- //ADCon_CurrentVal:加載后的HX711的AD當前采樣值
- u32 ADCon_InitVal, ADCon_CurrentVal;
- float Weight, GapValue,Adjust = 0;
- float Weight_Array[10];
- u8 i = 0,KeyIn = 5;
- delay_init(); //延時函數初始化
- 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); //默認為豎屏
- /***********************************************************
- 本次實驗使用USART1通信口,該通信口使用USART1接收完成中斷,
- 傳輸波特率為115200
- ***********************************************************/
- //設置NVIC中斷分組2:2位搶占優先級,2位響應優先級
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
- uart_init(115200); //串口初始化為115200
- Init_HX711pin(); //HX711初始化
- /***********************************************************
- 讀取壓力傳感器經HX711轉換后得到的AD轉換初始值ADCon_InitVal
- 進入稱重前清0,即使ADCon_InitVal = ADCon_CurrentVal, 將十
- 進制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這個除數。當發現測試出來的重量偏大時,增加該
- 數值。如果測試出來的重量偏小時,減小該數值。該數值受電阻應
- 變片的應變的影響,與應變基本呈線性關系,而且當加載的重量不
- 同時,電阻應變片的應變會有所不同,所以,可以將量程劃分區間,
- 各區間的GapValue值不同,以獲得比較精確的測量值
- ***********************************************************/
- GapValue = 520; //該值根據測量值進行調整,
- while (1)
- {
- //讀取壓力傳感器經HX711轉換后得到的AD轉換當前值ADCon_CurrentVal
- ADCon_CurrentVal = (HX711_Read() / 1000) * 1000;
- if (ADCon_CurrentVal <= ADCon_InitVal)
- {
- //獲取實物的AD采樣數值。由于在沒有任何重量的情況下,
- //轉換值最后三位為非0,所以將轉換值的最后3位忽略不計
- ADCon_CurrentVal = ADCon_InitVal-ADCon_CurrentVal ;
- //計算實物的實際重量,根據實際情況可以改變GapValue的
- //值,或對Weight再加或減補償一個小數
- Weight_Array[i] = (float)ADCon_CurrentVal / GapValue;
- i++;
- //參數分段擬合
- 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);
-
- //電腦通過串口調試助手顯示ADCon_CurrentVal
- // printf("ADCon_CurrentVal = %d \r\n", ADCon_CurrentVal);
- //電腦通過串口調試助手顯示得到的重量值,單位為g
- printf("Weight = %.3f g \r\n", Weight - Adjust-417.3);
- //Weight = (float)Weight*0.9745+0.6432; //回歸后的線性方程
- Weight = (float)Weight - Adjust; //回歸后的線性方程
- //電腦通過串口調試助手顯示得到的調整重量值,單位為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);
- }
- }
復制代碼
所有資料51hei提供下載:
Pressure-transducer-Based-on-STM32-HX711-master.rar
(362.09 KB, 下載次數: 29)
2018-11-23 03:24 上傳
點擊文件名下載附件
STM32 HX711
|