253|1

1万

帖子

13

资源

版主

【RPi PICO】使用 PIO 获取更多 Sigma Delta ADC输入 [复制链接]

来自:https://forum.micropython.org/viewtopic.php?t=9839&p=55065#p55065

 

PRP2040上的ADC输入通道比较少,下面的方法可以为提供更多的ADC通道,每个通道需要2个引脚,2个电阻和2个电容。

 

image.png

 

两个电容的电荷由通过输入电阻R2和反馈电阻R1的电流平衡。PIO尝试将输入引脚上的电压保持在其低/高阈值之间。如果使用合适的输入电阻,则可以测量更高和更低的电压。

 

title= "pioAdcB" # by CWE
# Adc sigma delta type

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) # OSR must be preloaded with max
    mov(x, osr)  
    
    label("test_pin") # 
    jmp(pin, "is_set") 
    jmp(y_dec, "not_set") # just count it 1
    label("not_set")
    #nop() .side(1)
    jmp(x_dec,"test_pin") .side(1) # 2
    jmp("save_result")
    
    label("is_set")
    # nop() .side(0)
    nop() # 1
    jmp(x_dec,"test_pin") .side(0) #2
    
    label("save_result")
    mov(isr, y) #.side(0) # save result; pin low
    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))
        # Use exec() to load max count into ISR
        self._sm.put(max_count)
        self._sm.exec("pull()")
        #self._sm.exec("mov(isr, osr)")
        self._sm.active(1)
        self._max_count = max_count
        
    def getCap(self):
        #self._sm.exec("push()")
        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, mittel, (onTime/maxTime))
    print(onTime, 7.309-1.4369e-5*onTime)
    sleep(0.1)

 


回复

261

帖子

2

资源

版主

感谢分享,最好把试验的结果也分享出来。

个人签名

没有什么不可以,我就是我,不一样的烟火! 


回复
您需要登录后才可以回帖 登录 | 注册

最新文章 更多>>
    关闭
    站长推荐上一条 1/6 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2021 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表