衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

【GD32 MCU 入門教程】GD32 MCU 常見外設介紹 (6) ADC 模塊介紹

聚沃科技 ? 2024-08-15 09:46 ? 次閱讀

6.1.ADC 基礎知識

12 位逐次逼近式模數轉換器模塊(ADC),可以采樣來自于外部輸入通道、內部輸入通道的模擬信號,采樣轉換后,轉換結果可以按照最低有效位對齊或最高有效位對齊的方式保存在相應的數據寄存器中。

6.2.GD32 ADC 外設原理

GD32 ADC 主要特性

? 高性能:

– ADC采樣分辨率: 12位、 10位、 8位、或者6位分辨率;

– 前置校準功能;

– 可編程采樣時間;

– 數據存儲模式:最高有效位對齊和最低有效位對齊;

– 支持規則數據轉換的DMA請求。

? 模擬輸入通道:

– 16個外部模擬輸入通道;

– 1個內部溫度傳感器輸入通道(VSENSE);

– 1個內部參考電壓輸入通道(VREFINT)。

? 轉換開始的發起:

– 軟件觸發;

– 硬件觸發。

? 轉換模式:

– 轉換單個通道,或者掃描一序列的通道;

– 單次運行模式,每次觸發轉換一次選擇的輸入通道;

– 連續運行模式,連續轉換所選擇的輸入通道;

– 間斷運行模式;

– 同步模式(適用于具有兩個或多個ADC的設備)。

? 轉換結果閾值監測器功能: 模擬看門狗。

? 中斷的產生:

– 常規序列轉換結束;

– 模擬看門狗事件。

? 過采樣:

– 16位的數據寄存器;

– 可調整的過采樣率,從2x到256x;

– 高達8位的可編程數據移位。

? ADC供電要求:

– 2.4V到3.6V,一般供電電壓為3.3V。

? ADC輸入范圍: VREF- ≤VIN ≤VREF+。

– VREF- : ADC 負參考電壓, VREF- = VSSA

– VREF+ : ADC 正參考電壓, 2.6 V ≤ VREF+ ≤ VDDA

ADC 結構框圖介紹

輸入圖片說明

6.3.硬件連接說明

輸入圖片說明

ADC的檢測需要將輸入阻抗和采樣周期保持一定的關系,下表列出了以GD32E103為例子

輸入圖片說明

6.4.軟件配置說明

查詢法

查詢法采用的是轉換單個通道,或者掃描一序列的通道,通過不斷切換通道的方式去讀取對應通道的ADC數值。我們介紹使用庫函數來設置 ADC0 的通道來進行 AD 轉換的步驟,下面講解其詳細設置步驟:

開啟 GPIO口時鐘和 ADC0 時鐘,設置GPIO口為模擬輸入。

rcu_periph_clock_enable(RCU_GPIOA); /* enable GPIOB clock */ rcu_periph_clock_enable(RCU_GPIOB); /* enable ADC0 clock */ rcu_periph_clock_enable(RCU_ADC0); /* config ADC clock */ rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV4); /* enable alternate function clock */ rcu_periph_clock_enable(RCU_AF); //使能 GPIO 口復用

這里需要說明一下, ADC 的通道與引腳的對應關系在數據手冊可以查到

輸入圖片說明

(1)配置 ADC 輸入時鐘分頻,模式為獨立模式,轉換長度以及觸發方式等

/* reset ADC */ adc_deinit(ADC0); /* ADC mode config */ adc_mode_config(ADC_MODE_FREE); //獨立模式 /* ADC continous function enable */ adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE) /* ADC data alignment config */ adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT); //ADC 數據右對齊 adc_special_function_config(ADC0,ADC_CONTINUOUS_MODE,DISABLE); /* ADC channel length config */ adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 1);//設置 ADC 轉換的通道數量 /* ADC trigger config */ adc_external_trigger_source_config(ADC0,ADC_REGULAR_CHANNEL,ADC0_1_EXTTRIG_REGULAR_NONE); //通過軟件觸發 ADC 轉換 adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE);

(2)開啟 AD 轉換器

在設置完了以上信息后,我們就開啟 AD 轉換器了

/* enable ADC interface */ adc_enable(ADC0); delay_1ms(1);//延遲 等待穩定 /* ADC calibration and reset calibration */ adc_calibration_enable(ADC0);//使能 ADC 校準

(3)讀取 ADC 值 在上面的步驟完成后, ADC 就算準備好了。所謂的查詢法就是不斷地進行通道切換

unsigned short adc0_transfer(unsigned char adc_channel) { uint16_t ADC_temp; /* ADC regular channel config */ adc_regular_channel_config(ADC0, 0, adc_channel, ADC_SAMPLETIME_55POINT5); adc_software_trigger_enable(ADC0,ADC_REGULAR_CHANNEL); while(!adc_flag_get(ADC0, ADC_FLAG_EOC));//等待轉換完成 /* clear the end of conversion flag */ adc_flag_clear(ADC0, ADC_FLAG_EOC); ADC_temp=adc_regular_data_read(ADC0); return ADC_temp; }

這里還需要說明一下ADC的參考電壓,是以Vref作為參考電壓。

常規通道轉換 DMA 搬運

通過ADC轉換,在ADC 轉換完成后 觸發DMA 進行數據搬運。

DMA 請求,可以通過設置 ADC_CTL1 寄存器的 DMA 位來使能,它用于規則組多個通道的轉換結果。 ADC 在規則組一個通道轉換結束后產生一個 DMA 請求, DMA 接受到請求后可以將轉換的數據從 ADC_RDATA 寄存器傳輸到用戶指定的目的地址。

在和查詢法一節的差別,主要在于ADC 的配置方面和DMA的配置

(1)ADC 的配置

/* ADC channel length config */ adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 4);//常規通道長度配置 /* ADC regular channel config */ adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_4, ADC_SAMPLETIME_55POINT5); adc_regular_channel_config(ADC0, 1, ADC_CHANNEL_5, ADC_SAMPLETIME_55POINT5); adc_regular_channel_config(ADC0, 2, ADC_CHANNEL_6, ADC_SAMPLETIME_55POINT5); adc_regular_channel_config(ADC0, 3, ADC_CHANNEL_7, ADC_SAMPLETIME_55POINT5); /* ADC trigger config */ adc_external_trigger_source_config(ADC0,ADC_REGULAR_CHANNEL, ADC0_1_EXTTRIG_REGULAR_NONE); adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE); /* ADC DMA function enable */ adc_dma_mode_enable(ADC0);//使能 DMA 模式 /* enable ADC interface */ adc_enable(ADC0); delay_1ms(1); /* ADC calibration and reset calibration */ adc_calibration_enable(ADC0);

(2)DMA的配置

/* ADC_DMA_channel configuration */ dma_parameter_struct dma_data_parameter; /* ADC DMA_channel configuration */ dma_deinit(DMA0, DMA_CH0); /* initialize DMA single data mode */ dma_data_parameter.periph_addr = (uint32_t)(&ADC_RDATA(ADC0)); //外設地址 dma_data_parameter.periph_inc = DMA_PERIPH_INCREASE_DISABLE; dma_data_parameter.memory_addr = (uint32_t)(&adc_value); //搬運目標地址 dma_data_parameter.memory_inc = DMA_MEMORY_INCREASE_ENABLE; dma_data_parameter.periph_width = DMA_PERIPHERAL_WIDTH_16BIT; dma_data_parameter.memory_width = DMA_MEMORY_WIDTH_16BIT; dma_data_parameter.direction = DMA_PERIPHERAL_TO_MEMORY; dma_data_parameter.number = 4; dma_data_parameter.priority = DMA_PRIORITY_HIGH; dma_init(DMA0, DMA_CH0, &dma_data_parameter); /* enable DMA circulation mode */ dma_circulation_enable(DMA0, DMA_CH0); /* enable DMA channel */ dma_channel_enable(DMA0, DMA_CH0);

(3)觸發ADC 轉換

adc_software_trigger_enable(ADC0,ADC_REGULAR_CHANNEL);

注入通道-中斷

在和查詢法一節的差別,主要在于ADC 的配置方面和注入通道會產生中斷

(1)ADC 的配置

/* reset ADC */ adc_deinit(ADC0); /* ADC mode config */ adc_mode_config(ADC_MODE_FREE); /* ADC continous function enable */ adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE); /* ADC data alignment config */ adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT); /* ADC channel length config *//注入通道配置 adc_channel_length_config(ADC0, ADC_INSERTED_CHANNEL, 4);//注入通道長度配置 /* ADC inserted channel config */ adc_inserted_channel_config(ADC0, 0, ADC_CHANNEL_0, ADC_SAMPLETIME_55POINT5); adc_inserted_channel_config(ADC0, 1, ADC_CHANNEL_1, ADC_SAMPLETIME_55POINT5); adc_inserted_channel_config(ADC0, 2, ADC_CHANNEL_2, ADC_SAMPLETIME_55POINT5); adc_inserted_channel_config(ADC0, 3, ADC_CHANNEL_3, ADC_SAMPLETIME_55POINT5); /* ADC trigger config */ //通過 EXTI 15 進行觸發 adc_external_trigger_source_config(ADC0,ADC_INSERTED_CHANNEL,ADC0_1_EXTTRIG_INSERTED_EXTI_15); /* ADC external trigger enable */ adc_external_trigger_config(ADC0, ADC_INSERTED_CHANNEL, ENABLE); /* clear the ADC flag */ adc_interrupt_flag_clear(ADC0, ADC_INT_FLAG_EOC); adc_interrupt_flag_clear(ADC0, ADC_INT_FLAG_EOIC); /* enable ADC interrupt */ adc_interrupt_enable(ADC0, ADC_INT_EOIC);//使能注入通道的中斷 /* enable ADC */ adc_enable(ADC0); delay_1ms(1); /* ADC calibration and reset calibration */ adc_calibration_enable(ADC0);

(2)ADC 注入通道轉換完成服務函數

