简介
在上一个章节中我们已经学习了如何使用Arduino的API来控制IO的状态切换,实现了LED的Blink效果。那么在本章节我将带着大家学习一下如何使用Arduino 的 AD (模拟信号转换为数字信号) 和 DAC PWM方式(数字信号转换成模拟信号)功能。
正文
在前两章的学习中我们已经知道了Arduino R4的 A0 - A5的端口可以用于模拟信号的采集或者是转换,如下图所示。那么本章节我们将使用ADC的功能来采集某一个PIN的电压值,并且使用DAC将其输出。 通过观察输入和输出的情况可以更好的让我们来学习AD和DA。如果你手头有一个示波器的话,那么可以更好的观察到实验的现象。
首先让我们来认识一下ADC
ADC转换(Analog-to-Digital Conversion,模数转换)是将模拟信号(如电压、温度、压力等连续信号)转换为数字信号的过程。ADC(模数转换器)是完成这一转换的硬件设备。
在微控制器、传感器和其他电子设备中,很多输入信号是模拟的,而数字系统(如计算机或微控制器)只能处理离散的数字信号。因此,ADC能够把模拟信号转换成一定范围内的离散数字值,使数字系统可以对其进行处理。
ADC转换的关键参数包括:
分辨率:通常用位数表示(如8位、12位、16位等),表示ADC能够将模拟信号分成多少个离散的数字值。分辨率越高,输出的数字信号越精确。
采样率:ADC每秒钟可以执行的转换次数,通常以“每秒采样次数”(Samples per Second,SPS)来衡量。
输入范围:ADC能够处理的模拟信号电压范围 (通常的输入范围为GND - Vref, 但是也可以通过分压电路来使其ADC采集更高的电压)。
那么在这款Arduino uno r4 wifi的开发板上, 它具备了一个十四位的ADC。ADC的分辨率可以被设置为 10位, 12 位或者 14 位。读取的ADC最大值分别为 1023, 4095 和 16383
那么对ADC和DAC涉及的Arduino API 分别有以下几个
1- analogRead()
2- analogReadResolution()
3- analogReference()
4- analogWrite()
5- analogWriteResolution()
API 介绍
1- analogRead(PIN)
analogRead() 主要用于读取某一个PIN的ADC转换结果,根据设置的ADC的分辨率可以读取出不同的值。需要注意的一点是, 如果你当前系统的供电电压是3.3V的话, 那么你在十位ADC的分辨率下读取出来的数据最大值也是1024 也就代表的3.3v。如果是5v的系统供电的话,那么读取出来的数据将是5.0V。
下图为Arduino系列开发板ADC测量的最大电压,模拟输入IO PIN 和 支持的最大分辨率
2- analogReadResolution(bits)
analogReadResolution() 的API主要用于设置ADC转换的分辨率 (不要被这个名称迷惑, 你可能会觉得,它是用来读取当前ADC的分辨率)
我们可以根据上述的表格或者根据你自己开发板的数据手册来确定你的ADC分辨率是多少。然后调用上述的API进行设置。通过设置的位数不同,ADC读取的数值范围也有所不同
3- analogReference(type)
analogReference() API 主要用于设置开发板ADC的参考电压。通过设置的ADC参考电压值的不同,ADC读取的电压的范围也会有所改变。那么根据官方文档得知。 R4的默认参考电压为电源的电压,如果你使用的是5V的供电,那么参考电压也就是5v。
下图为Arduino R4 当前函数支持设置的参考电压。 分别是默认的电压5v。 RA4M1 上的1.5V,R7FA6M5上的1.5V,R7FA6M5上的2.0V ,R7FA6M5上的2.5V和外部的参考电压输入(输入只能输入0-5v之间)。
4- analogWrite(pin, value)
analogWrite() API 主要用于设置DAC输出的值。通过设置对应的PIN 和 value。对应的PIN便可以按照设定的分辨率输出对应的电压。
下图为Arduino uno 支持的 DAC输出的PIN (实际上使用的PWM模拟)
5- analogWriteResolution(bits)
analogWriteResolution() API 主要用于设置analogWrite(pin, value) 的输出分辨率。根据设置的分辨率的不同,那么analogWrite(pin, value) value 值也将不同。输出的电压也将不同。 这里有一点需要注意的是,如果你设置的分辨率实际上高于板子支持的分辨率的话。 那么你多余出来的位数将会被丢弃
实验DEMO
那么现在我们来写一个demo程序,来实际的应用一下ADC的转换和DAC的输出。
代码如下:
int analogPin = A3; // 电位器滑动端(中间引脚)连接到模拟引脚3 // 外部引脚分别连接到地和+5V int val = 0; // 用于存储读取值的变量 void setup() { Serial.begin(9600); // 设置串口通信 } void loop() { val = analogRead(analogPin); // 读取输入引脚的模拟值 Serial.println(val); // 输出读取的值用于调试 }
接线图如下:
我们可以通过调节滑动变阻器的值,来改变ADC转换的结果。 现象如下所示
此时我们可以观察到由于我们设置的为10位的ADC分辨率,那么读取出的AD的最大值为1024. 我们尝试将ADC的分辨率设置为14位。烧录再进行测试。
此时我们可以观察到AD的转换的值已经来到的2*14 也就是16384左右。
DAC输出Demo测试(PWM方式)
我们尝试小小的修改一下电路,使其我们可以读取ADC的值,并且转换成DAC的输出。
代码如下
int analogPin = A3; // 电位器滑动端(中间引脚)连接到模拟引脚A3 // 外部引脚分别连接到地和+5V int val = 0; // 用于存储读取值的变量 int outputPin = A5; // 设置模拟输出引脚A5 void setup() { Serial.begin(9600); // 设置串口通信 analogReadResolution(10); // 设置模拟读取分辨率为10位(0-1023) pinMode(outputPin, OUTPUT); // 将引脚A5设置为输出模式 } void loop() { val = analogRead(analogPin); // 读取电位器输入引脚A3的模拟值 Serial.println(val); // 输出读取的值到串口用于调试 analogWrite(outputPin, val / 4); // 将读取的值缩小为0-255,用于控制A5引脚的PWM输出 }
总结
在本章节中,我们学习了如何使用Arduino R4的**ADC(模数转换)和DAC(数模转换)**功能。通过电位器输入模拟电压信号,利用ADC将其转换为数字信号,再使用DAC功能将数字信号以PWM形式输出至指定引脚。我们探讨了关键的API函数,如analogRead()、analogWrite()、analogReadResolution()等,掌握了如何设置ADC和DAC的分辨率与参考电压。
通过实验,我们验证了ADC和DAC的工作原理,并通过代码示例加深了对模拟信号处理的理解,特别是使用电位器调节输入信号,并观察相应的输出现象。