參考文檔:http://www.geek-workshop.com/thread-2315-1-1.html
參考文檔:https://wenku.baidu.com/view/e5d5e4e26529647d26285243.html
先來看一下該模塊的常用接法:
模擬輸入
通道 A 模擬差分輸入可直接與橋式傳感器的差分輸出相接。由於橋式傳感器輸出的信號較小,為了充分利用A/D 轉換器的輸入動態范圍,該通道的可編程增益較大,為128 或64。這些增益所對應的滿量程差分輸入電壓分別±20mV 或±40mV。
通道B 為固定的32 增益,所對應的滿量程差分輸入電壓為±80mV。通道B 應用於包括電池在內的系統參數檢測。
供電電源
數字電源(DVDD)應使用與MCU 芯片相同的的數字供電電源。HX711 芯片內的穩壓電路可同時向 A/D 轉換器和外部傳感器提供模擬電源。穩壓電源的供電電壓(VSUP)可與數字電源(DVDD)相同。穩壓電源的輸出電壓值(VAVDD)由外部分壓電阻R1、R2 和芯片的輸出參考電壓VBG 決定(圖1),VAVDD=VBG(R1+R2)/R2。應選擇該輸出電壓比穩壓電源的輸入電壓(VSUP)低至少100mV。
如果不使用芯片內的穩壓電路,管腳VSUP應連接到DVDD 或AVDD 中電壓較高的一個管腳上。管腳VBG 上不需要外接電容,管腳VFB 應接地,管腳BASE 為無連接。時鍾選擇如果將管腳 XI 接地,HX711 將自動選擇使用內部時鍾振盪器,並自動關閉外部時鍾輸入和晶振的相關電路。這種情況下,典型輸出數據速率為10Hz 或80Hz。如果需要准確的輸出數據速率,可將外部輸入時鍾通過一個20pF 的隔直電容連接到XI管腳上,或將晶振連接到XI 和XO 管腳上。這種情況下,芯片內的時鍾振盪器電路會自動關
閉,晶振時鍾或外部輸入時鍾電路被采用。此時,若晶振頻率為11.0592MHz, 輸出數據速率為准確的10Hz 或80Hz。輸出數據速率與晶振頻率以上述關系按比例增加或減少。使用外部輸入時鍾時,外部時鍾信號不一定需要為方波。可將MCU 芯片的晶振輸出管腳上的時鍾信號通過20pF 的隔直電容連接到XI管腳上,作為外部時鍾輸入。外部時鍾輸入信號的幅值可低至150mV。
串口通訊
串口通訊線由管腳PD_SCK 和DOUT 組成,用來輸出數據,選擇輸入通道和增益。當數據輸出管腳DOUT 為高電平時,表明
A/D 轉換器還未准備好輸出數據,此時串口時鍾輸入信號PD_SCK 應為低電平。當DOUT 從高電平變低電平后,PD_SCK 應輸入25 至27 個不等的時鍾脈沖(圖二)。其中第一個時鍾脈沖的上升沿將讀出輸出24 位數據的最高位(MSB),直至第24 個時鍾脈沖完成,24 位輸出數據從最高位至最低位逐位輸出完成。第25至27 個時鍾脈沖用來選擇下一次A/D 轉換的輸入通道和增益,參見表三。
PD_SCK 脈沖數輸入通道 增益
時序圖
PD_SCK 的輸入時鍾脈沖數不應少於25 或多於27,否則會造成串口通訊錯誤。當A/D 轉換器的輸入通道或增益改變時,A/D 轉換器需要4 個數據輸出周期才能穩定。DOUT 在4 個數據輸出周期后才會從高電平變低電平,輸出有效數據。
樹莓派代碼:
1 # include <stdio.h> 2 # include <unistd.h> 3 # include <wiringPi.h> 4 # include <hiredis/hiredis.h> 5 6 /*-----------------結構體-----------------*/ 7 struct hx711_pin{ 8 int SCK; 9 int SDA; 10 int EN; //校准使能 11 int calibration; //校准 12 int coefficient; //比例系數 13 int weight; //重量 14 unsigned long value; //記錄數值 15 }; 16 17 void set_pin(struct hx711_pin *value){ 18 value->SCK = 4; 19 value->SDA = 5; 20 value->EN = 1; 21 value->coefficient = 415; 22 } 23 24 void init_pin(struct hx711_pin *value){ 25 pinMode(value->SCK,OUTPUT); 26 pinMode(value->SDA,INPUT); 27 pullUpDnControl(value->SDA,PUD_UP); 28 } 29 30 void start(struct hx711_pin *value){ 31 int i; 32 digitalWrite(value->SCK,LOW); //使能AD 33 while(digitalRead(value->SCK)); 34 value->value = 0; //數值 35 while(digitalRead(value->SDA)); //AD轉換未結束則等待。 36 usleep(1); 37 for(i=0;i<24;i++){ 38 digitalWrite(value->SCK,HIGH); 39 while(0 == digitalRead(value->SCK))usleep(1); 40 value->value = value->value*2; 41 digitalWrite(value->SCK,LOW); 42 while(digitalRead(value->SCK)); 43 if(digitalRead(value->SDA)) 44 value->value = value->value + 1; 45 } 46 digitalWrite(value->SCK,HIGH); 47 digitalWrite(value->SCK,LOW); 48 if((value->EN == 1)&&(value->value<25000)){ 49 value->EN = 0; 50 value->calibration = value->value; 51 }else { 52 i = (value->value-value->calibration+50)/value->coefficient; 53 } 54 if(i<5000)value->weight = i; 55 printf("重量為:%d g\n",value->weight); 56 } 57 58 /*-----------------主體-----------------*/ 59 int setup(struct hx711_pin *value){ 60 if(wiringPiSetup()==-1)return 1; 61 set_pin(value); 62 init_pin(value); 63 return 0; 64 } 65 66 void loop(struct hx711_pin *value){ 67 while(1) 68 start(value); 69 } 70 71 int main(void){ 72 struct hx711_pin value; 73 if(0 == setup(&value)) 74 loop(&value); 75 return 0; 76 }
截圖:
經過測試,數據還挺穩的。