内容介绍
内容介绍
1. 项目介绍
1.1 项目背景与目标
本项目利用RP2350B核心板结合DAC,设计并实现一个简易的DDS信号发生器。有以下几个功能
- 能够产生正弦波、三角波、方波和直流信号
- 可以通过拨码开关切换波形
- 通过电位计调节信号幅度
- 将当前波形显示在OLED屏幕上
2. 硬件介绍
RP2350B核心板
RP2350B核心板是本项目的核心组件,它基于Raspberry Pi Pico芯片,具有强大的处理能力和丰富的外设接口。该核心板搭载双核ARM Cortex-M0+处理器,主频高达133MHz。它支持多种编程语言,如C/C++和MicroPython,本次我使用的是circuitpython
DAC模块
底板中的DAC使用的是电阻完成的,共10·bit,一个n位的R2R电阻网络DAC需要n-1个R电阻和n+1个2R电阻,电路十分简单,最后通过一个电压跟随器连接到主控
电位器
可调电阻的中间引脚连接到了ADS7868,主控通过SPI和它通讯。需要注意这个芯片采集是8bit,DAC输出是10bit,所以进行回环测试的时候精度会不够
OLED显示屏
OLED显示屏用于实时显示信号的波形类型,是128×32像素的,通过SPI和主控相连接
3. 方案框图与设计思路
方案框图
本项目采用模块化设计思路,整体方案框图如下:
- 核心控制模块:RP2350B核心板作为整个系统的控制中心,负责接收用户通过拨码开关和电位计输入的指令,处理信号生成逻辑,并控制其他模块协同工作。
- 波形生成模块:核心板根据用户选择的波形类型,通过内部算法生成相应的数字波形数据序列,并通过SPI接口将这些数据发送到DAC模块进行数模转换,从而输出所需的模拟波形信号。
- 幅度调节模块:电位计将用户调节的模拟信号转换为核心板可读取的电压值,核心板根据该电压值计算出对应的幅度比例因子,对波形生成模块输出的数字波形数据进行缩放处理,再送至DAC模块,实现信号幅度的可调。
- 频率调节模块:核心板内部通过定时器或计数器等机制,控制波形数据的更新速率,从而实现信号频率的调节。用户通过拨码开关或软件界面输入目标频率值,核心板将其转换为相应的定时器参数,精确控制波形的周期和频率。
- 显示模块:OLED显示屏通过I2C接口与核心板连接,核心板实时将当前波形类型、幅度和频率等参数以文本或图形的形式发送到显示屏上,为用户提供直观的操作反馈和信号状态信息。
4.软件流程图
4.2 关键代码分析
波形生成算法
# 设置R2R的DAC引脚
pin_numbers = [28, 29, 30, 31, 32, 33, 34, 35, 36, 37]
pins = [digitalio.DigitalInOut(getattr(board, f"GP{i}")) for i in pin_numbers]
for pin in pins:
pin.direction = digitalio.Direction.OUTPUT
def set_output(value):
"""value 范围是 0 ~ 1023(10 位)"""
for i in range(10):
pins[i].value = bool((value >> i) & 0x01)
# print(f"Pin {i}: {pins[i].value}")
波形生成代码
def generate_sine_wave(freq, sample_rate, amplitude=1023):
num_samples = int(sample_rate / freq)
wave = []
for i in range(num_samples):
val = int(amplitude * (math.sin(2 * math.pi * i / num_samples) + 1) / 2)
wave.append(val)
#print("Sine Wave Data (first 20):", wave[:20])
return wave
def generate_triangle_wave(freq, sample_rate, amplitude=1023):
num_samples = int(sample_rate / freq)
wave = []
for i in range(num_samples):
t = i / num_samples
val = abs(2 * (t - math.floor(t + 0.5))) * amplitude
wave.append(int(val))
return wave
def generate_square_wave(freq, sample_rate, amplitude=1023):
num_samples = int(sample_rate / freq)
half = num_samples // 2
wave = [amplitude] * half + [0] * (num_samples - half)
if len(wave) != num_samples:
wave = wave[:num_samples]
return wave
def generate_dc_level(level=512, length=10):
return [level] * length
5.1 实物功能
- 波形切换:通过拨码开关切换波形,OLED屏幕实时显示波形类型。图中展示了正弦波、三角波、方波和直流信号的切换效果,波形切换迅速且稳定,屏幕显示清晰。
- 幅度调节:通过电位计调节信号幅度,OLED屏幕实时显示幅度值。图中展示了从0Vpp到3Vpp的幅度调节过程,幅度变化平滑,屏幕显示的幅度值与实际测量值误差小于0.05Vpp。
- 频率调节:通过拨码开关调节信号频率,OLED屏幕实时显示频率值。图中展示了从100Hz到200kHz的频率调节过程,频率变化连续且稳定,屏幕显示的频率值与实际测量值误差小于1Hz
6.遇到的难题
本次活动赶在截止日期赶出来了,软件中还存在着好多的问题需要优化,
- 输出正弦波的时候打印调试的值看着都是正确的,但是输出波形在0V的时候会有一段时间,看起来并不是连续的。
- 频率是固定的,只能在程序中调整,板载的电位器用于幅度的调整了
- 精度可能不太高,手头上没有示波器,所以用本地活动板卡的小弟-RP2050烧录了一个开源的方案作为简易的示波器
7. 总结
本项目设计并实现了一个基于RP2350B核心板和DAC信号发生器,具备波形切换、幅度调节、频率调节以及参数实时显示等功能,满足了电子实验和工程应用中的多种需求。在项目实施过程中,通过优化硬件设计、改进软件算法以及解决遇到的技术难题,确保了设备的性能和稳定性。未来,可以进一步拓展功能,如增加更多波形类型、提高频率范围和精度等,以提升信号发生器的实用性和竞争力。
软硬件
元器件
附件下载
code.py
团队介绍
个人
评论
0 / 100
查看更多
猜你喜欢
基于小脚丫FPGA实现DDS信号发生器通过板上的高速DAC(10bits/125Msps)配合FPGA内部DDS的逻辑,生成波形可调(正弦波、三角波、方波)、频率可调(DC-)、幅度可调的波形。
枳香清酒
2624
基于RP2350B实现DDS信号发生器该项目使用了RP2350B和综合扩展板,实现了一个可调波形、频率、幅度、直流偏移的DDS信号发生器的设计,它的主要功能为:通过R-2R电阻网络模拟DAC输出,可以生成正弦波、方波、三角波、锯齿波和直流偏置, 采集电位计数据用于控制波形的幅值,片上AD采集电阻按键网络用于控制波形类型以及波形的频率,在OLED上面显示波形类型、波形频率以及波形赋值,同时通过SPI采集的姿态传感器数据也可以用于控制波形类型。。
张一西
99
基于RP2350B实现DDS信号发生器该项目使用了RP2350B和综合技能训练板,实现了可调波形、频率、幅度、直流偏移的DDS信号发生器的设计,它的主要功能为:通过DAC输出波形、在显示屏上显示波形、在显示屏上显示波形幅度频率等参数。
该项目使用了RP2350B核心板和circuitpython语言,实现了DDS信号发生器的设计,它的主要功能为:根据按键、拨码开关、电位计状态通过DAC输出特定的频率、幅度、波形,并通过OLED显示这些信息。
derrickcr
42