使用 ADS1115 讀取模擬訊號
考慮到 Raspberry Pi 讀取模擬訊號是很煩人的事情,更何況是在沒人玩的 Windows 10 IoT 下,所以準備正兒八經的寫點東西。
由於 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. 執行圖