【RPi PICO】使用 PIO 获取更多 Sigma Delta ADC输入
[复制链接]
来自:https://forum.micropython.org/viewtopic.php?t=9839&p=55065#p55065
PRP2040上的ADC输入通道比较少,下面的方法可以为提供更多的ADC通道,每个通道需要2个引脚,2个电阻和2个电容。
两个电容的电荷由通过输入电阻R2和反馈电阻R1的电流平衡。PIO尝试将输入引脚上的电压保持在其低/高阈值之间。如果使用合适的输入电阻,则可以测量更高和更低的电压。
- title= "pioAdcB"
-
-
- from machine import Pin
- from rp2 import PIO, StateMachine, asm_pio
- from time import sleep
-
- maxTime=1_000_000
-
- @asm_pio(sideset_init=PIO.OUT_LOW)
- def cap_prog():
- mov(y, osr)
- mov(x, osr)
-
- label("test_pin")
- jmp(pin, "is_set")
- jmp(y_dec, "not_set")
- label("not_set")
-
- jmp(x_dec,"test_pin") .side(1)
- jmp("save_result")
-
- label("is_set")
-
- nop()
- jmp(x_dec,"test_pin") .side(0)
-
- label("save_result")
- mov(isr, y)
- push(noblock)
-
-
-
-
- class PIOCAP:
- def __init__(self, sm_id, outPin, inPin, max_count, count_freq):
- self._sm = StateMachine(sm_id, cap_prog, freq=2 * count_freq, sideset_base=Pin(outPin), jmp_pin=Pin(inPin,Pin.IN))
-
- self._sm.put(max_count)
- self._sm.exec("pull()")
-
- self._sm.active(1)
- self._max_count = max_count
-
- def getCap(self):
-
- return self._sm.get()
-
- cap = PIOCAP(0, 22, 17, max_count=(maxTime), count_freq=50_000_000)
-
- mittel=0
- while True:
- onTime= maxTime-cap.getCap()
- mittel=(9*mittel+onTime)/10
-
- print(onTime, 7.309-1.4369e-5*onTime)
- sleep(0.1)
|