天天看點

張高興的 Windows 10 IoT 開發筆記:使用 ADS1115 讀取模拟信号

  考慮到 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 接口的接法決定了位址。

張高興的 Windows 10 IoT 開發筆記:使用 ADS1115 讀取模拟信号
  位址确定後,下面來看看寄存器的位址指針。由于我們隻是簡單的讀取,隻需要用到最上面的兩個指針。配置寄存器為 0x01,轉換寄存器為 0x00。
張高興的 Windows 10 IoT 開發筆記:使用 ADS1115 讀取模拟信号

  按照第一點的過程分析,第一步我們要設定配置寄存器。配置寄存器分高八位和低八位,指針定位到配置寄存器後,需要分别寫入兩個 byte 的配置資料。詳細的比特位的功能可以查下資料手冊。在這裡隻介紹用的到的。

  在14-12位,是 MUX 配置。簡單的說,這決定了 ADS1115 的 A0-A3 接口的測量方式。比如說,當設定為 0x04 時測量的為 A0-GND 的電壓,當設定為 0x00 時測量的為 A0-A1 間的電壓。

張高興的 Windows 10 IoT 開發筆記:使用 ADS1115 讀取模拟信号
  在11-9位,是 PGA 配置。這決定了 ADS1115 的量程。
張高興的 Windows 10 IoT 開發筆記:使用 ADS1115 讀取模拟信号

  在第8位,是 ADS1115 的狀态配置。0x00 為測量模式,0x01 為休眠。

  在第7-5位,是每秒采樣次數的配置。

張高興的 Windows 10 IoT 開發筆記:使用 ADS1115 讀取模拟信号

  以上是我們需要的配置位,其他的按照資料手冊上的預設即可。即高八位 0 100 001 0(0x42),低八位 100 0 0 0 11(0x83)。需要其他的功能,按照資料手冊上的更改即可。

  配置完成後,讀取資料是非常簡單的,直接讀取即可。

  3. 連線

張高興的 Windows 10 IoT 開發筆記:使用 ADS1115 讀取模拟信号

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. 運作圖

張高興的 Windows 10 IoT 開發筆記:使用 ADS1115 讀取模拟信号

繼續閱讀