1.前言說明
1.1. 本章內容
本MCU帶12bit 4.5Msps ADC,這在通用MCU中采樣率是比較高的,適合做模擬前端。
本文先對ADC模塊進行簡單介紹,然后搭建基于MDK和RT-Thread的開發環境,實現ADC信號采集,最終實現虛擬示波器的Demo。
1.2. 模塊介紹
參考《CN_UM_N32L40x Series User Manual_V2.pdf》的《17 模擬數字轉換( ADC)》
1 個 ADC,支持單端輸入和差分輸入 ,12 位逐次逼近型。
19 個通道,可測量 16 個外部和 3 個內部信號源
內部通道支持 TempSensor、 VREFINT(內部 1.2V BG)、 VREFBUFF(2.048V)
每個通道的 A/D 轉換有四種執行模式:單次、連續、掃描或間斷
帶內嵌數據一致性的數據對齊。 ADC 轉換值存儲(左對齊/右對齊)在 16 位數據寄存器中
可以通過模擬看門狗檢測輸入電壓是否在用戶定義的高/低閾值內
ADC的輸入時鐘的最大頻率為 64MHz。
支持 12 位、 10 位、 8 位、 6 位分辨率。
12bit 分辨率下最高采樣速率 4.57MSPS。
10bit 分辨率下最高采樣速率 5.33MSPS。
8bit 分辨率下最高采樣速率 6.4MSPS。
6bit 分辨率下最高采樣速率 8MSPS。
支持觸發采樣,包括 EXTI/TIMER。
各通道的采樣時間間隔可編程。
支持自校準。
支持 DMA
中斷生成:轉換結束,注入轉換結束,模擬看門狗事件
支持內部參考電壓(2.048V)
ADC 支持轉換的電壓在 VREF-和 VREF+之間。
ADC 的工作電壓在 1.8V 到 3.6V 之間。
可以外部觸發注入轉換和規則轉換。
其框圖如下
其他相關信息可以參考手冊不再贅述。
1.3. 開發軟件
開發環境:MDK+RT-Thread
下載工具:板載NsLink
2.步驟說明
2.1. 導入ADC測試工程
下載ftp://58.250.18.138/1-Microcontrollers/N32L40xxx_V2.1.0.zip解壓
雙擊N32L40xxx_V2.1.06-軟件開發套件(Software Development Kit)Nationstech.N32L40x_DFP.1.0.0.pack
打開
N32L40xxx_V2.1.06-軟件開發套件(Software Development Kit)Nationstech.N32L40x_Library.1.2.1projectsn32l40x_EVALexamplesRT_ThreadRT_Thread12_ADC_DEVICE_REGISTERMDK-ARMADC_DEVICE_REGISTER.uvprojx
選擇device
如果提示找不到文件context_rvds.S是因為工程路徑中文的原因,工程路徑放在英文路徑即可。
下載程序可以看到,串口打印如下(串口參數115200-8-n-1)
2.2. ADC代碼介紹
ADC驅動使用的是RT-Thread的設備框架。
我們從main.c的main函數入口,可以看到創建了兩個線程
test0_thread_entry和test1_thread_entry其中test1_thread_entry線程用于進行ADC采集。
代碼如下:
static void test1_thread_entry(void* parameter)
{
rt_adc_device_t adc_dev;
rt_uint32_t adc_converted_value = 0;
adc_dev = (rt_adc_device_t)rt_device_find("adc");
rt_adc_enable(adc_dev, ADC_CH_6_PA5);
rt_adc_enable(adc_dev, ADC_CH_7_PA6);
if(adc_dev)
{
while(1)
{
adc_converted_value = rt_adc_read(adc_dev, ADC_CH_6_PA5);
rt_kprintf("the PA5 voltage value is %drn", adc_converted_value);
rt_thread_delay(50); //delay 500ms
adc_converted_value = rt_adc_read(adc_dev, ADC_CH_7_PA6);
rt_kprintf("the PA6 voltage value is %drn", adc_converted_value);
rt_thread_delay(50); //delay 500ms
}
}
}
可以看到由于使用了驅動框架代碼很簡單。
rt_adc_device_t adc_dev; 定義設備變量
rt_uint32_t adc_converted_value = 0; 定義變量用于獲取采樣值
adc_dev = (rt_adc_device_t)rt_device_find(“adc”);查找設備
rt_adc_enable(adc_dev, ADC_CH_6_PA5);
rt_adc_enable(adc_dev, ADC_CH_7_PA6); 使能這兩個通道
如果查找到了設備adc_dev則循環采樣
adc_converted_value = rt_adc_read(adc_dev, ADC_CH_6_PA5); 采樣
再打印延時繼續ADC_CH_7_PA6通道的采樣。
相關API可以參考RT-Thread官網這里不再贅述。
3.基于ADC實現虛擬示波器
上一節我們實現了ADC的采集,基于此我們可以實現一些有意思的項目,比如將上述采集到的信號發送到PC端進行處理顯示,那么就可以實現示波器的功能,這一篇就來實現該Demo。
3.1 代碼實現
先將采集到的信號按照一定的格式發送到PC端
上報格式為 “/ 數據,數據 /” 的形式
修改如下,兩路采集后一起上報。
static void test1_thread_entry(void* parameter)
{
rt_adc_device_t adc_dev;
rt_uint32_t adc_converted_value1 = 0;
rt_uint32_t adc_converted_value2 = 0;
adc_dev = (rt_adc_device_t)rt_device_find("adc");
rt_adc_enable(adc_dev, ADC_CH_6_PA5);
rt_adc_enable(adc_dev, ADC_CH_7_PA6);
if(adc_dev)
{
while(1)
{
adc_converted_value1 = rt_adc_read(adc_dev, ADC_CH_6_PA5);
//rt_kprintf("the PA5 voltage value is %drn", adc_converted_value);
//rt_thread_delay(50); //delay 500ms
adc_converted_value2 = rt_adc_read(adc_dev, ADC_CH_7_PA6);
//rt_kprintf("the PA6 voltage value is %drn", adc_converted_value);
//rt_thread_delay(50); //delay 500ms
rt_kprintf("/ %d,%d /rn", adc_converted_value1,adc_converted_value2);
rt_thread_delay(1); // 上報速率為約1kHz(沒有考慮采樣和發送時間)
}
}
}
3.2 上位機配置
我們可以使用一款比較好用的開源的串口可視化工具Serial Studio,可以從以下地址下載安裝,安裝過程很簡單,不再贅述。
打開Serial Studio軟件,按照如下過程配置
點擊控制臺標簽,先配置串口參數,點擊連接,可以看到串口打印信息
點擊json編輯器,創建新項目,設置如下的信息
名字為osc,分割符號為,
開始介乎是符號為/和/ ,對應我們的上報格式 “/ 數據,數據 /” 的形式
點擊拯救(翻譯的問題)
保存文件
3.3 測試
使用變阻器分壓接到PA5和PA6模擬電壓變化,進行測試。
點擊儀表盤可以看到曲線顯示:
改變變阻器位置,可以看到曲線的變化。
得益于ADC的精度和采樣率都比較高,可以實現具備使用價值的虛擬示波器。目前的代碼僅作延時,實際上如果產品化更具備實用價值我們可以實用DMA方式采集,保存到緩存區然后通過USB高速接口發送到PC端進行解析顯示,這樣就可以達到ADC的最大帶寬8MSPS。這個采樣率已經可以比肩一般手持示波器了。
4.章節總結
以上完成了ADC的測試,并實現了一個有一定實用價值的Demo. 從以上可以看出從應用程序開發角度來說,使用RT-Thread的設備框架非常方便,幾行簡單的代碼即可完成ADC采集。
另外Nation的文檔和例程也是做的比較好和規范的,所以使用起來也比較簡單。
-
仿真器
+關注
關注
14文章
1016瀏覽量
83645 -
數據寄存器
+關注
關注
0文章
33瀏覽量
7745 -
虛擬示波器
+關注
關注
2文章
68瀏覽量
27642 -
ADC采樣
+關注
關注
0文章
134瀏覽量
12831 -
RT-Thread
+關注
關注
31文章
1273瀏覽量
39928
發布評論請先 登錄
相關推薦
評論