273|0

19

帖子

2

TA的资源

一粒金砂(中级)

楼主
 

【Follow me第二季第2期】 基础任务-2、用DAC生成正弦波 [复制链接]

 

本帖最后由 JectXie 于 2024-9-1 19:27 编辑

【Follow me第二季第2期】 基础任务-2、用DAC生成正弦波

2、用DAC生成正弦波

这个任务,真的,我谢谢你,这一下把我这个非科班出身的给干懵了。

2.1 什么是DAC

在嵌入式领域,DAC(数模转换器,Digital-to-Analog Converter)是一个将数字信号转换为模拟信号的电子设备或模块。它的主要作用是将数字数据(通常是二进制数值)转化为连续的模拟电压或电流信号。
我谢谢你一下把我的记忆拉到了不懂事的十年前,上课不认真听的时候。可能老师教过,可我没学。通过查了一堆资料,网上抄加上自己改,变出了下面的代码。

2.2 搞点代码

  1. #include <Arduino.h>
  2. #include <math.h>
  3. #define DAC_PIN A0// ESP32 DAC pin (GPIO 25)
  4. void setup() {
  5. pinMode(DAC_PIN, OUTPUT);
  6. }
  7. void loop() {
  8. for(int i = 0; i < 360; i++){
  9. float rad = i * PI / 180.0;
  10. int outputValue = 127 + 127 * sin(rad);// 生成正弦波信号
  11. analogWrite(DAC_PIN, outputValue);// 输出到 DAC
  12. delay(10);// 控制波形频率
  13. }
  14. }

下一步问题来了,我怎么知道这个代码对不对,这一块在盲区内,问了些朋友
得到了2个答案。
1、用示波器

2、DAC信号用ADC接收打印出来。

没错很明显我没有示波器,只有方法2。我找了个esp32,写了几行代码。

  1. #define ADC_PIN 34// ESP32 ADC pin (GPIO 34)
  2. void setup() {
  3. Serial.begin(115200);
  4. pinMode(ADC_PIN, INPUT);
  5. analogReadResolution(8);// 设置 ADC 分辨率为 12 位
  6. }
  7. void loop() {
  8. int value = analogRead(ADC_PIN);// 读取 ADC 值
  9. //Serial.print("ADC Value: ");
  10. Serial.println(value);
  11. delay(10);// 读取间隔
  12. }

使用串口接收DAC的值,不过据说ESP32的ADC不准,也只能试试了。但是问题回过来,我这段接受DAC数据的代码对不对我也不知道。试试,新版Arduino 2.x IDE可以通过数据生成波形
得到如下的波形(这是今天2024年8月31日)调整了代码以后得到的波型。

没错,我买了示波器,在这之前。为了这个看到ADC的波形,谁知道今天调了一下,这个正弦正常显示了。,不过上面这个串口打印的有问题,因为底部一段平的。

这是示波器显示的波形,说明前面DAC这段代码是正确的。(从中间缺口处开始看,结合初中三角函数的知识,得出答案是正弦波)
既然示波器都买了,就多搞几个波形吧。
正切又遇到了问题
如下图

正切代码

  1. const int DAC_PIN = A0; // DAC 输出引脚
  2. const float OFFSET = 64; // 偏移量
  3. const float SCALE = 20;// 缩放因子,限制正切波幅度
  4. void setup() {
  5. pinMode(DAC_PIN, OUTPUT); // 设置 DAC 引脚为输出模式
  6. }
  7. void loop() {
  8. for(int i = 0; i < 360; i++){
  9. float rad = i * PI / 180.0; // 将角度转换为弧度
  10. float tanValue = tan(rad);
  11. // 限制正切波的幅度
  12. if (tanValue > SCALE) tanValue = SCALE;
  13. if (tanValue < -SCALE) tanValue = -SCALE;
  14. int outputValue = OFFSET + (int) (64 * tanValue / SCALE); // 生成波峰为 OFFSET + 64 和波谷为 OFFSET - 64 的正切波信号
  15. outputValue = constrain(outputValue, 0, 255); // 确保输出值在 [0, 255] 范围内
  16. analogWrite(DAC_PIN, outputValue); // 输出到 DAC
  17. delay(10);// 控制波形频率
  18. }
  19. }

余弦看起来是正常的,代码就不贴了,就是sin改成cos

点赞 关注
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
艾睿电子& Silicon Labs 有奖直播 | 全新蓝牙信道探测:从技术创新到实际应用
直播时间:3月12日(周三)上午10:00
直播奖励:多功能榨汁机、蓝牙音箱、手机支架

查看 »

 
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
快速回复 返回顶部 返回列表