199|0

33

帖子

4

TA的资源

一粒金砂(中级)

楼主
 

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
结果欧克了

点赞 关注
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表