簡 介: 本文給出了 MicroPython內核開發筆記:書內嵌入實驗任務 中的ADC軟件用例部分內容。
關鍵詞
:MicroPython,MM32F3277
軟件用例:
這部分書稿內容包括有:
1.
2.
- 書稿內位置:
在MM32F3277中 ADC總共 有16 個通道,對應外部端口分別是:
CH0~7
:PA0 ~ PA7 CH8,CH9
: PB0, PB1 CH10~CH13
:PC0 ~ PC3 CH14,CH15
:NULL 下面代碼是讀取 ADC0 通道,對應 PA0 管腳上的電壓。 請注意,第一個 ADC 初始化的時候,需要將 init=True 參數代入。
讀取 ADC 轉換數值是通過 read_u16() 函數,它返回 0 ~ 0xffff 之間的數值,對應 ADC 輸入電壓 從 0V 到 參考電壓(3.3V) 之間的數值。
from machine import Pin,ADC,DAC
import utime
adc0 = ADC(0, init=True)
while True:
print(adc0.read_u16())
utime.sleep_ms(200)
通過電位器,手工調節 PA0 管腳的電壓,觀察程序輸出的數值,可以查看到隨著輸入電壓增加, ADC 轉換數值從 0 到 0xffff 變化。
在應用中,ADC轉換速率是一個關鍵參數。下面代碼通過讀取 1024 個 ADC 轉換值,測量總共所需要的時間,可以確定 ADC 最大轉換速率。
from machine import ADC
import time
adc0 = ADC(0, init=True)
BUF_LENGTH = 1024
buf = [0] * BUF_LENGTH
startc = time.ticks_cpu()
for i in range(BUF_LENGTH):
buf[i] = adc0.read_u16()
endc = time.ticks_cpu()
print(endc - startc)
while True:
pass
程序運行,輸出結果為 25。 這表明通過 MicroPython 采集 1024 個 ADC數值 大約花費 25ms。 因此,最高的采樣頻率可以達到 40kHz 左右。
下面代碼演示了從ADC讀取數據之後,然後通過DAC通道將信號輸出。
from machine import DAC,ADC
import time
adc = ADC(0, init=True)
dac = DAC(0)
print("ADC to DAC .")
nowtime = time.ticks_ms()
while True:
dac.write_u16(adc.read_u16())
while True:
if time.ticks_ms() != nowtime:
nowtime = time.ticks_ms()
break
代碼中應用了 time 讀取系統時間,控制采樣頻率為 1kHz。
使用信號源,在 PA0 管腳輸入 頻率為 100Hz, 峰峰值為 1V,均值為 1.5V 的正弦波信號。下面顯示了輸入信號ADC信號與輸出DAC信號。
▲ 圖1.2.1 輸入ADC采集信號與輸出DAC信號
通過上述波形,可以看到在正弦波 一個周期(10ms)內完成了 8 次 AD,DA轉換,這個實驗結果也是驗證了,當前MicroPython內核中 time 延時存在系統誤差。實際延時時間需要乘以 1.25 倍。
本文給出了 MicroPython內核開發筆記:書內嵌入實驗任務 中的ADC軟件用例部分內容。
第二個實驗中,由於需要使用到 time 讀取系統時間,會發現,現在這個版本中的 time 讀取的時間存在著系統誤差。 與實際的時間之間相差 1.25倍,估計還是在內核實現中,對於CPU 內部基准頻率常量沒有設置正確所引起的。
■ 相關文獻鏈接:
● 相關圖表鏈接: