Follow me第二季第2期-2-2生成正弦波;放大DAC信号;打印数据显示曲线
[复制链接]
开始做基础任务
用DAC生成正弦波;
用OPAMP放大DAC信号;
用ADC采集并且打印数据到串口等其他接口可上传到上位机显示曲线
还是先来到官方wiki看看官方的写法
官方给的应用实例是用电位器来改变驱动蜂鸣器频率
#include "analogWave.h" // 包含用于模拟波形生成的库
analogWave wave(DAC); // 创建analogWave类的一个实例,使用DAC引脚
int freq = 10; // 频率,以赫兹为单位,根据需要更改
void setup() {
Serial.begin(115200); // 初始化串行通信,波特率为115200
wave.sine(freq); // 使用初始频率生成正弦波
}
void loop() {
// 从A5引脚读取模拟值,并将其映射到频率范围内
freq = map(analogRead(A5), 0, 1024, 0, 10000);
// 将更新的频率打印到串行监视器
Serial.println("当前频率为 " + String(freq) + " 赫兹");
wave.freq(freq); // 将波形发生器的频率设置为更新的值
delay(1000); // 在重复之前延迟一秒钟
}
其实很简单的代码,我们注释void loop中电位器调节freq值的代码就能实现用DAC生成正弦波的需求
#include "analogWave.h" // 包含用于模拟波形生成的库
analogWave wave(DAC); // 创建analogWave类的一个实例,使用DAC引脚
int freq = 10; // 频率,以赫兹为单位,根据需要更改
void setup() {
Serial.begin(115200); // 初始化串行通信,波特率为115200
wave.sine(freq); // 使用初始频率生成正弦波
}
void loop() {
// 从A5引脚读取模拟值,并将其映射到频率范围内
freq = map(analogRead(A5), 0, 1024, 0, 10000);
// 将更新的频率打印到串行监视器
//Serial.println("当前频率为 " + String(freq) + " 赫兹");
//wave.freq(freq); // 将波形发生器的频率设置为更新的值
delay(1000); // 在重复之前延迟一秒钟
}
好了下载到arduino U4中看看效果,A0口是DAC口,示波器测量需要共地
输出DAC成功!
下一步是用OPAMP放大DAC信号;
老规矩,来看看官方wiki
运算放大器的放大率主要取决于所选的电阻值=1+(R2/R1)
R1 = 接地电阻 (Ω)顾名思义,连接运放反馈口与地的
R2 = 反馈电阻 (Ω)连接输出与反馈口的
具体原理看这一篇原理解释,讲的非常好(不过需要小小翻一下)
由图可得,A1为输入脚,A2为反馈脚,A3为输出脚,为了实现用OPAMP放大DAC信号的需求,我们需要把A1与A0(DAC输出脚短接)
R2与R1都选择10k,得到1+(10k/10K)=2倍的放大倍率
代码部分只需在之前的代码中加下面的
#include <OPAMP.h>
void setup () {
OPAMP.begin(OPAMP_SPEED_HIGHSPEED);
}
实际情况:
不知道为什么不是很对头,但也有2倍放大了
下一个任务:用ADC采集并且打印数据到串口等其他接口可上传到上位机显示曲线
把A4连A0测dac输出
把A5连A3测OPAMP放大输出
#include "analogWave.h" // 包含用于模拟波形生成的库
#include <OPAMP.h>
analogWave wave(DAC); // 创建analogWave类的一个实例,使用DAC引脚
int freq = 5; // 频率,以赫兹为单位,根据需要更改
void setup() {
Serial.begin(115200); // 初始化串行通信,波特率为115200
wave.sine(freq); // 使用初始频率生成正弦波
wave.amplitude(0.4); //设置正弦曲线幅值为0.4,默认的太大了,超过adc采样电压了
OPAMP.begin(OPAMP_SPEED_HIGHSPEED);
}
void loop() {
printf("%d\n",analogRead(A4)); // 读取DAC输出正弦值
Serial.print(" ");
printf("%d\n",analogRead(A5)); // 读取OPAMP输出正弦值
delay(100); // 在重复之前延迟一秒钟
}
结果如下
原因是我delay的太久了,改为delay1
哈哈哈又快过头了,改为10
结果欧克了
|