本帖最后由 JectXie 于 2024-9-1 19:27 编辑
【Follow me第二季第2期】 基础任务-2、用DAC生成正弦波
2、用DAC生成正弦波
这个任务,真的,我谢谢你,这一下把我这个非科班出身的给干懵了。
2.1 什么是DAC
在嵌入式领域,DAC(数模转换器,Digital-to-Analog Converter)是一个将数字信号转换为模拟信号的电子设备或模块。它的主要作用是将数字数据(通常是二进制数值)转化为连续的模拟电压或电流信号。
我谢谢你一下把我的记忆拉到了不懂事的十年前,上课不认真听的时候。可能老师教过,可我没学。通过查了一堆资料,网上抄加上自己改,变出了下面的代码。
2.2 搞点代码
#include <Arduino.h>
#include <math.h>
#define DAC_PIN A0
void setup() {
pinMode(DAC_PIN, OUTPUT);
}
void loop() {
for(int i = 0; i < 360; i++){
float rad = i * PI / 180.0;
int outputValue = 127 + 127 * sin(rad);
analogWrite(DAC_PIN, outputValue);
delay(10);
}
}
下一步问题来了,我怎么知道这个代码对不对,这一块在盲区内,问了些朋友
得到了2个答案。
1、用示波器
2、DAC信号用ADC接收打印出来。
没错很明显我没有示波器,只有方法2。我找了个esp32,写了几行代码。
#define ADC_PIN 34
void setup() {
Serial.begin(115200);
pinMode(ADC_PIN, INPUT);
analogReadResolution(8);
}
void loop() {
int value = analogRead(ADC_PIN);
Serial.println(value);
delay(10);
}
使用串口接收DAC的值,不过据说ESP32的ADC不准,也只能试试了。但是问题回过来,我这段接受DAC数据的代码对不对我也不知道。试试,新版Arduino 2.x IDE可以通过数据生成波形
得到如下的波形(这是今天2024年8月31日)调整了代码以后得到的波型。
没错,我买了示波器,在这之前。为了这个看到ADC的波形,谁知道今天调了一下,这个正弦正常显示了。,不过上面这个串口打印的有问题,因为底部一段平的。
这是示波器显示的波形,说明前面DAC这段代码是正确的。(从中间缺口处开始看,结合初中三角函数的知识,得出答案是正弦波)
既然示波器都买了,就多搞几个波形吧。
正切又遇到了问题
如下图
正切代码
const int DAC_PIN = A0;
const float OFFSET = 64;
const float SCALE = 20;
void setup() {
pinMode(DAC_PIN, OUTPUT);
}
void loop() {
for(int i = 0; i < 360; i++){
float rad = i * PI / 180.0;
float tanValue = tan(rad);
if (tanValue > SCALE) tanValue = SCALE;
if (tanValue < -SCALE) tanValue = -SCALE;
int outputValue = OFFSET + (int) (64 * tanValue / SCALE);
outputValue = constrain(outputValue, 0, 255);
analogWrite(DAC_PIN, outputValue);
delay(10);
}
}
余弦看起来是正常的,代码就不贴了,就是sin改成cos