本帖最后由 御坂10032号 于 2024-6-1 15:54 编辑
题外话
Arduino实现ADC的功能非常简单,所以近几篇类似IIC,USART,SPI等外设的功能。我们都快速实现。并且使用对应协议的传感器来实现Demo功能。
今天要实现的是使用这块开发板上的ADC功能来读取气体质量传感器的电压输出,并且通过串口发送给上位机。
正文
根据原理图得知, 这款开发板上一共有8个Pin可以用于ADC的输入,如下图所示
数据手册上也是清楚的说明了当前的ADC,大意是说,12位的ADC具有8个通道
接下来我们开始编码部分。Sparkfun其实也为我们提供了Demo示例。通过下图我们可以打开官方提供的demo
代码如下:
#include <Arduino.h>
#include <Adafruit_TinyUSB.h> // for Serial
int adcin = A5;
int adcvalue = 0;
float mv_per_lsb = 3600.0F/1024.0F; // 10-bit ADC with 3.6V input range
void setup() {
Serial.begin(115200);
while ( !Serial ) delay(10); // for nrf52840 with native usb
}
void loop() {
// Get a fresh ADC value
adcvalue = analogRead(adcin);
// Display the results
Serial.print(adcvalue);
Serial.print(" [");
Serial.print((float)adcvalue * mv_per_lsb);
Serial.println(" mV]");
delay(100);
}
但是实际上你注意到, 当前的这个ADC的转换是以10位分辨率进行转换的。 而官方数据手册里提供的是12位的ADC。
所以此时我们需要调整ADC的分辨率,使其可以以12位的分辨率运行。
这时我们就需要查询一下Arduino API的analog 部分对于分辨率的描述(我带大家详细看下这部分的API说明, 绝对不是为了水文章!)
对于Analog部分, Arduino 一共提供了五个API,分别是:
- 读取某个Pin转换后的值 (analogRead())
- 设置读取的分辨率(analogReadResolution())
- 设置参考电压(analogReference())
- PWM方式写某个PIN位指定电压(analogWrite())
- 设置写分辨率(analogWriteResolution())
上述的大概意思是说,默认是十位的ADC,你可以通过这个API设置你板载支持的ADC bit。 如果你设置的是12 到 16 位ADC的分辨率的话,那么analogread()的结果会受近似数影响
所以让我们对原本的程序功能做一点修改,使其支持12位的分辨率,我们只需要在读取ADC值之前设置这个分辨率为12位,然后根据 2 ^ 12 = 4096. 设置计算值即可
#include <Arduino.h>
#include <Adafruit_TinyUSB.h> // for Serial
int adcin = A5;
int adcvalue = 0;
float mv_per_lsb = 3600.0F/4096.0F; // 12-bit ADC with 3.6V input range
void setup() {
Serial.begin(115200);
while ( !Serial ) delay(10); // for nrf52840 with native usb
analogReadResolution(12);
}
void loop() {
// Get a fresh ADC value
adcvalue = analogRead(adcin);
// Display the results
Serial.print(adcvalue);
Serial.print(" [");
Serial.print((float)adcvalue * mv_per_lsb);
Serial.println(" mV]");
delay(100);
}
如果修改后,短接ADCIN 到3.3 如果你读取到的mv基本上等于 10 bit 分辨率ADC的值的话,测试结果正确
效果演示:
6月1日 (1)
下一节,我们将会研究一下如何将转换后的数据通过蓝牙发送出去