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。

下一章节:定时器

原文地址:https://www.cnblogs.com/iBoundary/p/11511346.html

时间: 2024-10-27 17:47:58

Pyboard基本功能---ADC模数转换/DAC数模转换的相关文章

1.7 ADC模数转换测电平(普通和DMA模式)

嵌入式系统在微控制领域(温度,湿度,压力检测,四轴飞行器)中占据着重要地位,这些功能的实现是由微处理器cpu(如stm32)和传感器以及控制器共同完成的,而连接他们,使它们能够互相正常交流的正是本小节要讲诉的模块,ADC模数转换外设.下面从最简单的实验说起,逐渐深入了解这个神奇的外设. 本次ADC模数转换设计实现并不复杂,步骤可简化为以下三步: 1. 接收板上电位器的输入电压 2. 经过A/D转换获得数字量,并传送给cpu 3. 通过串口在PC机上输出. 解析上面三个步骤,分析要求,就会发现AD

LPC1788的ADC和DAC使用

#ifndef __ADC1_H_ #define __ADC1_H_ #include "common.h" #include "delay.h" void adc_init(u8 ch,u8 div); u16 adc_cover(u8 ch); #endif #include "adc1.h" void adc_init(u8 ch,u8 div)//最大时钟不得大于12.4M { //打开ADC和IO口时钟 LPC_SC->PCON

对ADC(DAC)的线性度(INL和DNL)的一点理解 [转]

大家在使用ADC的时候,往往最关注位数,而对ADC的线性度往往会忽略. 其实这个线性度也是ADC非常重要的指标,ADC(或DAC,其实ADC也是由DAC组成的)线性度指标有两个: INL:翻译过来叫“积分非线性”,指的是ADC整体的非线性程度. DNL:翻译过来叫“微分非线性”,指的是ADC局部(细节)的非线性程度. 我们通常讲的“线性度”都是指“积分非线性”,积分非线性一般以百分比给出,或者以位数给出.举个例子:AD7705(16位)的datasheet上说有0.003%的非线性.1LSB为1

stm32F103之ADC模数转换

一.ADC简介 通常是指一个将模拟信号转变为数字信号的电子元件.通常的模数转换器是把经过与标准量比较处理后的模拟量转换成以二进制数值表示的离散信号的转换器.  12位ADC是一种逐次逼近型模拟数字转换器.它有多达18个通道,可测量16个外部和2个内部信号源.各通道的A/D转换可以单次.连续.扫描或间断模式执行.ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中. 模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值. 二.ADC功能框图 掌握了ADC 的功能框图,就可以对A

ADC and DAC Analog Filters for Data Conversion

Figure 3-7 shows a block diagram of a DSP system, as the sampling theorem dictates it should be. Before encountering the analog-to-digital converter, the input signal is processed with an electronic low-pass filter to remove all frequencies above the

Pyboard基本功能---UART

原文地址:https://www.cnblogs.com/iBoundary/p/11516976.html

cortex_m3_stm32嵌入式学习笔记(十八):DAC实验(数模转换)

STM32 的 DAC 模块(数字/模拟转换模块)是 12 位数字输入,电压输出型的 DAC. DAC可以配置为 8 位或 12 位模式,也可以与 DMA 控制器配合使用. DAC 工作在 12 位模式时,数据可以设置成左对齐或右对齐. DAC 模块有 2 个输出通道,每个通道都有单独的转换器.在双 DAC 模式下, 2 个通道可以独立地进行转换,也可以同时进行转换并同步地更新 2 个通道的输出. 本节实验,我们将利用按键(或 USMART) 控制 STM32 内部 DAC1来输出电压,通过 A

TPYBoard开发板ADC数模转换一: 初识ADC使用

转载请以链接形式注明文章来源,公众号:MicroPython玩家汇 1.前言 ADC,Analog-to-DigitalConverter的缩写,指模/数转换器或者模数转换器[1].是指将连续变化的模拟信号转换为离散的数字信号的器件.真实世界的模拟信号,例如温度.压力.声音或者图像等,需要转换成更容易储存.处理和发射的数字形式. 与之相对应的DAC,Digital-to-AnalogConverter,它是ADC模数转换的逆向过程. ADC在单片机开发过程中使用广泛,多样该文为ADC系列文章第一

【二代示波器教程】第11章 示波器设计—功能模块划分

第11章      示波器设计-功能模块划分 二代示波器的界面上做了五个按钮,分别用于不同功能的配置,本章节就为大家讲解这五个按钮实现的功能. 11.1   主界面上的五个按钮 11.2    Measure测量功能 11.3    ADC电压测量功能 11.4    DAC信号发生器 11.5    Math数字信号处理 11.6    Settings设置 11.7    总结 11.1  主界面上的五个按钮 为了方便各个功能的配置,主界面右侧做了五个按钮,用于实现五个不同功能的配置. 代码