考慮到 Raspberry Pi 讀取模擬信號是很煩人的事情,更何況是在沒人玩的 Windows 10 IoT 下,所以準備正兒八經的寫點東西。 需求:使用 Raspberry Pi 讀取輸出模擬信號的 MQ 系列氣體感測器。(GitHub:https://github.com/ZhangGaoxi ...
考慮到 Raspberry Pi 讀取模擬信號是很煩人的事情,更何況是在沒人玩的 Windows 10 IoT 下,所以準備正兒八經的寫點東西。
需求:使用 Raspberry Pi 讀取輸出模擬信號的 MQ 系列氣體感測器。(GitHub:https://github.com/ZhangGaoxing/windows-iot-demo/tree/master/ADS1115)
由於 Raspberry Pi 3B 內部並沒有集成 ADC,因此需要外接 ADC 來進行模數轉換。外接 ADC 選用的是 ADS1115,淘寶到處都是,而且還不貴, I2C 的通訊方式實現起來相對容易些。
1. 過程分析
在 ADS1115 的數據手冊(GitHub項目中附帶了PDF)的第11頁中,官方給出了一個簡單的快速開始
(1)設置配置寄存器
(2)定位到轉換寄存器
(3)讀取轉換寄存器
2. 寄存器配置分析
瞭解了大概過程後接下來就是查寄存器的格式及配置方法了。
ADS1115 的 ADDR 介面的接法決定了地址。
地址確定後,下麵來看看寄存器的地址指針。由於我們只是簡單的讀取,只需要用到最上面的兩個指針。配置寄存器為 0x01,轉換寄存器為 0x00。
按照第一點的過程分析,第一步我們要設置配置寄存器。配置寄存器分高八位和低八位,指針定位到配置寄存器後,需要分別寫入兩個 byte 的配置數據。詳細的比特位的功能可以查下數據手冊。在這裡只介紹用的到的。
在14-12位,是 MUX 配置。簡單的說,這決定了 ADS1115 的 A0-A3 介面的測量方式。比如說,當設置為 0x04 時測量的為 A0-GND 的電壓,當設置為 0x00 時測量的為 A0-A1 間的電壓。
在11-9位,是 PGA 配置。這決定了 ADS1115 的量程。
在第8位,是 ADS1115 的狀態配置。0x00 為測量模式,0x01 為休眠。
在第7-5位,是每秒採樣次數的配置。
以上是我們需要的配置位,其他的按照數據手冊上的預設即可。即高八位 0 100 001 0(0x42),低八位 100 0 0 0 11(0x83)。需要其他的功能,按照數據手冊上的更改即可。
配置完成後,讀取數據是非常簡單的,直接讀取即可。
3. 連線
VDD - 5V
GND - GND
SCL - SCL
SDA - SDA
ADDR - GND
A0 - MQ 感測器的 A0
4. 部分代碼
詳細的代碼已經放在 GitHub 上了,這裡只給出 ADS1115.cs 的簡單介紹。
/// <summary> /// Constructor /// </summary> /// <param name="addr">ADS1115 Address</param> /// <param name="mux">Input Multiplexer</param> /// <param name="pga">Programmable Gain Amplifier</param> /// <param name="rate">Data Rate </param> public ADS1115(AddressSetting addr = AddressSetting.GND, InputMultiplexeConfig mux = InputMultiplexeConfig.AIN0, PgaConfig pga = PgaConfig.FS4096, DataRate rate = DataRate.SPS128); /// <summary> /// Initialize ADS1115 /// </summary> /// <returns></returns> public async Task InitializeAsync(); /// <summary> /// Read Raw Data /// </summary> /// <returns>Raw Value</returns> public short ReadRaw(); /// <summary> /// Convert Raw Data to Voltage /// </summary> /// <param name="val">Raw Data</param> /// <returns>Voltage</returns> public double RawToVoltage(short val); /// <summary> /// Cleanup /// </summary> public void Dispose();
5. 如何使用
第一步,需要實例化 ADS1115,並調用 InitializeAsync()。
ADS1115 adc = new ADS1115(AddressSetting.GND, InputMultiplexeConfig.AIN0, PgaConfig.FS4096, DataRate.SPS860); await adc.InitializeAsync();
第二步,讀取數據。
short raw = adc.ReadRaw(); double vol = adc.RawToVoltage(raw);
如果需要釋放,調用 adc.Dispose();
6. 運行圖