使用 ADS1115 MicroPython 程式庫讀取 ADC
這個板子因為非常常見, 所以也可以找到 ADS1115 , 這一切看似美好, 可是同事實測的時候發現, 依序讀取 0,1,2,3 通道, ADC 值時, 卻是讀到通,23如下:
from machine import I2C, Pin, Timer
import time
import ads1x15 # 匯入程式庫
addr1 = 72 # 設定 I2C 位址
gain = 1 # 設定偵測範圍為 0~4.096V
rate=6 # 設定取樣率為 475Hz
i2c = I2C(scl=Pin(5), sda=Pin(4),freq=400000) # 建立 I2C 物件
ads1 = ads1x15.ADS1115(i2c, addr1, gain) # 建立擴充板物件
def get1vol(cha): # 讀取指定通道的 ADC 值
ads1.set_conv(rate=rate,channel1=cha) # 設定通道等參數
raw1 = ads1.read_rev() # 讀取 ADC 值
vol1 = ads1.raw_to_v(raw1) # 轉換為電壓
return vol1
while True:
time.sleep(0.1) # 每 01 秒讀取 1 次
vol1=get1vol(0) # 讀取通道 0 ADC 值
vol2=get1vol(1) # 讀取通道 1 ADC 值
vol3=get1vol(2) # 讀取通道 2 ADC 值
vol4=get1vol(3) # 讀取通道 3 ADC 值
print("%2.2f, %2.2f, %2.2f, %2.2f" % (vol1, vol2, vol3, vol4))
仔細看了一下 MicroPython 程式庫 , 發現他所使用的 set_conv() 和 read_rev() 這一對方法的用法是比較奇特的, set_conv() 會設定下一次要讀取通道編號任用 用 read_rev () 時 讀取 讀取 的 的 adc 值當 作 作 回值 回值 回值, 然後 依據 目前 目前 設定 的 的 通道 編號 以及 採樣率 啟動 讀取 讀取 讀取 adc 值 的 的 程序 就 返回. 也就 是 說 說 說 說 說 說 並不 並不 是 傳回 傳回 傳回 這 一 次 的 的 的 的adc 值. 值 的 作法 作法 主要 是 為了 節省 節省 時間 時間 時間 時間, 在 叫 用 用 用 用 用 re read_rev ()의會有同事遇到的怪現象, 舉來說來, 同事使用上述程式依序讀取 0,1,2,3 通道, 就會變成這樣:
ads1.rset_conv(rate=rate,channel1=0)
raw1 = ads1.read_rev() # 傳回前一次讀 channel ? 的數值, 然後依據目前設定讀 channel 0 的值
ads1.rset_conv(rate=rate,channel1=1)
raw1 = ads1.read_rev() # 傳回前一次讀 channel 0 的數值, 然後依據目前設定讀 channel 1 的值
ads1.rset_conv(rate=rate,channel1=2)
raw1 = ads1.read_rev() # 傳回前一次讀 channel 1 的數值, 然後依據目前設定讀 channel 2 的值
ads1.rset_conv(rate=rate,channel1=3)
raw1 = ads1.read_rev() # 傳回前一次讀 channel 2 的數值, 然後依據目前設定讀 channel 3 的值
ads1.rset_conv(rate=rate,channel1=0)
raw1 = ads1.read_rev() # 傳回前一次讀 channel 3 的數值, 然後依據目前設定讀 channel 0 的值
ads1.rset_conv(rate=rate,channel1=1)
raw1 = ads1.read_rev() # 傳回前一次讀 channel 0 的數值, 然後依據目前設定讀 channel 1 的值
ads1.rset_conv(rate=rate,channel1=2)
raw1 = ads1.read_rev() # 傳回前一次讀 channel 1 的數值, 然後依據目前設定讀 channel 2 的值
ads1.rset_conv(rate=rate,channel1=3)
raw1 = ads1.read_rev() # 傳回前一次讀 channel 2 的數值, 然後依據目前設定讀 channel 3 的值
...
如果覺得這樣很怪, 可以改用同一程式庫的文件 , 將程式中的 get1vol() 函式改寫成這樣:
def get1vol(cha):
raw1 = ads1.read(rate, cha) # 讀取指定通道的 ADC 值
vol1 = ads1.raw_to_v(raw1) # 轉換為電壓
return vol1
read() 方法會啟動讀取 ADC 值的程序, 等待取樣完成並且轉換成數位值後才會返回.至於要用哪一種,
Reference
이 문제에 관하여(使用 ADS1115 MicroPython 程式庫讀取 ADC), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/codemee/ads1115-micropython-adc-4ao7텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)