Pyboard基本功能---ADC模數轉換/DAC數模轉換


ADC模數轉換

1.獲取ADC類里面的方法

>>> help(pyb.ADC)
object <class 'ADC'> is of type type
  read -- <function>
  read_timed -- <function>
  read_timed_multi -- <staticmethod>
>>>

ADC (模擬信號轉換為數字量)是嵌入式中最常用的功能之一,在MicroPython 同樣也提供了相應的函數,可以直接讀取 ADC 轉換的結果。在pyboard中,我們需要先導入ADC模塊,再指定一個ADC使用的GPIO,然后就可以讀取指定GPIO上ADC轉換的結果了:

>>> from pyb import ADC,Pin
>>> v = ADC(Pin.cpu.A0)  #定義ADC對象
>>> v
<ADC on Pin(Pin.cpu.A0, mode=Pin.ANALOG) channel=0>
>>> v.read()  #讀取ADC結果
1005

通過read()函數讀取的ADC結果是12位的,數值范圍為0~4095。

這個方法非常簡單,但是不夠靈活,不能設置 ADC 轉換的參數。因此在pyboard 中,還另外提供了一種使用 ADC 的方法,它先用 ADCAll 函數設置ADC的轉換位數,然后用read_channel()函數讀取指定通道的ADC轉換結果。

2.獲取ADCALL類

>>> help(pyb.ADCAll)
object <class 'ADCAll'> is of type type
  read_channel -- <function>
  read_core_temp -- <function>
  read_core_vbat -- <function>
  read_core_vref -- <function>
  read_vref -- <function>
>>>

 實例:

>>> adc = pyb.ADCAll(8)  #設置轉換的位數可以是8、10或12
>>> adc
<ADCAll>
>>> adc.read_channel(0)  #讀取通道0:PA0
68
>>> adc.read_channel(2)  #讀取通道2:PA2
40
>>>

 pyb.ADCAll()函數會影響所有的ADC端口,因此這兩種ADC的方法不要混合使用。

在不需要高精度ADC時,可以通過降低ADC的位數來提高轉換速度,還可以通過pyb.ADCAll()讀取內部傳感器。

上面介紹的第二種ADC方法還有一個優點,就是可以讀取芯片內部的溫度傳感器、vbat電壓和基准電壓等參數。

>>> adc.read_core_temp()  #讀取內部溫度傳感器
35.23636245727539
>>> adc.read_core_vbat()  #讀取vbat電壓
0.1192673966288567
>>> adc.read_core_vref()  #讀取內部基准verf電壓
1.209596991539001
>>>

注意讀取內部傳感器時,盡量將ADC位數設置高一些,這樣轉換結果的誤差才比較小。

DAC模數轉換

1.獲取DAC類里面的方法

>>> help(pyb.DAC)
object <class 'DAC'> is of type type
  init -- <function>
  deinit -- <function>
  write -- <function>
  noise -- <function>
  triangle -- <function>
  write_timed -- <function>
  NORMAL -- 0
  CIRCULAR -- 256
>>>

 在PYB V10上,使用了STM32F45RG控制器,它包含兩路DAC。利用DAC,我們可以產生0~3.3V的電壓,也可以產生各種波形,甚至播放音樂。DAC的基本用法是:

>>> from pyb import DAC
>>> dac = DAC(1)  #X5引腳作為DAC輸出
>>> dac.write(128)  #輸出1.65V(默認8位精度) 
>>> dac = DAC(1,bits=12) #設置DAC1為12位精度
>>> dac.write(4095) #輸出3.3V

因為PYB V10有兩路DAC,所以DAC函數的參數可以是1或2,分別對應這兩路硬件DAC輸出。它們對應的GPIO是X5和X6,也就是PA4和PA5。

注意一些STM32控制器中沒有DAC模塊,這樣的pyboard不能使用DAC功能。

 

1.三角波

 

pyb模塊中的DAC模塊已經自帶了三角波功能,我們通過triangle()函數就可以自動產生三角波。函數的參數代表 DAC 刷新的頻率,而一個三角波包含2048個點,因此函數的參數除以2048就代表三角波的頻率。(HZ)

