本文將介紹基于 rt-thread studio的 sdk開發 adc的應用。本實驗是在昨天的《中科藍訊 AB32VG1開發板OLED顯示實驗》項目基礎上,增加ADC電壓采集的功能,將模擬量通道7采集到的電壓值顯示在OLED顯示屏。
《中科藍訊 AB32VG1開發板OLED顯示實驗》文章的地址連接:中科藍訊 AB32VG1開發板OLED顯示實驗 。
根據說明書,AB32VG1開發板上有 16個通道的 10 bit的 ADC模塊,最大采樣速度是 78k/s; ADC模塊時鐘的最大速度是 1MHz,有內部 100k的上拉電阻。本文通過 RT-Thread Studio配置 ADC驅動,完成ADC7通道的電壓采集,并顯示在OLED工作,使開發板上電,自動采集電壓,OLED顯示兩行字符串:第一行顯示“The Voltage”,第二行顯示電壓值“0.00V”。電路原理如圖所示,
從電路原理圖可知,:使用的是 ADC的第 7個通道,根據原理圖可知對應的是 PE5管腳,所以這里需要用杜邦線將PE5接到3.3V電源上,開發板實物杜邦線連接如圖所示:其中白色是連接PE5與3.3V電源,其余接線為OLED相關,詳見圖中標注。
步驟說明:
首先啟動RT-Thread Studio,在工程項目中打開AB32VG1_IIC_OLED,(如果還沒有這個工程,請看中科藍訊 AB32VG1開發板OLED顯示實驗 (qq.com)完成工程創建),展開工程,雙擊打開RT-Thread Settings,如下圖所示
雙擊任意軟件包或者點擊右側的“<<”,都可以進入的配置界面,彈出軟件包和硬件配置界面,如下圖所示,這里切換到硬件選型,如圖所示開啟名字為ADC0的AD轉換設備,打對號即可。配置好后 ctrl+s?保存配置
2. ADC設備使用示例
ADC設備的具體使用方式可以參考rt-thread官方開發文檔,官網連接:ADC設備 (rt-thread.org),從官方demo看,示例代碼的主要步驟如下:
首先根據 ADC設備名稱 “adc1”查找設備獲取設備句柄,代碼如下:
/*查找設備 */
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);
returnRT_ERROR;
}
這里如果設備不存在,rt_device_find函數將返回NULL(RT_NULL),串口控制臺會看到打印adc sample run failed! can't find字樣,程序執行結束。
如果設備存在,下一步就是使能設備后讀取 adc1設備對應的通道 5的采樣值,
/*使能設備 */
ret = rt_adc_enable(adc_dev, ADC_DEV_CHANNEL);
/*讀取采樣值 */
value = rt_adc_read(adc_dev, ADC_DEV_CHANNEL);
rt_kprintf("the value is :%d \n", value);
這里rt_kprintf將轉換之后的數字量串口打印輸出。
最后根據讀取的數字量,做一個標度變換,將數字量轉為為實際的電壓值。根據分辨率為 12位,參考電壓為 3.3V計算實際的電壓值。代碼如下:
vol = value * REFER_VOLTAGE / CONVERT_BITS;
rt_kprintf("the voltage is :%d.%02d \n", vol / 100, vol % 100);
這里rt_kprintf將標度變換之后的采樣電壓值串口打印輸出。
最后關閉 ADC設備對應通道。代碼如下:
ret = rt_adc_disable(adc_dev, ADC_DEV_CHANNEL);
demo例程的最后一行代碼是導出到 msh命令列表中,這樣需要在 finsh命令行輸入 tab鍵,彈出支持的命令,輸入 adc_vol_sample,才可以啟動AD轉換。
MSH_CMD_EXPORT(adc_vol_sample, adc voltage convert sample);
3.修改main函數代碼
在了解了官方ADC設備示例代碼之后,下面對main函數修改。首先將官方代碼拷貝到main函數中,然后修改ADC設備名稱、ADC通道、參考電壓、轉換位數如下所示:這里設備為ADC0,模擬量通道為7,采集3.3V電壓,轉換位數為10位。
#defineADC_DEV_NAME "adc0" /* ADC設備名稱 */
#defineADC_DEV_CHANNEL 7 /* ADC通道 */
#defineREFER_VOLTAGE 330 /*參考電壓 3.3V,數據精度乘以100保留2位小數*/
#defineCONVERT_BITS (1 << 10)? ?/*?轉換位數為12位 */
修改函數定義staticintadc_vol_sample(int argc,char*argv[])為staticintadc_vol_sample(),同時將程序最后一句代碼MSH_CMD_EXPORT(adc_vol_sample, adc voltage convert sample);刪除,因為直接在主程序調用,上電執行ADC轉換,這個就不要了。修改之函數后代碼如圖所示:
主程序調用adc_vol_sample,就可以了。要在主程序添加變量staticintadvlue;
編譯沒有錯誤,就可以將程序下載到開發板運行,打開downloader下載切換到開發模式,就可以看到ADC轉換的結果如下圖所示.
4.編寫OLED顯示代碼
上一篇文章,通過OLED實現了字符串顯示,要實現電壓值的顯示,這里首先要將整型的電壓值,分解出每一位,然后轉化為字符輸出顯示。轉換顯示代碼如下所示。
main函數完整代碼如下,開發板實際運行如最后圖片所示。
/*
* Copyright (c) 2020-2021, Bluetrum Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2020/12/10 greedyhao The first version
*/
/**
* Notice!
* All functions or data that are called during an interrupt need to be in RAM.
* You can do it the way exception_isr() does.
*/
#include
#include
#include
#include
#include"board.h"
#include"ssd1306.h"http://包含SSD1306的頭文件
#defineADC_DEV_NAME "adc0" /* ADC設備名稱 */
#defineADC_DEV_CHANNEL 7 /* ADC通道 */
#defineREFER_VOLTAGE 330 /*參考電壓 3.3V,數據精度乘以100保留2位小數*/
#defineCONVERT_BITS (1 << 10)? ?/*?轉換位數為12位 */
voiddisplay(inttmp)
{
//330
unsignedcharcount;
unsignedchardatas[] = {0, 0, 0, 0, 0};
datas[0] = tmp / 100;
datas[1] = tmp % 100 / 10;
datas[2] = tmp % 100 % 10;
ssd1306_SetCursor(40, 40);//添加代碼,設置顯示光標位置
ssd1306_WriteChar('0'+datas[0], Font_11x18,White);
ssd1306_WriteChar('.', Font_11x18,White);
for(count = 1; count != 3; count++)
{
ssd1306_WriteChar('0'+datas[count], Font_11x18,White);
}
ssd1306_WriteChar('V', Font_11x18,White);
ssd1306_UpdateScreen();////添加代碼,更新顯示屏信息
}
staticintadc_vol_sample()
{
rt_adc_device_t adc_dev;
unsignedcharTemp_Disp_Buff[17];
rt_uint32_t value, vol;
rt_err_t ret = RT_EOK;
/*查找設備 */
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);
returnRT_ERROR;
}
/*使能設備 */
ret = rt_adc_enable(adc_dev, ADC_DEV_CHANNEL);
/*讀取采樣值 */
value = rt_adc_read(adc_dev, ADC_DEV_CHANNEL);
rt_kprintf("the value is :%d \n", value);
/*轉換為對應電壓值 */
vol = value * REFER_VOLTAGE / CONVERT_BITS;
rt_kprintf("the voltage is :%d.%02d \n", vol / 100, vol % 100);
/*關閉通道 */
ret = rt_adc_disable(adc_dev, ADC_DEV_CHANNEL);
display(vol);
returnret;
}
intmain(void)
{
uint8_t pin = rt_pin_get("PE.1");
staticintadvlue;
rt_pin_mode(pin, PIN_MODE_OUTPUT);
rt_kprintf("Hello, world\n");
ssd1306_Init();//添加代碼,顯示屏初始化
ssd1306_SetCursor(2, 6);//添加代碼,設置顯示光標位置
ssd1306_WriteString("The voltage", Font_11x18,White);//添加代碼,設置顯示內容
ssd1306_SetCursor(40, 40);//添加代碼,設置顯示光標位置
display(0);
ssd1306_UpdateScreen();////添加代碼,更新顯示屏信息
while(1)
{
rt_pin_write(pin, PIN_LOW);
rt_thread_mdelay(500);
rt_pin_write(pin, PIN_HIGH);
rt_thread_mdelay(500);
advlue=adc_vol_sample();
}
}
下一期文章,等電路板返回,做一下DS18B20測溫實現。
編輯:fqj
-
上拉電阻
+關注
關注
5文章
359瀏覽量
30573 -
adc
+關注
關注
98文章
6438瀏覽量
544108 -
開發板
+關注
關注
25文章
4948瀏覽量
97202 -
SDK
+關注
關注
3文章
1026瀏覽量
45779 -
RT-Thread
+關注
關注
31文章
1273瀏覽量
39924
發布評論請先 登錄
相關推薦
評論