2540|7

193

帖子

4

TA的资源

纯净的硅(初级)

楼主
 

SparkFun Pro nRF52840 Mini蓝牙开发板 ADC [复制链接]

本帖最后由 御坂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,分别是:

  1.     读取某个Pin转换后的值 (analogRead())
  2.     设置读取的分辨率(analogReadResolution())
  3.     设置参考电压(analogReference())
  4.     PWM方式写某个PIN位指定电压(analogWrite())
  5.     设置写分辨率(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)

 

下一节,我们将会研究一下如何将转换后的数据通过蓝牙发送出去

此帖出自RF/无线论坛

最新回复

主要这个板子有蓝牙协议栈,确实比较麻烦。   详情 回复 发表于 2024-6-4 10:01
点赞 关注
 

回复
举报

755

帖子

5

TA的资源

纯净的硅(高级)

沙发
 

感谢楼主分享的技术知识,这方面的内容对我这个初学者很有帮助,非常感谢

此帖出自RF/无线论坛

点评

一起学习  详情 回复 发表于 2024-6-1 23:34
 
 

回复

193

帖子

4

TA的资源

纯净的硅(初级)

板凳
 
chejm 发表于 2024-6-1 20:52 感谢楼主分享的技术知识,这方面的内容对我这个初学者很有帮助,非常感谢

一起学习

此帖出自RF/无线论坛
 
 
 

回复

7159

帖子

2

TA的资源

版主

4
 

用arduino写的?这个感觉效率挺高的。

此帖出自RF/无线论坛

点评

这个板子支持Arduino,官方给出了好多示例demo.  用着方便的很.  详情 回复 发表于 2024-6-3 23:30
 
 
 

回复

193

帖子

4

TA的资源

纯净的硅(初级)

5
 
wangerxian 发表于 2024-6-3 10:37 用arduino写的?这个感觉效率挺高的。

这个板子支持Arduino,官方给出了好多示例demo.  用着方便的很.

此帖出自RF/无线论坛

点评

主要这个板子有蓝牙协议栈,确实比较麻烦。  详情 回复 发表于 2024-6-4 10:01
就是可能在环境搭建的时候可能有点麻烦, 剩下的就是需要看懂官方提供的代码并且结合自己的Idea去实现功能  详情 回复 发表于 2024-6-3 23:31
 
 
 

回复

193

帖子

4

TA的资源

纯净的硅(初级)

6
 
御坂10032号 发表于 2024-6-3 23:30 这个板子支持Arduino,官方给出了好多示例demo.  用着方便的很.

就是可能在环境搭建的时候可能有点麻烦, 剩下的就是需要看懂官方提供的代码并且结合自己的Idea去实现功能

此帖出自RF/无线论坛
 
 
 

回复

7159

帖子

2

TA的资源

版主

7
 
御坂10032号 发表于 2024-6-3 23:30 这个板子支持Arduino,官方给出了好多示例demo.  用着方便的很.

主要这个板子有蓝牙协议栈,确实比较麻烦。

此帖出自RF/无线论坛

点评

是的, 我看了官方提供的Demo关于蓝牙的, 不考虑细节. 只说API使用的话还是挺简单的  详情 回复 发表于 2024-6-4 12:13
 
 
 

回复

193

帖子

4

TA的资源

纯净的硅(初级)

8
 
wangerxian 发表于 2024-6-4 10:01 主要这个板子有蓝牙协议栈,确实比较麻烦。

是的, 我看了官方提供的Demo关于蓝牙的, 不考虑细节. 只说API使用的话还是挺简单的

此帖出自RF/无线论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
快速回复 返回顶部 返回列表