使用D/A转换器灵活控制电压并使用Arduino输出模拟信号的方法 |
您所在的位置:网站首页 › arduino模拟电压输出精度 › 使用D/A转换器灵活控制电压并使用Arduino输出模拟信号的方法 |
2023.03.17
使用D/A转换器灵活控制电压并使用Arduino输出模拟信号的方法
Arduino具有输出数字信号和PWM信号等功能,但不具备输出模拟信号的功能。这次,我们将为您介绍能够实现这种模拟信号输出的D/A转换器。 目录 什么是D/A转换器? 如何通过Arduino使用D/A转换器? 尝试用Arduino控制D/A转换器 连接设备数字和人类模拟的桥梁——D/A转换器 1. 什么是D/A转换器?
数字信号是由二进制数字0和1表示的信号。在电子电路领域,有时也用“LOW/HIGH”或“ON/OFF”来表示。而自然界中的现象和人类能够感知的信号都属于模拟信号。模拟信号的特点是其大小、时间和数量是连续的。 D/A转换器是一种能够将数字信号转换为模拟信号并输出的转换器。
音频和视频属于模拟信号。然而,近年来,音频处理和图像、视频处理开始需要数字信号了。处理模拟信号时不支持滤波处理和压缩,而数字信号则支持。将处理后的数字信号转换回模拟信号就需要用到D/A转换器。 2. 如何通过Arduino使用D/A转换器? Arduino包括Arduino Uno、Arduino Leonardo和Arduino Nano等多种产品。 Arduino Due是内置D/A转换器的Arduino之一。不过Due的外形与Arduino Uno不同,工作电压为3.3V,使用方法也有所不同。 如果要使用已经很普及的Arduino Uno来输出模拟信号的话,就需要外置D/A转换器IC。 3. 尝试用Arduino控制D/A转换器 这次,我们不使用内置D/A转换器的扩展板,而是尝试将D/A转换器IC直接连接到Arduino,看看能否输出模拟信号。我们使用的是ROHM的D/A转换器IC“BH2219FVM”(8bit分辨率,双通道)。 由于BH2219FVM为MSOP8封装,所以我们将使用转换板来使其适配万用板。
与I2C和SPI方式的D/A转换器不同,这种DA转换器通过三线制串行通信运行。由于它是自有方式,并不符合特定协议,因此需要自己创建串行通信处理,以便D/A转换器在草图中正常工作。 一边查看BH2219FVM的技术规格书一边与Arduino连接。将示波器探头连接到输出引脚并确认波形
BH2219FVM的技术规格书中提供了详细的使用方法。除了最大额定值和电气特性外,技术规格书中还提供怎样施加信号才工作的操作规范,需要一边阅读这些内容一边思考处理方法。 参考:D/A转换器 标准8bit分辨率 双通道/三通道型|ROHM
BH2219FVM的控制方法很简单。将输出模拟信号的端口(4bit)和8bit数据(4bit+8bit=12bit)以1bit为单位依次传输至DI引脚。BH2219FVM在CLK引脚的上升沿读取DI引脚。12bit传输完成后,如果LD引脚ON,则输出与数据对应的模拟信号。 下面以向AO1端口输出2.5V电压为例进行说明。 根据上表“通道设置(BH2219FVM)”,前4位表示“AO1端口”的固定值是“0000”。 接下来的数据是表示“2.5V”的8位值,通过 “256 × 输出电压 ÷ 电源电压 = 数据” 进行计算。结果是: “256 × 2.5[V] ÷ 5[V] = 128”。 由于2.5V是“电源电压的一半”,所以数据是“8位能表示的数字(256)的一半”,也就是“128”。用二进制表示时,128是“10000000”。 通过使DI引脚按照CLK引脚ON的时序依次ON/OFF(1/0),将“0000”和“10000000”发送给BH2219FVM。最后,只要使LD引脚ON、OFF,BH2219FVM即可输出2.5V的模拟信号。 下面的草图是通过串行通信将数据从Arduino发送至BH2219FVM,并将“锯齿波”输出至BH2219FVM的AO1引脚。 #define LD 8 #define CLK 7 #define DI 6 boolean D[12]; //将输入的数值转换为二进制并保存在数组D0~D7中 int binary(int out) { int i = 0; for (i = 0; i < 8; i++) { D[i] = out % 2; out = out / 2; } } //将输出端口指定结果保存在数组D8~D11中 int chSelect(int outPin) { int i; if (outPin == 1) { for (i = 8; i < 12; i++) { D[i] = LOW; } } else if (outPin == 2) { D[8] = HIGH; for (i = 9; i < 12; i++) { D[i] = LOW; } } } //将数组输出到DAC void outConfirm() { int i; for (i = 11; i >= 0; i--) { digitalWrite(DI, D[i]); digitalWrite(CLK, HIGH); digitalWrite(DI, LOW); digitalWrite(CLK, LOW); } digitalWrite(LD, HIGH); digitalWrite(LD, LOW); } //将输出值和输出端口传递给每个变量 int operationOut(int value, int ch) { binary(value); chSelect(ch); outConfirm(); } void setup() { //将DA转换器用的引脚初始化 pinMode(LD, OUTPUT); pinMode(CLK, OUTPUT); pinMode(DI, OUTPUT); digitalWrite(LD, LOW); } void loop() { int i; //输出锯齿波 for (i = 0; i arduino, D/A转换器数字晶体管是削减元器件、创建简单电路的第一步 安全使用三端稳压器必备的散热基础知识 |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |