樹莓派進階之路 (020) - 基於24位AD轉換模塊HX711的重量稱量實驗


參考文檔: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 }

截圖:

經過測試,數據還挺穩的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM