基础任务(必做):驱动12x8点阵LED;用DAC生成正弦波;用OPAMP放大DAC信号;用ADC采集并且打印数据到串口等其他接口可上传到上位机显示曲线
可以看到基础任务中是包含很多的任务的,下面我们根据不同任务进行分别实现。
一、驱动12x8点阵LED
这是一个总共96个LED的组成的矩阵:
可以不太关心的具体的硬件组成,我们在使用的时候主要参考的是Arduino_LED_Matrix,目前下载的板卡库里面就包括这个独立的库,那么我们如何去定义具体的显示内容呢?在例程中可以看到:
const uint32_t chip[] = {
0x1503f811,
0x3181103,
0xf8150000
};
96个LED被3个32位的数定义,然后通过matrix.loadFrame(chip);进行一次的显示,我们定义几个字符进行显示控制,我们可以通过一些点阵实现编码,然后进行循环显示,这里我们定义了几个汉字和字符:
// 欢
const uint32_t show_1[] = {
0x0003A04B,
0xE3501182,
0x98464182
};
// 迎
const uint32_t show_2[] = {
0x0002FE09,
0x22922F22,
0x105FE000
};
// 加
const uint32_t show_3[] = {
0x0001007D,
0xE1522522,
0x5245E880
};
// 入
const uint32_t show_4[] = {
0x0000C004,
0x00600901,
0x08606800
};
const uint32_t show_E[] = {
0x0000003F,
0xE3083F83,
0x003FE000
};
const uint32_t show_W[] = {
0x00000066,
0x22643541,
0x98110000
};
然后进行循环显示,代码如下:
#include "Arduino_LED_Matrix.h"
ArduinoLEDMatrix matrix;
void setup() {
// put your setup code here, to run once:
matrix.begin();
}
void loop() {
// put your main code here, to run repeatedly:
matrix.loadFrame(show_1);
delay(500); // wait for a second
matrix.loadFrame(show_2);
delay(500); // wait for a second
matrix.loadFrame(show_3);
delay(500); // wait for a second
matrix.loadFrame(show_4);
delay(500); // wait for a second
matrix.loadFrame(show_E);
delay(400); // wait for a second
matrix.clear();
delay(100); // wait for a second
matrix.loadFrame(show_E);
delay(500); // wait for a second
matrix.loadFrame(show_W);
delay(1000); // wait for a second
}
思路依然是先初始化,然后循环显示“欢迎加入EEW”,其中通过清屏实现另个EE之间的分割,效果参见最后的效果视频部分的任务二:1、12x8点阵LED控制。
二、DAC生成正弦波,用OPAMP放大DAC信号;用ADC采集并且打印数据到串口等其他接口可上传到上位机显示曲线
这一部分实际上坟成三个小任务,一个是DAC输出正玄波,一个是用OPAMP放大DAC信号,另外一个是ADC采集并打印,我们简单分析一下,这其中只有串口打印可以进行状态展示,配合IDE的串口绘图仪可以实现图形的绘制。所以我们的一般步骤就是串口的控制——ADC的采集并打印——DAC控制到ADC采集——DAC控制并放大,然后到ADC采集。
我们先实现串口打印图形,默认打印1241:
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
matrix.begin();
matrix.loadFrame(show_4);
}
void loop() {
// put your main code here, to run repeatedly:
Serial.println(1241);
delay(10);// 读取间隔
}
效果如下,打印波形正常:
接下来我们看一下硬件部分:
可以看到删除A0-A5都可以设置成ADC的功能,那么我们将A5设置为ADC采集,并通过A0的DAC输出幅值为1V的正弦波波形给到A5的ADC进行采集,注意需要外部通过杜邦线连接A0和A5:
然后初始化两个模拟接口:
void setup() {
// put your setup code here, to run once:
pinMode(A0, OUTPUT);
pinMode(A5, INPUT);
analogReadResolution(12);// 设置 ADC 分辨率为 12 位
pinMode(LED_BUILTIN, OUTPUT);
Serial.begin(115200);
matrix.begin();
matrix.loadFrame(show_4);
}
void loop() {
// put your main code here, to run repeatedly:
for(int i = 0; i < 360; i++){
float rad = i * PI / 180.0;
int outputValue = (127 + 127 * sin(rad))/5;// 生成正弦波信号
analogWrite(A0, outputValue);// 输出到 DAC
// 控制输出频率
delay(100);
int value = analogRead(A5);// 读取 ADC 值
Serial.println(value);
}
}
这次依然使用的是IDE里的串口绘图工具查看的,不过同时显示的点只有50个,这就导致无法看到比较完整的波形,只能通过视频的方式录制,本次的峰值为1V,所以对应的ADC采集到的变化区间大概是0-800之间左右,具体视频参照任务二中的ADC采集DAC的视屏展示。
接下来进行OPAMP放大DAC信号,然后进行ADC采集串口打印,这里也是为什么前面的测试使用1V幅值,这里通过OPAMP进行两倍的放大,避免超过限值,注意放大功能依然需要外部电阻的配置。
硬件的基本配置通过正向放大器的方式进行,ADC连接到OPAMP的正输入,也就是A1,A2的电压就虚短等于A1处电压,然后通过两个等大的电阻进行2被放大,A2到地连接一个,到输出连接一个,这样A3处的输出就是A1处的2倍了,通过ADC采集进行串口输出绘图。
软件上只要通过OPAMP.begin(OPAMP_SPEED_HIGHSPEED);就可以开启了。
#include <OPAMP.h>
OPAMP.begin(OPAMP_SPEED_HIGHSPEED);
和ADC采集一样,循环变化,ADC的采集值在0-1600之间变化,具体视频参照任务二中的ADC采集DAC放大后的视屏展示。
|