SparkFun Pro nRF52840 Mini蓝牙开发板 ADC
<div class='showpostmsg'> 本帖最后由 御坂10032号 于 2024-6-1 15:54 编辑<p><span style="color:#e67e22;"><span style="font-size:24px;"><strong>题外话</strong></span></span></p>
<p> </p>
<p>Arduino实现ADC的功能非常简单,所以近几篇类似IIC,USART,SPI等外设的功能。我们都快速实现。并且使用对应协议的传感器来实现Demo功能。</p>
<p>今天要实现的是使用这块开发板上的ADC功能来读取气体质量传感器的电压输出,并且通过串口发送给上位机。</p>
<p> </p>
<p><strong><span style="color:#e67e22;"><span style="font-size:24px;">正文</span></span></strong></p>
<p> </p>
<p>根据原理图得知, 这款开发板上一共有8个Pin可以用于ADC的输入,如下图所示</p>
<p> </p>
<p>数据手册上也是清楚的说明了当前的ADC,大意是说,12位的ADC具有8个通道</p>
<p> </p>
<p></p>
<p> </p>
<p>接下来我们开始编码部分。Sparkfun其实也为我们提供了Demo示例。通过下图我们可以打开官方提供的demo</p>
<p> </p>
<p> </p>
<p>代码如下:</p>
<pre>
<code class="language-cpp">#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);
}
</code></pre>
<p> </p>
<p>但是实际上你注意到, 当前的这个ADC的转换是以10位分辨率进行转换的。 而官方数据手册里提供的是12位的ADC。</p>
<p> </p>
<p>所以此时我们需要调整ADC的分辨率,使其可以以12位的分辨率运行。</p>
<p>这时我们就需要查询一下Arduino API的<a href="https://www.arduino.cc/reference/en/" target="_blank">analog</a> 部分对于分辨率的描述(我带大家详细看下这部分的API说明, 绝对不是为了水文章!)</p>
<p> </p>
<p> </p>
<p> </p>
<p>对于Analog部分, Arduino 一共提供了五个API,分别是:</p>
<ol>
<li> 读取某个Pin转换后的值 (<a href="https://www.arduino.cc/reference/en/language/functions/analog-io/analogread/">analogRead()</a>)</li>
<li> 设置读取的分辨率(<a href="https://www.arduino.cc/reference/en/language/functions/analog-io/analogreadresolution/">analogReadResolution()</a>)</li>
<li> 设置参考电压(<a href="https://www.arduino.cc/reference/en/language/functions/analog-io/analogreference/">analogReference()</a>)</li>
<li> PWM方式写某个PIN位指定电压(<a href="https://www.arduino.cc/reference/en/language/functions/analog-io/analogwrite/">analogWrite()</a>)</li>
<li> 设置写分辨率(<a href="https://www.arduino.cc/reference/en/language/functions/analog-io/analogwriteresolution/">analogWriteResolution()</a>)</li>
</ol>
<p>上述的大概意思是说,默认是十位的ADC,你可以通过这个API设置你板载支持的ADC bit。 如果你设置的是12 到 16 位ADC的分辨率的话,那么analogread()的结果会受近似数影响</p>
<p> </p>
<p>所以让我们对原本的程序功能做一点修改,使其支持12位的分辨率,我们只需要在读取ADC值之前设置这个分辨率为12位,然后根据 2 ^ 12 = 4096. 设置计算值即可</p>
<p> </p>
<pre>
<code class="language-cpp">#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);
}
</code></pre>
<p>如果修改后,短接ADCIN 到3.3 如果你读取到的mv基本上等于 10 bit 分辨率ADC的值的话,测试结果正确</p>
<p> </p>
<p>效果演示:</p>
<p> </p>
<p>43d210a8c42dadb78a49f7de3b10b93f<br />
</p>
<p>下一节,我们将会研究一下如何将转换后的数据通过蓝牙发送出去</p>
</div><script> var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;" style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
if(parseInt(discuz_uid)==0){
(function($){
var postHeight = getTextHeight(400);
$(".showpostmsg").html($(".showpostmsg").html());
$(".showpostmsg").after(loginstr);
$(".showpostmsg").css({height:postHeight,overflow:"hidden"});
})(jQuery);
} </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script> <p>感谢楼主分享的技术知识,这方面的内容对我这个初学者很有帮助,非常感谢</p>
chejm 发表于 2024-6-1 20:52
感谢楼主分享的技术知识,这方面的内容对我这个初学者很有帮助,非常感谢
<p>一起学习</p>
<p>用arduino写的?这个感觉效率挺高的。</p>
wangerxian 发表于 2024-6-3 10:37
用arduino写的?这个感觉效率挺高的。
<p>这个板子支持Arduino,官方给出了好多示例demo. 用着方便的很.</p>
御坂10032号 发表于 2024-6-3 23:30
这个板子支持Arduino,官方给出了好多示例demo. 用着方便的很.
<p>就是可能在环境搭建的时候可能有点麻烦, 剩下的就是需要看懂官方提供的代码并且结合自己的Idea去实现功能</p>
御坂10032号 发表于 2024-6-3 23:30
这个板子支持Arduino,官方给出了好多示例demo. 用着方便的很.
<p>主要这个板子有蓝牙协议栈,确实比较麻烦。</p>
wangerxian 发表于 2024-6-4 10:01
主要这个板子有蓝牙协议栈,确实比较麻烦。
<p>是的, 我看了官方提供的Demo关于蓝牙的, 不考虑细节. 只说API使用的话还是挺简单的</p>
页:
[1]