zoukankan      html  css  js  c++  java
  • 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。

    下一章节:定时器

  • 相关阅读:
    hdu 5646 DZY Loves Partition
    bzoj 1001 狼抓兔子 平面图最小割
    poj 1815 Friendship 最小割 拆点 输出字典序
    spoj 1693 Coconuts 最小割 二者取其一式
    hdu 5643 King's Game 约瑟夫环变形
    约瑟夫环问题
    hdu 5642 King's Order
    CodeForces 631C Report
    1039: C语言程序设计教程(第三版)课后习题9.4
    1043: C语言程序设计教程(第三版)课后习题10.1
  • 原文地址:https://www.cnblogs.com/iBoundary/p/11511346.html
Copyright © 2011-2022 走看看