树莓派PICO任意波形发生器

树莓派 PICO 和 RP2040 相关应用讨论
回复
头像
shaoziyang
帖子: 1875
注册时间: 2019年 10月 21日 13:48

树莓派PICO任意波形发生器

#1

帖子 shaoziyang » 2021年 5月 3日 17:41

图片

图片

这是 Arduino 任意波形发生器 (Arbitrary waveform generator, AWG) 的增强版,毕竟 PICO 的控制器性能要强大很多:总线宽度是4倍、时钟频率是8倍、RAM是130倍以及更多。 

基于 Arduino 的 AWG 性能大约是381ksps,而PICO版本的AWG速度增加了300倍,从381ksps提升到125Msps。为了简单和降低成本,这里没有为产生的信号提供缓冲器或放大器,因此产生的信号相当微弱,输出阻抗约为1K欧姆,最大输出电流约为1毫安。  


所需材料 
  • 焊接排针的树莓皮PICO
  • 1个5x7cm洞洞板
  • 2个20针排母
  • 23个2kOhm左右的电阻
图片


原理图  

pico本身没有数模转换器(DAC),不能产生模拟信号,因此这里使用的经典的R2R 电阻网络产生模拟信号。8位DAC需要7个电阻值R电阻器和9个电阻值2R电阻器。R的实际电阻值并不重要,但重要的是所有电阻的值都相同。在实践中,最好使用23个2R电阻器,并将7对电阻器并联起来。1K欧姆到10K欧姆之间的电阻都可以。较小的电阻值需要Pico提供更大的电流,而较大的电阻值将导致性能变差,因为在高频时,电流太小,无法抵消寄生电容和电感。 

图片


程序  

图片

pico可以用C或micropython编程。使用micropython要容易得多。虽然Micropython可能比C慢100倍,但在这里这并不重要。代码的功能是通过一个波形数组,控制引脚产生波形。CPU处于空闲状态,可以自由执行其他任务。 

先更新micropython固件,然后通过Thonny上传python脚本。

代码可以产生数百个波形。要修改它,请在第155行并设置。 有6种基本脉冲波形:正弦波、脉冲、高斯、sinc、指数和噪声。正弦波没有额外的参数,但脉冲有3个参数:上升时间、运行时间和下降时间;高斯sinc指数有一个参数:宽度;噪声有一个参数决定输出值的pdf,从1(平坦)到8或更大(近似高斯)。 

波有形状,也有振幅和偏移量。形状可以在一段时间内复制,从而增加其频率。这样,像求和或乘法这样的运算可以用不同频率的波来完成。也可以设置非零相位,但其效果只有在组合波时才明显。 波可以通过与另一个波叠加、相乘或相位调制进行组合,由此产生组合波。图中仅仅展示了其中几个。 

图片

图片

图片

即使在组合波时,频率也只有一个值。操作不是由 CPU 直接执行,而是通过 DMA 输出存储的波形。关键字“duplication”允许形状以(基本)频率的两倍、三倍、四倍等值填充。 缓冲区大小(maxnsamp的值)决定了形状的复杂程度、频率等设置。对于简单波,如单正弦或宽脉冲,1024个样本就足够了。实际最大缓冲区大小为65536(64kB)。填充缓冲区可能需要20-60秒!  程序说明

代码可能看起来很晦涩:大部分代码是基于直接访问寄存器,需要研究RP2040芯片的数据手册才能理解。 

关键的外围设备是芯片的直接存储器访问(DMA)模块。可以指示DMA在存储器和外围设备之间执行块拷贝,而不需要CPU的干预。这就像有一个助理,你告诉他为你购物! 

DMA 将数组的内容和波形一起传输到另一个外围设备(PIO),后者将把输出到引脚上。一个复杂的问题是DMA需要周期性地、不间断地进行。为此,第二DMA信道被指示在第一DMA信道完成后立即重新配置和重新启动。这称为“链接”。通道0进行数据传输,并将接力棒传递到通道1,通道1通知通道0重新启动。 

DMA不能直接控制管脚,但有更好的方法:pico有2个可编程输入/输出(PIO)单元,它们本身有4个处理单元(称为“状态机”)。它们实际上是微控制器内部的8个微型微控制器。在这里,只使用了一个状态机,它是用一个命令编程,命令是"out(pins,8)",它指示状态机将8位数据从其缓冲区传递到输出引脚,仅此而已。代码包括下面​几个部分:​ 
  • DMA的配置
  • PIO的配置与编程
  • 用波形填充数组
  • 启动DMA
波形产生后,CPU 就可以自由地执行其他任务。  

改进建议

下面是一些关于如何改进它的想法:
  • 更高的分辨率(10或12位),和/或第二个通道。
  • RP2040可以超频到250兆赫或更高,从而产生250毫秒每秒的AWG
  • 设置之后,可以在python代码中实现频率扫描或其他参数。
  • 缓冲器和/或放大器来降低输出阻抗和扩大电压摆幅。
  • 一个设计良好的PCB和SMD电阻器,减少寄生电容或电感,提高带宽。
  • 增加屏幕(触摸屏)和按钮。
  翻译自https://www.instructables.com/Arbitrary ... ry-Pi-Pic/
 
 
 
 
 

回复

  • 随机主题
    回复总数
    阅读次数
    最新文章