hx711是一款用得比較多的器件,該芯片與后端MCU 芯片的接口和編程非常簡單,所有控制信號由管腳驅動,無需對芯片內部的寄存器編程。輸入選擇開關可任意選取通道A 或通道B,與其內部的低噪聲可編程放大器相連。hx711接單片機的方法都是大同小異的,那么hx711模塊接32位單片機哪個引腳了?比如STM32。
首先我們要知道hx711模塊是要求5V左右提供電工作電壓,而且芯片手冊有個要求:數字電源(DVDD)應使用與 MCU 芯片相同的的數字供電電源。
一般情況下與32位單片機接的引腳主要三個。
11 腳PD_SCK 數字輸入 斷電控制(高電平有效)和串口時鐘輸入
12 腳 DOUT 數字輸出 串口數據輸出
16 腳 DVDD 電源 數字電源: 2.6 ~ 5.5V
供電電源
數字電源(DVDD)應使用與MCU 芯片相同的的數字供電電源。HX711 芯片內的穩壓電路可同時向 A/D 轉換器和外部傳感器提供模擬電源。穩壓電源的供電電壓(VSUP)可與數字電源(DVDD)相同。穩壓電源的輸出電壓值(VAVDD)由外部分壓電阻R1、R2 和芯片的輸出參考電壓VBG 決定,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 轉換的輸入通道和增益。
上圖為HX711芯片應用于計價秤的一個參考電路圖。該方案使用內部時鐘振蕩器(XI=0),10Hz的輸出數據速率(RATE=0)。電源(2.7~5.5V)直接取用與MCU 芯片相同的供電電源。通道A與傳感器相連,通道B通過片外分壓電阻與電池相連,用于檢測電池電壓。
HX711在Arduino上的接線方式
1. VCC 可以是 2.6-5.5 中的任意值,因為我們使用的是 Arduino ,所以直接5V供電,GND 接地。
2. SCK 接 Arduino 的 Pin 9,DT 接 Pin10,這兩個接腳可以在程序中改變。
3. E+、E-、A+ 和 A- 分別接橋式傳感器的:激勵電壓正、負,輸出電壓正、負
(E+ 接紅線;E- 接黑線;A+ 接綠或藍線;A- 接白線)。
4. B+ 和 B- 接通道B的傳感器,也可以通過分壓電路接電源,用來檢測電源電壓。不用的話最好接GND,不過有網友試驗不接也沒問題。
示例代碼
#include 《HX711.h》 // 包含庫的頭文件
HX711 hx(9, 10); // 數據接腳定義
void setup() {
Serial.begin(9600);
}
void loop()
{
double sum = 0; // 為了減小誤差,一次取出10個值后求平均值。
for (int i = 0; i 《 10; i++) // 循環的越多精度越高,當然耗費的時間也越多
sum += hx.read(); // 累加
Serial.println(sum/10); // 求平均值進行均差
}
給的示例程序非常簡單,但是我查看庫中含有很多示例沒有給出的函數:
HX711(byte sck, byte dout, byte amp = 128, double co = 1); // 定義 sck、dout 接腳,增益倍數(默認128)和修正系數(默認1)
void set_amp(byte amp); // 改變增益倍數和對應的通道,至少調用一次 read() 后起作用
bool is_ready(); // 返回 hx711 是否可用,在 read() 函數中會被調用
long read(); // 返回傳感器電壓值,如果 hx711 不可用則程序會暫停在此函數
double bias_read(); // 返回:(read() - 偏移值) * 修正系數
void tare(int t = 10); // 將皮重添加到偏移值,影響每次 read(); 的調用
void set_co(double co = 1); // 修改修正系數(默認為1)
void set_offset(long offset = 0); // 修改偏移值(默認為0)
可以看到,HX711還可以使用四參數方式定義,同時指定增益倍數及修正系數。在程序運行中還可以隨時改變增益倍數,修正系數以及利用偏移值實現去皮重等功能,非常實用。
這里唯一需要解釋的是第一個函數,
HX711 hx(9, 10); // 這樣用說明只定義SCK和DOUT接腳,AMP默認使用A通道的128位增益,修正系數默認為1;
HX711 hx(9, 10, 64); // 這樣用說明定義SCK和DOUT接腳,AMP使用A通道的64增益,修正系數默認為1;
HX711 hx(9, 10, 32, 1.4); // 這樣用說明定義SCK和DOUT接腳,AMP使用B通道的32位增益,修正系數為1.4;
這里有關通道和增益倍數的選擇,資料中已經提及過,A通道只有128和64位兩種增益倍數,對應滿載電壓為 20mV 和 40mV,B通道只有固定的32位增益倍數,滿載電壓為 80mV,使用時各個通道輸入電壓不要超過對應增益倍數的滿載電壓。當然,程序中額可以隨時切換增益倍數和通道,使用set_amp(amp)函數即可,當然,amp 的值只能是 128、64或32。
再強調一句,如果增益倍數選擇32位增益,那么讀出的數據就是B通道的。
評論
查看更多