本次的基础任务为 “使用DAC 产生正弦波,经过 OPAM 的放大,再用 ADC 采集并打印曲线到串口或其他上位机上”
分析题意,该任务需要 DAC、OPAM、ADC 和串口 四种模块的参与
下边对各个模块功能的完成进行记录
1.DAC:参考IDE 自带的 DAC 例程,生成正弦波波形需要添加:
对应头文件
定义DAC 对象,指定管脚输出
指定波形频率
在setup 函数里指定波形为正弦波、频率为定义参数
编译无误后烧写程序,通过示波器观察
此外,还可以通过 Wave.saw() 函数生成锯齿波、通过 Wave.square() 函数生成方波
2.OPAM 模块的使用,参考官方教程进行:Arduino UNO R4 WiFi 运算放大器 |Arduino 文档
由原理图可知,UNO R4 内置的运放模块,A1 对应同相输入端,A2 对应反向输入端,A3 对应运放输出
上一步生成的 DAC 波形幅值为 0~4.5V;板载没有反向电源,因此无法使用反向放大的接法
如果使用同相放大,对应关系是 Vout =(1+Rf/R), 理论上输出最高电压在 4.5V 之上,超过器件的输出最大值,也不合适;
因此为使后续 OPAM 和 ADC 模块都能正常使用,先用分压电阻缩小输入电压,再开启运放模块放大输出电压
(后边发现原来 Arduino 可以通过Amplitude 函数更改输出电压幅值)
电路原理如下所示:
用万用板搭建简单电路
使用 UNO R4 的OPAM, 同样需要添加头文件
然后在 setup 函数里进行模块初始化
使用示波器同时观察 OPAMP 的输入信号和输出信号
通道三为输入信号,DAC 生成的0~4.5V 正弦波经电阻分压幅值改变为 0~1V 左右
输入信号经运放大(1+2/1) =3 倍后,得到 0~3V 正弦波
3.ADC 采集信号,并在串口绘图
启用ADC 模块,先在 setup 函数里定义 ADC 的采样精度
然后定义数据,将ADC 对应 PIN 的数值进行赋值即可
题意要求将ADC 数字上传到串口绘图,考虑波特率传输等问题,DAC 信号频率不宜太高,修改为 10Hz
ADC读取数据后传输到串口,延时 1ms 时间
在菜单栏可以找到串口绘图,打开可见波形
横纵轴数值无法调节,这个工具还是有待改进的
整个工程程序如下所示:
// //头文件定义
#include "analogWave.h"
#include "OPAMP.h"
// //模块对象定义
analogWave Wave(DAC); //定义对象 Wave,关联引脚为 DAC(A0)
//全局变量定义
int WaveFre =10; //波形频率,单位 Hz
int i16AdcReadResult =0;
//初始化任务,上电或复位后只运行一次
void setup()
{
pinMode(LED_BUILTIN,OUTPUT); //定义LED 对应的GPIO 为输出
Serial.begin(115200); //定义串口通信波特率
Wave.sine(WaveFre); //以WaveFre 为初始频率的正弦波
Wave.start();
OPAMP.begin(OPAMP_SPEED_HIGHSPEED);
analogReadResolution(14); //ADC 读取精度为 14bit
}
//循环运行函数
void loop()
{
i16AdcReadResult =analogRead(A4); //指定ADC 读取PIN
Serial.print("ADC Result is:"); //数据上传提示
Serial.print(String(i16AdcReadResult)); //转换为字符类型
Serial.print("\n"); //数据换行
delay(1); //延时等待1ms
}
本帖最后由 我的学号 于 2024-10-7 18:32 编辑