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