0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于RoboMasterC板的RT-Thread使用分享—ADC測量電壓實驗

冬至子 ? 來源:goldengrandpa ? 作者:goldengrandpa ? 2023-10-13 15:15 ? 次閱讀

本次我們來講一下ADCAnalog-to-Digital Converter)不是游戲里的AD Carry,我們將實現(xiàn)電池電壓的讀取。

ADC簡介
ADC的全稱為Analog-to-Digital Converter(模擬/數(shù)字轉(zhuǎn)換器)。

單片機(jī)中傳輸?shù)?a target="_blank">信號均為數(shù)字信號,通過離散的高低電平表示數(shù)字邏輯的 1 和 0,但是在現(xiàn)實的物理世界中只存在模擬信號,即連續(xù)變化的信號。將這些連續(xù)變化的信號——比如熱,光,聲音,速度通過各種傳感器轉(zhuǎn)化成連續(xù)的電信號,再通過 ADC 功能將連續(xù)的模擬信號轉(zhuǎn)化成離散的數(shù)字信號給單片機(jī)進(jìn)行處理。

常見的ADC類型有并聯(lián)比較型、逐次逼近型。它們的特點如下

1.jpg

ADC有兩個重要參數(shù),分辨率和轉(zhuǎn)換速率。

分辨率:每一個ADC模塊都會明確他的分辨率,通過bit來表示,一般的是8bit,10bit,12bit,16bit,24bit.bit越大,說明分辨率越高。

采樣率:采樣率就是ADC 采樣的速率。它是指在規(guī)定的時間內(nèi)可以采集的次數(shù),采樣率越高,采集到的點數(shù)就越多,那么對原始信號的還原率就越高。采樣率的單位是SPS(sample per sencond),每秒采樣次數(shù)。這個值越大,采樣速度越快。

下面簡單的講一下這兩種ADC的工作原理

并聯(lián)比較型
這個也是比較容易理解的一種。下圖為并聯(lián)比較型ADC的工作原理圖。

1.jpg

它分為分壓部分、比較部分、編碼部分。

一開始的一排電阻均為等阻值的電阻,它們將VREF(參考電壓)進(jìn)行均分,也就代表這個該ADC的精度,電阻分壓后的電壓(Vr)我們將其接到比較器的。圖中V1為我們的待測電壓,當(dāng)V1Vr時比較器輸出1。比如我們這個假設(shè)VREF為15V,V1為1.2V。那么在最下面的比較器中Vr為1V,V1>Vr,比較器輸出1,第二個比較器中Vr為3V,V1

之后我們在每個比較器后加上D觸發(fā)器,當(dāng)我們把C(控制端)至1后,我們給D輸入1,則Q輸入1,輸入0,則Q輸出0。這里我們先給C1,此時比較器輸出的結(jié)果就被存儲到鎖存器中。然后再置0,那么無論我們的輸入電壓V1怎樣變,Q輸出的值都不變,也就保存了輸出值。這里我們改變控制C的速度很大程度決定了最大采樣率,當(dāng)然最大采樣率還受比較器等器件最大頻率的限制。

但是這里輸出的還不是二進(jìn)制數(shù),因此我們需要后面加一個編碼器進(jìn)行編碼。上面就是并聯(lián)比較型原理的簡單描述。

這里我們也可以看出,并聯(lián)比較型的缺點就是精度想要提升就必須增加相應(yīng)的電阻、比較器、觸發(fā)器。這樣會增加物料成本與體積。但是優(yōu)點就是速度很快。

逐級比較型
下圖為逐級比較型ADC的工作示意圖,我們使用的STM32F4也是使用的這種ADC。

1.jpg

它可以分為控制電路、數(shù)碼寄存器、D/A轉(zhuǎn)換器、電壓比較器四個部分

首先第一步在數(shù)碼寄存器進(jìn)行編碼,將高位D2編碼置1,其他位置0,之后進(jìn)入D/A轉(zhuǎn)換器,將編碼出來的數(shù)字量轉(zhuǎn)變?yōu)槟M量V0。之后V0和輸入電壓Vx到比較器進(jìn)行比較。如果Vx大于V0,比較器輸出1,那么控制電路就會將高位D2鎖定不變,之后將D1置1進(jìn)行第二輪比較。如果此時Vx還是大于V0我們也就說明了我們V0的值更加接近Vx。我們將D0置1繼續(xù)進(jìn)行第三輪比較,比如Vx還是比V0大那么說明Vx大于了ADC的量程,如果Vx

這里給出另一個圖方便大家理解

與 1/2Vref 進(jìn)行比較,Vin 大于 1/2Vref,則將第一位標(biāo)記為 1
與 3/4Vref 進(jìn)行比較,Vin 小于 3/4Vref,則將第二位標(biāo)記為 0
與 5/8Vref 進(jìn)行比較,Vin 小于 5/8Vref,則將第三位標(biāo)記為 0。
圖中的 Vin 通過這個三位的 ADC 后輸出的結(jié)果為 100,轉(zhuǎn)換的結(jié)果為 1/2Vref。

1.jpg

這里我們看出由于它需要逐次逼近因此它的轉(zhuǎn)換速度是比較慢的。而且它的分辨率和采樣速度相互矛盾,分辨率越高,采樣速率就越低。

CubeMX配置
雖然這里bsp文件已經(jīng)將我們需要的ADC1,ADC3開啟了,但是這里還是帶著大家學(xué)習(xí)一遍,便于大家使用其他STM32板子時快速配置。

首先還是看原理圖

1.jpg

這里可以看到電源ADC引腳為PF10,使用ADC3的通道8。

我們需要開啟ADC1和ADC3,ADC1在此處作用為讀取STM32內(nèi)部的1.2V校準(zhǔn)電壓Vrefint,這個操作在芯片內(nèi)部實現(xiàn)沒有對應(yīng)引腳。

1.jpg

ADC1的具體配置如下

1.jpg

下表簡單描述一下CuebMX中ADC設(shè)置中的功能。

1.jpg

ADC3開啟通道8,具體配置如ADC1一樣。

1.jpg

這里我們?yōu)槭裁葱枰褂肁DC1的VREFINT呢?

VREFINT是ADC的內(nèi)部參照電壓1.2V,一般來說在STM32我們會使用Vcc作為Vref,但是實際情況中Vcc可能存在較大波動導(dǎo)致Vref不穩(wěn)定最終使得ADC采樣值不準(zhǔn)確,因此我們使用已有的1.2V內(nèi)部參考電壓先行進(jìn)行多次采樣,計算平均值。將其與ADC采樣得出的值進(jìn)行對比,計算出偏移的比例,得到單位數(shù)字電壓對應(yīng)的模擬電壓值。

程序編寫
首先在RT-Thread Settings組件中打開ADC設(shè)備驅(qū)動程序

1.jpg

之后在硬件中打開ADC1與ADC3

1.jpg

新建一個app_adc.c文件

在使能設(shè)備之后有幾點需要我們注意

我們需要采樣內(nèi)部參考電壓1.2V200次,取平均值并計算單位數(shù)字電壓對應(yīng)的模擬電壓值

/* 采樣內(nèi)部參考電壓200次 /
for(int i=0;i<200;i++)
{
totalvalue+=rt_adc_read(adc_ref,ADC_REF_CHANNEL);
}
/
計算單位數(shù)字電壓對應(yīng)的模擬電壓值 /
voltage_vrefint_proportion=200
1.2f/totalvalue;
之后我們對ADC3通道8進(jìn)行采樣,這里有兩個點需要注意

/* 讀取采樣值 */
value = rt_adc_read(adc_dev, ADC_DEV_CHANNEL);
rt_kprintf("the value is :%d n", value);
/* 轉(zhuǎn)換為對應(yīng)電壓值 */
vol=(double)value*voltage_vrefint_proportion*1009.0909090909090909090909090909f;
rt_kprintf("the voltage is :%d.%02d n", vol / 100, vol % 100);

我們重新看一下原理圖,我們這里采樣的是分壓電路分壓之后的值,因此我們需要計算出分壓之前的值才為我們所需的電池電壓。通過如下計算我們需要乘以10.09

1.jpg

并且RT-Thread中rt_kprintf是不能打印出浮點數(shù)的,如果是浮點數(shù)的話就不會打印出來,這個我之前也踩過坑,有兩個辦法,一是修改rt_kprintf函數(shù)實現(xiàn),但是printf作為一個可重入的函數(shù),打印浮點數(shù)是不安全的。因此我這里選擇方法二,我們想要保留小數(shù)點后兩位,那么我們就將值*100,之后在打印時再將值/100作為整數(shù)部分,值%100作為小數(shù)部分,如下所示。

rt_kprintf("the voltage is :%d.%02d n", vol / 100, vol % 100);
完整代碼如下,實現(xiàn)功能為輸入adc_vol_sample,輸出實際讀取到的轉(zhuǎn)換的原始數(shù)據(jù)和經(jīng)過計算后的實際電壓值。

/*

Copyright (c) 2006-2021, RT-Thread Development Team

SPDX-License-Identifier: Apache-2.0

Change Logs:
Date Author Notes
2023-01-09 Goldengrandpa the first version
/
#include
#include
#define ADC_REF_NAME "adc1" /
ADC 內(nèi)部參考電壓設(shè)備名稱 /
#define ADC_REF_CHANNEL 17
#define ADC_DEV_NAME "adc3" /
ADC 設(shè)備名稱 /
#define ADC_DEV_CHANNEL 8 /
ADC 通道 /
static int adc_vol_sample(int argc, char argv[])
{
rt_adc_device_t adc_ref;
rt_adc_device_t adc_dev;
rt_uint32_t totalvalue;
rt_uint32_t value, vol;
double voltage_vrefint_proportion;
rt_err_t ret = RT_EOK;
/
查找設(shè)備 /
adc_ref = (rt_adc_device_t) rt_device_find(ADC_REF_NAME);
if (adc_ref == RT_NULL)
{
rt_kprintf("adc sample run failed! can't find %s device!n", ADC_REF_NAME);
return RT_ERROR;
}
adc_dev = (rt_adc_device_t) rt_device_find(ADC_DEV_NAME);
if (adc_dev == RT_NULL)
{
rt_kprintf("adc sample run failed! can't find %s device!n", ADC_DEV_NAME);
return RT_ERROR;
}
/
使能設(shè)備 /
ret = rt_adc_enable(adc_ref, ADC_REF_CHANNEL);
ret = rt_adc_enable(adc_dev, ADC_DEV_CHANNEL);
/
采樣內(nèi)部參考電壓200次 /
for(int i=0;i<200;i++)
{
totalvalue+=rt_adc_read(adc_ref,ADC_REF_CHANNEL);
}
/
計算單位數(shù)字電壓對應(yīng)的模擬電壓值 /
voltage_vrefint_proportion=200
1.2f/totalvalue;
/
讀取采樣值 /
value = rt_adc_read(adc_dev, ADC_DEV_CHANNEL);
rt_kprintf("the value is :%d n", value);
/
轉(zhuǎn)換為對應(yīng)電壓值 /
vol=(double)value
voltage_vrefint_proportion1009.0909090909090909090909090909f;
rt_kprintf("the voltage is :%d.%02d n", vol / 100, vol % 100);
/
關(guān)閉通道 /
ret = rt_adc_disable(adc_dev, ADC_DEV_CHANNEL);
return ret;
}
/
導(dǎo)出到 msh 命令列表中 */
MSH_CMD_EXPORT(adc_vol_sample, adc voltage convert sample);

硬件連接如下,這里使用的是大疆的6s電池,輸出電壓24V。

1.jpg

由于電池基本要沒電了因此計算出來的電壓為22.39V偏小屬于正?,F(xiàn)象。

1.jpg

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • adc
    adc
    +關(guān)注

    關(guān)注

    97

    文章

    6347

    瀏覽量

    543367
  • 比較器
    +關(guān)注

    關(guān)注

    14

    文章

    1623

    瀏覽量

    106996
  • D觸發(fā)器
    +關(guān)注

    關(guān)注

    3

    文章

    164

    瀏覽量

    47793
  • STM32F4
    +關(guān)注

    關(guān)注

    3

    文章

    194

    瀏覽量

    27950
  • ADC采樣
    +關(guān)注

    關(guān)注

    0

    文章

    134

    瀏覽量

    12807
  • RT-Thread
    +關(guān)注

    關(guān)注

    31

    文章

    1249

    瀏覽量

    39726
收藏 人收藏

    評論

    相關(guān)推薦

    基于rt-thread studio的sdk開發(fā)adc的應(yīng)用詳解

    本文將介紹基于 rt-thread studio 的 sdk 開發(fā) adc 的應(yīng)用。本實驗是在昨天的《中科藍(lán)訊 AB32VG1 開發(fā)OLED顯示
    的頭像 發(fā)表于 11-06 09:41 ?6223次閱讀
    基于<b class='flag-5'>rt-thread</b> studio的sdk開發(fā)<b class='flag-5'>adc</b>的應(yīng)用詳解

    基于RoboMasterCRT-Thread使用分享—PWM擴(kuò)展實驗

    這次因為沒有新增功能所以新建功能部分我就先略過了,大家可以參考一下上篇文章,其中我修改Kconfig,開啟PWM5 CH1/2/3的部分已經(jīng)提交PR了,各位之后導(dǎo)入工程時可以先看一下RT-Thread Setting中是否已經(jīng)顯示。
    的頭像 發(fā)表于 10-13 15:39 ?1192次閱讀
    基于<b class='flag-5'>RoboMasterC</b><b class='flag-5'>板</b>的<b class='flag-5'>RT-Thread</b>使用分享—PWM擴(kuò)展<b class='flag-5'>實驗</b>

    RT-Thread編程指南

    RT-Thread編程指南——RT-Thread開發(fā)組(2015-03-31)。RT-Thread做為國內(nèi)有較大影響力的開源實時操作系統(tǒng),本文是RT-Thread實時操作系統(tǒng)的編程指南
    發(fā)表于 11-26 16:06 ?0次下載

    RT-Thread開發(fā),如何有效學(xué)習(xí)RT-Thread的五個步驟

    RT-Thread推出RT-Thread Inside戰(zhàn)略開放RT-Thread開發(fā)平臺授權(quán)合作,與硬件十萬個為什么合作首次推出第一款RT-Inside的開發(fā)
    的頭像 發(fā)表于 09-25 09:55 ?3.5w次閱讀
    <b class='flag-5'>RT-Thread</b>開發(fā),如何有效學(xué)習(xí)<b class='flag-5'>RT-Thread</b>的五個步驟

    RT-Thread Studio驅(qū)動SD卡

    總結(jié)前言硬件平臺:RT-Thread ART-Pi STM32H750XBH6開發(fā) H750開發(fā)開發(fā)軟件:RT-Thread Studio參考博客:
    發(fā)表于 12-27 19:13 ?20次下載
    <b class='flag-5'>RT-Thread</b> Studio驅(qū)動SD卡

    RT-Thread全球技術(shù)大會:RT-Thread測試用例集合案例

    RT-Thread全球技術(shù)大會:RT-Thread測試用例集合案例 ? ? ? ? ? 審核編輯:彭靜
    的頭像 發(fā)表于 05-27 16:34 ?2014次閱讀
    <b class='flag-5'>RT-Thread</b>全球技術(shù)大會:<b class='flag-5'>RT-Thread</b>測試用例集合案例

    RT-Thread學(xué)習(xí)筆記 RT-Thread的架構(gòu)概述

    RT-Thread 簡介 作為一名 RTOS 的初學(xué)者,也許你對 RT-Thread 還比較陌生。然而,隨著你的深入接觸,你會逐漸發(fā)現(xiàn) RT-Thread 的魅力和它相較于其他同類型 RTOS
    的頭像 發(fā)表于 07-09 11:27 ?4388次閱讀
    <b class='flag-5'>RT-Thread</b>學(xué)習(xí)筆記 <b class='flag-5'>RT-Thread</b>的架構(gòu)概述

    基于RoboMasterC型開發(fā)RT-Thread使用分享(一)

    假期期間打算開一個坑,和大家分享下基于RoboMaster開發(fā)C型上RT-Thread使用,本系列文章計劃是給剛接觸STM32和RT-Thread的同學(xué)看的,講的會稍微基礎(chǔ)一點。 硬件與開發(fā)環(huán)境
    的頭像 發(fā)表于 01-05 12:10 ?2212次閱讀

    基于RoboMasterC型開發(fā)RT-Thread使用分享(二)

    的通過Kconfig+CubeMX配置出可以驅(qū)動整個開發(fā)所有外設(shè)的工程的。在社區(qū)前輩的提醒后才知道通過基于芯片創(chuàng)建工程是沒有辦法Kconfig配置的。因此我在之后的教程中我會基于RT-Thread提供
    的頭像 發(fā)表于 01-06 03:05 ?709次閱讀

    RT-Thread文檔_RT-Thread 簡介

    RT-Thread文檔_RT-Thread 簡介
    發(fā)表于 02-22 18:22 ?5次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> 簡介

    RT-Thread文檔_RT-Thread 潘多拉 STM32L475 上手指南

    RT-Thread文檔_RT-Thread 潘多拉 STM32L475 上手指南
    發(fā)表于 02-22 18:23 ?9次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> 潘多拉 STM32L475 上手指南

    RT-Thread文檔_RT-Thread SMP 介紹與移植

    RT-Thread文檔_RT-Thread SMP 介紹與移植
    發(fā)表于 02-22 18:31 ?9次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> SMP 介紹與移植

    RT-Thread文檔_ADC 設(shè)備

    RT-Thread文檔_ADC 設(shè)備
    發(fā)表于 02-22 18:33 ?1次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>ADC</b> 設(shè)備

    基于RT-Thread Studio學(xué)習(xí)

    前期準(zhǔn)備:從官網(wǎng)下載 RT-Thread Studio,弄個賬號登陸,開啟rt-thread學(xué)習(xí)之旅。
    的頭像 發(fā)表于 05-15 11:00 ?3655次閱讀
    基于<b class='flag-5'>RT-Thread</b> Studio學(xué)習(xí)

    基于rt-thread的socket通信設(shè)計

    最近再研究 rt-thread 的通信 ,想設(shè)計出 eps8266(多個) rt-thread(作為中控) 服務(wù)器的通信框架,使用的開發(fā)是 潘多拉
    的頭像 發(fā)表于 10-13 15:02 ?1230次閱讀
    基于<b class='flag-5'>rt-thread</b>的socket通信設(shè)計