284|4

144

帖子

0

TA的资源

一粒金砂(高级)

【Follow me第二季第2期】任务二 [复制链接]

        基础任务(必做):驱动12x8点阵LED;用DAC生成正弦波;用OPAMP放大DAC信号;用ADC采集并且打印数据到串口等其他接口可上传到上位机显示曲线
        可以看到基础任务中是包含很多的任务的,下面我们根据不同任务进行分别实现。
一、驱动12x8点阵LED
        这是一个总共96个LED的组成的矩阵:
wd_223126rukqm1luuzlrsmxr.png
        可以不太关心的具体的硬件组成,我们在使用的时候主要参考的是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);// 读取间隔
}

        效果如下,打印波形正常:

wd_223126jb9l1a3iwlhhl143.png
        接下来我们看一下硬件部分:
wd_223126innhmr5rimh58idr.png
        可以看到删除A0-A5都可以设置成ADC的功能,那么我们将A5设置为ADC采集,并通过A0的DAC输出幅值为1V的正弦波波形给到A5的ADC进行采集,注意需要外部通过杜邦线连接A0和A5:
wd_223126hblrlndfny8mvfnx.png
        然后初始化两个模拟接口:
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放大后的视屏展示。

最新回复

驱动12x8点阵LED是不是得用扩展IO芯片了,这样的话会占用更少的IO,比较有优势啊   详情 回复 发表于 2024-9-11 11:53

回复
举报

6376

帖子

0

TA的资源

五彩晶圆(高级)

用ADC采集并且打印数据到串口等其他接口可上传到上位机显示曲线的3个任务完成的不错


回复

5762

帖子

5

TA的资源

版主

一步一步进行实现,整个过程还是不错的,可以在整理一下,视频链接

个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引


回复

282

帖子

0

TA的资源

一粒金砂(高级)

驱动12x8点阵LED是不是得用扩展IO芯片了,这样的话会占用更少的IO,比较有优势啊

点评

如原理图一样,内部已经集成了    详情 回复 发表于 5 天前

回复

144

帖子

0

TA的资源

一粒金砂(高级)

yangjiaxu 发表于 2024-9-11 11:53 驱动12x8点阵LED是不是得用扩展IO芯片了,这样的话会占用更少的IO,比较有优势啊

如原理图一样,内部已经集成了  


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

猜你喜欢
随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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