見出し画像

machine.ADC 使い方

先の記事「ESP32のADC補正」で紹介した通り、個人的には少々大雑把な印象のあるADCですが、特性を理解して使う分には用途が広いと思います。最近では精度を要求するセンシングには、I2Cなどデジタル出力のセンサーを用いることが多いと思います。ESP32のADCは手軽に使える点を重視して、割り切って使うのが良さそうです。

基本的な使い方と、私の使用例を紹介します。

machine.ADC クラスをインポート

次のように、machineモジュールのADCクラスをインポートします。

from machine import ADC

ピンの割付け(オブジェクト作成)

ADCに特定の端子を割り付けてオブジェクトを作成します。

adc = ADC(Pin(32))

この例では、IO32をADCとして使用するオブジェクトを adc と言う名前で作成しています。以降adcにアクセスしてIO32のADCを動かします。

減衰率と分解能を設定

減衰率はADCの最小値(0)から最大値(分解能による)までの電圧を何ボルトにするか設定します。ESP32の外付け回路に合わせて減衰率を選択します。分解能は9,10,11,12bitsから選択できるようです。私は、あれこれ使い分ける必要を感じないので12bitsを使っています。

adc.atten(ADC.ATTN_11DB)
adc.width(ADC.WIDTH_9BIT)

減衰率と信号電圧の関係は以下の通りです。

0~1V   0dB
0~1.34V -2.5dB
0~2V    -6dB
0~3.6V   -11dB

ただし、ESP32の電源電圧を超える信号電圧を加えないように回路を設計します。

測定値を読み出し

この例では変数 d に値を読み出しています。

dadc.read()

実際の使用例

以下のようなclassを作って使っています。
端子割り付けのため、machine.Pinも必要だと思います。
ADCを使う度に減衰率やら調べなおさなくて良いように、if文が並んでいますが、ご容赦ください。

from machine import Pin, ADC


class adc:          # ADC
  
  def __init__(self):
    self.pin = 34
    self.attn = 6
    self.width = 12
  
  def init_adc(self, pin, attn, width):
    # pin, attn, width
    # attn: 0 or 2 or 6 or 11
    # width: 9 or 10 or 11 or 12
    self.pin = pin
    self.attn = attn
    self.width = width
    
    self.adc = ADC(Pin(self.pin))
    if self.attn == 0:
      self.adc.atten(ADC.ATTN_0DB)      # 0-1V
    elif self.attn == 2:
      self.adc.atten(ADC.ATTN_2_5DB)    # 0-1.34V
    elif self.attn == 6:
      self.adc.atten(ADC.ATTN_6DB)      # 0-2V
    elif self.attn == 11:
      self.adc.atten(ADC.ATTN_11DB)     # 0-3.6V
      
    if self.width == 9:
      self.adc.width(ADC.WIDTH_9BIT)    # 9 bit
    elif self.width == 10:
      self.adc.width(ADC.WIDTH_10BIT)   # 10 bit
    elif self.width == 11:
      self.adc.width(ADC.WIDTH_11BIT)   # 11 bit
    elif self.width == 12:
      self.adc.width(ADC.WIDTH_12BIT)   # 12 bit
    
  def read_adc(self):         # ADC 読出し
    d = self.adc.read()
    res = int(0.9622 * d + 143.0 + 0.5)
    return res

最後の read_adc()では「ESP32のADC補正」で紹介した補正を加えた値を返しています

main では以下のようにオブジェクト ad を作成しています。
sub1 は前述のClassを含むファイルのインポート名です。

ad = sub1.adc()           # ADC
ad.init_adc(34, 11, 12)   # pin, attn, width


d = ad.read_adc()

とりあえず、これで動いています。

マイコンに興味のある同僚もおらず、独学なので修正すべき点など気が付かれましたら、教えていただけると助かります。

今後とも宜しくお願いします。





出来ればサポート頂けると、嬉しいです。 新しい基板や造形品を作る資金等に使いたいと思います。