>>> from pyb import DAC
>>> dac = DAC(1)
>>> dac.triangle(204800)

 

 

 2.輸出正弦波

利用DAC,我們可以輕松實現簡易正弦波發生器。

>>> import math
>>> from pyb import DAC
#創建正弦波的緩存
>>> buf = bytearray(100)
>>> for i in range(len(buf)):
...     buf[i] = 128 + int(127*math.sin(2*math.pi*i/len(buf)))
...
#以400HZ頻率輸出正弦波
>>> dac = DAC(1)
>>> dac.write_timed(buf,400*len(buf),mode=DAC.CIRCULAR)

這段程序中,我們首先計算正弦波的數據,並將它保存到一個數組中;然后使用 write_timed 函數周期改變 DAC,從而產生正弦波。write_timed函數默認使用定時器6,因此使用dac時不要修改定時器6的參數。

 

 

 上面的正弦波是8位精度的,波形會有鋸齒感。如果改成12位精度,波形就會平滑多了。

>>> import math
>>> from array import array
>>> from pyb import DAC
#創建正弦波緩存,使用12位精度
>>> buf = array('H',2048+int(2047*math.sin(2*math.pi*i/128))for i in range(128))
>>> buf
array('H', [2048, 2148, 2248, 2348, 2447, 2545, 2642, 2737, 2831, 2923, 3012, 3100, 3185, 3267, 3346, 3422, 3495, 3564, 3630, 3692, 3750, 3803, 3853, 3898, 3939, 3975, 4006, 4033, 4055, 4072, 4085, 4092, 4095, 4092, 4085, 4072, 4055, 4033, 4006, 3975, 3939, 3898, 3853, 3803, 3750, 3692, 3630, 3564, 3495, 3422, 3346, 3267, 3185, 3100, 3012, 2923, 2831, 2737, 2642, 2545, 2447, 2348, 2248, 2148, 2048, 1948, 1848, 1748, 1649, 1551, 1454, 1359, 1265, 1173, 1084, 996, 911, 829, 750, 674, 601, 532, 466, 404, 346, 293, 243, 198, 157, 121, 90, 63, 41, 24, 11, 4, 1, 4, 11, 24, 41, 63, 90, 121, 157, 198, 243, 293, 346, 404, 466, 532, 601, 674, 750, 829, 911, 996, 1084, 1173, 1265, 1359, 1454, 1551, 1649, 1748, 1848, 1948])
>>> dac = DAC(1,bits=12)
#輸出400HZ的正弦波
>>> dac.write_timed(buf,400*len(buf),mode=DAC.CIRCULAR)

3.產生噪聲

使用DAC模塊的noise()函數還可以生成偽隨機噪聲,如圖所示,在產品測試、模擬信號仿真等應用上可以用到這個功能。

>>> from pyb import DAC
>>> dac = DAC(1)
>>> dac.noise(500)  #在DAC1上輸出噪聲信號

noise()函數的參數是噪聲的頻率。

 

 

4.播放音樂

大家可能都知道使用DAC可以播放wav文件。PYB V10上帶有兩路DAC,也可以播放音樂。當然受限於MCU的資源,目前只能播放WAV文件。而因為STM32F405的SRAM不是太大,所以不能直接播放太大的文件。

為了播放wave文件,我們首先要下載wave庫和chunk庫,然后准備wav文件,並將wav文件轉換成8比特單聲道格式,因為目前wave庫只能識別這個格式。

再將上面的文件都復制到SD卡或者PYBFlash磁盤的根目錄,按下Ctrl-D復位,讓pyboard可以識別到新增加的文件。

最后輸入下面的代碼,將X5輸出信號連接到耳機或者音箱的輸入,就可以聽到音樂了。

 

 參考文件:

http://microPython.org/resources/examples/wave.py

http://microPython.org/resources/examples/chunk.py

http://microPython.org/resources/examples/test.wav

注: 如果在import wave時出現錯誤,請將文件wave.py中的_collections改為collections。

下一章節:定時器

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM