HX720/HX711 数据采集及处理姿态解析(公式及源码)
生活随笔
收集整理的這篇文章主要介紹了
HX720/HX711 数据采集及处理姿态解析(公式及源码)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.由于世面上面普及HX711,單HX720有更大的優勢!
?
2.驅動源碼
//管腳定義 #define HX720_RCC RCC_APB2Periph_GPIOB //HX720時鐘引腳 #define HX720CLK_Port GPIOB //HX720時鐘引腳 #define HX720CLK_Pin GPIO_Pin_15 //HX720時鐘引腳 #define HX720_RCC RCC_APB2Periph_GPIOB //HX720數據引腳 #define HX720Read_Port GPIOB //HX720數據引腳 #define HX720Read_Pin GPIO_Pin_14 //HX720數據引腳 //定義 #define HX720_CLK_H() (GPIO_SetBits(HX720CLK_Port,HX720CLK_Pin)) //時鐘線置高電平 #define HX720_CLK_L() (GPIO_ResetBits(HX720CLK_Port,HX720CLK_Pin))//時鐘線置低電平 #define GetDataPinState() (GPIO_ReadInputDataBit(HX720Read_Port,HX720Read_Pin))//獲取引腳狀態//管腳初始化 // 稱引腳初始化 void BalancePortInit(void) {GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(HX720_RCC, ENABLE);GPIO_InitStructure.GPIO_Pin = HX720CLK_Pin; //時鐘 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(HX720CLK_Port, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = HX720Read_Pin;//數據GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(HX720Read_Port, &GPIO_InitStructure); }//機器周期延時 __NOP(); 1個us void DelayHX720us() {__NOP();__NOP(); }//獲取HX720數據 uint32_t GetHX720Data(void) { volatile uint32_t Count= 0;uint8_t i;HX720_CLK_L(); //使能AD(SCK置低)Count=0;while(GetDataPinState()); //AD轉換未結束則等待。否則開始讀取for (i=0;i<24;i++){HX720_CLK_H(); //SCK 置高(脈沖)//DelayHX720us();Count=Count<<1; //下降沿來時變量Count左移一位,右側補HX720_CLK_L(); //PD_SCK 置低//DelayHX720us();if(GetDataPinState()) Count++;//最右側補1}//測量128增益 10HZHX720_CLK_H();Count = Count^0x800000;//第25個脈沖下降沿來時,轉換數據 異或//Count = Count & 0x7FFFFF; //恢復//DelayHX720us();HX720_CLK_L();//DelayHX720us();//測量VBAT-VOUTHX720_CLK_H();//DelayHX720us();HX720_CLK_L();//DelayHX720us();//128增益 40HZ HX720_CLK_H();//DelayHX720us();HX720_CLK_L();//DelayHX720us();return(Count);//輸出的數據是帶符號的輸出,處理數據的時候需要把符號去掉 }3.數據分析
- 數據手冊寫 輸出數據在0x800000 - 7FFFFF之間。
- 這個數據大家很迷惑估計,上面說的是 是以二進制補碼的方式輸出的
- 0x800000 BIT=?1000 0000 0000 0000 0000 0000?? (24位)
- 0x7FFFFF BIT=??011111111111111111111111??? (24位)
- 那下面看下 補碼的定義:在計算機系統中,數值一律用補碼來表示和存儲。原因在于,使用補碼,可以將符號位和數值域統一處理;同時,加法和減法也可以統一處理,符號位都是用0表示“正”,用1表示“負”
- 這樣就不難理解了,0x800000 最高位代表負數,這樣 會出現1111 1111 1111 1111 1111 1111 - 7FFFFF 到 + 7FFFFF,這就出現一個問題 最小不是 0X800000,而是 帶符號的 FFFFFF。這是我對數據的理解
- 有個Blog也有講數據分析的? 傳送門 可以看一下
- 這樣數據如果 異或? ^0x800000?? (相同為0 相異為1)? 這樣數據就會從 0x000000 ---? FFFFFF;
- 數據這樣分析就應該理解了
4.數據的處理
- 由于 數據 ^0x800000,這樣處理數據的時候最高位 就要小心處理,避免過零點,如果 INP<INN,這樣數據是相反的,具體
- ?因此想數據直接轉換為 采集的電壓就必須注意這一點,如果 INP > INN 簡單的去掉符號位,保留有效位就得到實際值了;反之就要去掉符號位,拿7FFFFF去減有效位,得到的是實際值
5.數據的計算方式
- 看手冊是增益128? 手冊分辨率24bit,實際無噪聲是 16bit,不過算的話還是 24bit。如果采集的數據小的話 這樣可以用 16bi以下的數據就可以了,數據會準確很多吧
- 理論精度:
- 計算方式:
- 例 :INP - INN = 2Mv? (Vref單位也是Mv)
6.測量的數據轉化為溫度,誤差還是可以接受的
總結
以上是生活随笔為你收集整理的HX720/HX711 数据采集及处理姿态解析(公式及源码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Allegro 光绘文件快速导入
- 下一篇: error:cannot load dr