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。
下一章节:定时器
原文地址:https://www.cnblogs.com/iBoundary/p/11511346.html