void ADC0_1_IRQHandler(void) { /* clear the ADC flag */ adc_interrupt_flag_clear(ADC0, ADC_INT_FLAG_EOIC);//清除注入通道轉換完成標志位 /* read ADC inserted group data register */ inserted_data[0] = adc_inserted_data_read(ADC0, ADC_INSERTED_CHANNEL_0); inserted_data[1] = adc_inserted_data_read(ADC0, ADC_INSERTED_CHANNEL_1); inserted_data[2] = adc_inserted_data_read(ADC0, ADC_INSERTED_CHANNEL_2); inserted_data[3] = adc_inserted_data_read(ADC0, ADC_INSERTED_CHANNEL_3); }

6.5.ADC 使用注意事項

1、ADC通道的采集引腳未配置為模擬輸入,GD32要求通道IO口必須配置為模擬輸入;

2、ADC時鐘過高,ADC采樣時鐘高于ADC最高采樣時鐘獲取到的數據不具有參考意義,需要手動分頻到合適的ADC 要求的頻率;

3、ADC采樣值偏小或不穩定,應該適當的降低ADC時鐘,加大采樣周期的值;

4、ADC的查詢法在獲取ADC數值的時候,不允許重入,即不允許在同一時間調用ADC的數據讀取函數;

5、ADC在使能之后需要進行短暫的延時,時間周期約為2毫秒左右,以保證ADC能正常啟動。

教程GD32 MCU方案商聚沃科技原創發布,了解更多GD32 MCU教程,關注聚沃科技官網

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6043

    文章

    44621

    瀏覽量

    638562
  • mcu
    mcu
    +關注

    關注

    146

    文章

    17319

    瀏覽量

    352649
  • 嵌入式
    +關注

    關注

    5092

    文章

    19177

    瀏覽量

    307676
  • adc
    adc
    +關注

    關注

    99

    文章

    6533

    瀏覽量

    545757
  • 開發板
    +關注

    關注

    25

    文章

    5121

    瀏覽量

    98195
收藏 人收藏

    評論

    相關推薦

    GD32 MCU 入門教程GD32 MCU 常見外設介紹(12)FMC 模塊介紹

    閃存控制器(FMC),提供了片上閃存需要的所有功能。FMC 也提供了頁擦除,整片擦除,以及32 位整字或 16 位半字編程閃存等操作。 GD32 MCU 支持不同類型編程的具體說明如下表 GD32
    的頭像 發表于 08-21 09:56 ?1304次閱讀
    <b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> <b class='flag-5'>入門教程</b>】<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> <b class='flag-5'>常見外設</b><b class='flag-5'>介紹</b>(12)FMC <b class='flag-5'>模塊</b><b class='flag-5'>介紹</b>

    GD32MCU介紹

    其實兆芯的MCU為了兼容ST,外設的寄存器設計與ST保持一致了。比如GD32VF103或者GD32E103系列的USBFS這個外設,基本等同
    發表于 11-01 06:03

    GD32 MCU原理及固件庫開發指南》 + 初讀感悟

    GD32 MCU原理固件庫開發指南這本書內容豐富,囊括了GD32中的所有外設,書中首先介紹了如何使用MDK或IAR軟件搭建
    發表于 03-31 22:11

    GD32 MCU原理及固件庫開發指南》+讀后感

    GD32 MCU的電源管理系統及復位、時鐘系統。 第5章介紹GD32 MCU的基礎外設,包括GP
    發表于 06-06 21:52

    兆易創新GD32 MCU選型手冊,適用于GD32全系列MCU

    兆易創新GD32MCU選型手冊,適用于GD32全系列MCUGD32MCU選型手冊,適用于GD32全系列MCU
    發表于 10-19 17:26 ?49次下載

    你了解GD32 MCU的命名規則嗎

    下面為大家介紹GD32 MCU的通用命名規則,以GD32F303ZGT6為例,其中,GD32代表GD32
    的頭像 發表于 01-13 09:38 ?3829次閱讀
    你了解<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b>的命名規則嗎

    GD32 MCU的選項字節是什么?

    GD32 MCU的選項字節是什么,有什么功能呢?選項字節被誤篡改如何回復?
    的頭像 發表于 01-17 09:42 ?1500次閱讀
    <b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b>的選項字節是什么?

    不同型號的GD32 MCU如何區分?

    大家是否碰到過以下應用場景:同一套軟件代碼希望跑在不同型號的GD32 MCU中,但有些地方需要根據MCU型號進行調整?或者上位機或其他MCUGD3
    的頭像 發表于 01-27 09:32 ?1064次閱讀
    不同型號的<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b>如何區分?

    GD32 MCU 入門教程】一、GD32 MCU 開發環境搭建(1)使用Keil開發GD32

    GD32系列為通用型MCU,所以開發環境也可以使用通用型的IDE,目前使用較多的是KEIL、IAR、 GCC和Embedded Builder,客戶可以根據個人喜好來選擇相應的開發環境。
    的頭像 發表于 08-08 15:01 ?1432次閱讀
    【<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> <b class='flag-5'>入門教程</b>】一、<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> 開發環境搭建(1)使用Keil開發<b class='flag-5'>GD32</b>

    GD32 MCU 入門教程】一、GD32 MCU 開發環境搭建(2)使用 IAR 開發 GD32

    GD32系列為通用型MCU,所以開發環境也可以使用通用型的IDE,目前使用較多的是KEIL、IAR、 GCC和Embedded Builder,客戶可以根據個人喜好來選擇相應的開發環境。
    的頭像 發表于 08-08 15:40 ?814次閱讀
    【<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> <b class='flag-5'>入門教程</b>】一、<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> 開發環境搭建(2)使用 IAR 開發 <b class='flag-5'>GD32</b>

    GD32 MCU 入門教程】一、GD32 MCU 開發環境搭建(3)使用 Embedded Builder 開發 GD32

    GD32系列為通用型MCU,所以開發環境也可以使用通用型的IDE,目前使用較多的是KEIL、IAR、 GCC和Embedded Builder,客戶可以根據個人喜好來選擇相應的開發環境。
    的頭像 發表于 08-08 16:03 ?1133次閱讀
    【<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> <b class='flag-5'>入門教程</b>】一、<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> 開發環境搭建(3)使用 Embedded Builder 開發 <b class='flag-5'>GD32</b>

    GD32 MCU 入門教程】二、GD32 MCU 燒錄說明(1)ISP 燒錄

    ISP:In System Programing,在系統編程,通過MCU片內的引導程序進行Flash編程。 GD32片內有一個只讀信息塊,用于存放引導裝載程序,引導程序在MCU出廠前就會提前燒錄好
    的頭像 發表于 08-08 16:20 ?1152次閱讀
    【<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> <b class='flag-5'>入門教程</b>】二、<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> 燒錄說明(1)ISP 燒錄

    GD32 MCU 入門教程GD32 MCU 常見外設介紹(14)RTC 模塊介紹

    GD32 MCU內部提供了一個RTC(實時時鐘)模塊,通過RTC可以實現日歷時鐘、鬧鐘等功能。RTC也可以用于深度睡眠或待機模式的低功耗喚醒。不同系列的GD32
    的頭像 發表于 08-23 09:18 ?581次閱讀
    【<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> <b class='flag-5'>入門教程</b>】<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> <b class='flag-5'>常見外設</b><b class='flag-5'>介紹</b>(14)RTC <b class='flag-5'>模塊</b><b class='flag-5'>介紹</b>

    GD32 MCU 入門教程GD32 MCU FPU 使用方法

    GD32 MCU FPU 使用方法
    的頭像 發表于 08-25 09:24 ?740次閱讀
    【<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> <b class='flag-5'>入門教程</b>】<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> FPU 使用方法

    GD32 MCU入門教程GD32 MCU GPIO 結構與使用注意事項

    本文是專門為基于GD32 MCU開發的工程設計人員提供,主要介紹了GPIO的功能配置、內部結構以及在不同場景使用時的注意事項,旨在幫助GD32 MC
    的頭像 發表于 09-07 10:34 ?913次閱讀
    【<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b><b class='flag-5'>入門教程</b>】<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> GPIO 結構與使用注意事項
    24风水| 太阳城百家乐官网娱乐官方网| 新世百家乐官网的玩法技巧和规则 | 百家乐官网如何看牌| 百家乐游戏运营| 大发888娱乐城dmwd| 百家乐官网顶| 沙龙百家乐娱乐场开户注册 | 网上百家乐娱乐场开户注册| 大发888娱乐城官网下载| 百家乐官网轮盘技巧| 大中华百家乐的玩法技巧和规则| 百家乐官网投注平台| 百家乐书| tt线上娱乐城| 百家乐游戏发展| 信博娱乐| 博狗百家乐开户| 欧博娱乐| 百家乐庄闲作千| 365在线投注| 百家乐游戏排行榜| E乐博网址| 百家乐乐城皇冠| 新利线上娱乐| 澳门百家乐打法精华| 必搏娱乐| 财神百家乐娱乐城| 兴义市| 信誉百家乐平台| 百家乐官网赢钱皇冠| 百家乐赌场方法| 百家乐官网h游戏怎么玩| 缅甸百家乐赌场娱乐网规则| 百家乐官网投注秘笈| 圣淘沙百家乐的玩法技巧和规则 | 百家乐3式打法微笑心法| 百家乐官网概率统计| 太阳城娱乐网可信吗| 金域百家乐官网的玩法技巧和规则 | 广州百家乐官网娱乐场|