Arduino具有输出数字信号和PWM信号等功能,但不具备输出模拟信号的能力。 在本文中,我们将介绍一个可以实现这种模拟信号输出的DA转换器。
数字信号是由二进制数字 0 和 1 表示的信号。 在电子电路领域,有时也被称为“低高”或“开关”。 自然界中的现象和人类可以感知的信号是模拟信号。 模拟信号的特点是它们的大小、时间和数量是连续的。
转换器是将数字信号转换为模拟信号并输出的转换器。
音频和 ** 是模拟信号。 然而,近年来,音频处理和图像处理已经开始需要数字信号。 处理模拟信号时不支持滤波和压缩,而数字信号则支持。 将处理后的数字信号转换回模拟信号需要DA转换器。
Arduino 包括 Arduino Uno、Arduino Leonardo 和 Arduino Nano 等多种产品。
Arduino Due 是带有内置 DA 转换器的 Arduino 之一。 但是,DU的形状与Arduino Uno的形状不同,工作电压为33V,使用方式也不同。
如果要使用已经很流行的Arduino UNO输出模拟信号,则需要外部DA转换器IC。
这一次,我们没有使用带有内置DA转换器的扩展板,而是尝试将DA转换器IC直接连接到Arduino,看看是否可以输出模拟信号。 我们使用的是ROHM的DA转换器IC“BH2219FVM”(8位分辨率,双通道)。
由于BH2219FVM采用 MSOP8 封装,我们将使用转换板使其与多用途板兼容。
与 I2C 和 SPI 方法的 D-A 转换器不同,该 DA 转换器通过三线串行通信运行。 由于这是它自己的方式,并且不符合特定的协议,因此您需要创建自己的串行通信处理,以便 DA 转换器在草图中正常工作。
在连接到Arduino时检查BH2219FVM的技术规格。 将示波器探头连接到输出引脚并确认波形。
BH2219FVM的技术数据表提供了有关如何使用它的详细说明。 除了最大额定值和电气特性外,技术规范还提供了如何应用信号进行操作的操作说明,在阅读这些内容时有必要考虑如何处理它们。
参考: D A 转换器 标准 8 位分辨率 双通道 三通道 Rohm
BH2219FVM的控制方法很简单。 输出模拟信号的端口(4 位)和 8 位数据(4 位、8 位、12 位)以 1 位为增量依次传输到 DI 引脚。 BH2219FVM读取 CLK 引脚上升沿上的 DI 引脚。 12位传输完成后,如果LD引脚接通,则输出与数据对应的模拟信号。
以下是将输出 2 到 AO1 端口以 5V 电压为例。
根据上表信道设置(BH2219FVM),前四位数字表示端口AO1的固定值为0000。
下一个数据是显示“25v“ 的 8 位值,通过。
256 输出电压电源电压数据”。
进行计算。 结果是:
256 × 2.5[v] ÷5[v] =128”。
自 25V 是“电源电压的一半”,因此数据是“可以用 8 位表示的数字 (256) 的一半”,即“128”。 当以二进制表示时,128 是“10000000”。
将“0000”和“10000000”发送到BH2219FVM,方法是按照 CLK 引脚的 ON 顺序将 DI 引脚放在 (1 0) 上。 最后,只要LD引脚是ON和OFF,BH2219FVM就可以输出25V模拟信号。
下面的草图是通过串行通信将数据从Arduino发送到BH2219FVM,并将“锯齿波”输出到BH2219FVM的AO1引脚。
#define ld 8#define clk 7#define di 6boolean d[12];将输入值转换为二进制并保存在数组 d0 d7int binary(int out)} 保存指定的输出端口 result in array d8 d11int chselect(int outpin) }else if (outpin == 2) 将数组输出到 dacvoid outconfirm() digitalwrite(ld, high); digitalwrite(ld, low);} 将输出值和输出端口传递给每个变量 int operationout(int value, int ch)void setup() void loop()。这个草图比较注重易懂性,所以效率不是很好,转换周期有点慢。
草图中的每件作品都在下面解释。
#define ld 8#define clk 7#define di 6boolean d[12];首先,将要连接的 DA 转换器的引脚与 Arduino 的引脚号相关联。 LD 是引脚 8,CLK 是引脚 7,DI 是引脚 6。 接下来,定义一个阵列 d 来保存要发送到 DI 引脚的 12 位信息。 为了将 0 1 保留为 12 位,需要 12 个数组元素。 由于只保存了 0 和 1,因此我们使用 boolean 数据类型。
void setup()通过设置功能设置要使用的引脚的工作。 所有三个引脚都用于输出。 在设置功能中将LD引脚指定为低电平是为了防止其状态不稳定。
void loop()“要输出的数据”和“端口号”通过循环功能传递给操作输出功能(用于将信号输出到下文所述的 DA 转换器)。 对于要输出的数据,使用 for 语句将值设置为从 0 到 255 逐渐增加。 由于每次调用环路函数时都会重复工作,因此输出电压为“锯齿波”。
int operationout(int value, int ch)operationout 函数已将参数传递给执行实际处理的函数。 然后调用三个函数:chselect 函数,它将端口号(上 4 位)扩展到 0 或 1,二进制函数,将要输出的数据(下 8 位)扩展到 0 或 1,以及 outconfirm 函数,将数组 d 的内容传输到 da 转换器。
int chselect(int outpin) }else if (outpin == 2)使用 chselect 函数执行最多 4 位的操作。 当从参数中指定端口号 1 时,0 将保存在数组 d 的元素 8 到 11 中。 当从参数中指定端口号 2 时,1 保存在数组 d 的元素 8 中,0 保存在元素 9 到 11 中。
int binary(int out)}传入的十进制数由二进制函数转换为 8 位二进制数,并存储在 d[0] 到 d[7] 中。 此技术通常用于二进制转换。 使用 for 语句“找到除以 2 后的余数(最低数字是 0 还是 1? ),除以 2(四舍五入最低数字)“到”依次从最低数字转换为二进制数”。
void outconfirm() digitalwrite(ld, high); digitalwrite(ld, low);}通过最终的输出确认功能,将阵列 d 中的数据传输到 da 转换器并输出模拟信号。
数组 d 中 0 个 1 的顺序与它传输到 d a 转换器的顺序相反。 因此,for 语句按从 11 到 0 的降序循环,并以正确的顺序输出数组 d 的内容。 在循环中,还执行 CLK 处理。 for语句结束后,当添加LD引脚的上升沿信号时,DA转换器输出与传输数据相对应的模拟信号。
下面是用示波器观测到的每个点的电压图。
Arduino操作BH2219FVM时的波形从DA转换器的输出引脚输出19Hz锯齿波。
查看 DI 引脚(顶部)和 CLK 引脚(底部)上的波形。 您可以根据 CLK 的动作查看 DI 引脚的打开和关闭方式。
放形以查看信号的发送方式。 图中显示,180的信号被发送到DA转换器的AO1引脚。 根据此信号输出 352V电压。
随着数字化的进步,DA转换器广泛应用于**设备、通信设备、电机驱动设备等各种产品中。
通过在Arduino上添加使用DA转换器的模拟信号处理,它可以在各种场景中使用。
在这种情况下,数据传输方法可能看起来有点复杂,但使用支持 I2C 或 SPI 等常见数据传输标准的转换器会更容易、更简单。 当您需要模拟输出时,请尝试 DA 转换器!
如需购买D变频器,申请样品测试、BOM匹配等需求,**客服微信:13310830171。