1. 程式人生 > 其它 >RISC-V MCU應用教程之ADC

RISC-V MCU應用教程之ADC

簡介

CH32V103系列是以青稞V3A處理器為核心的32位通用RISC-V MCU,該處理器是基於RISC-V開源指令集設計。片上集成了時鐘安全機制、多級電源管理、通用DMA控制器。此係列具有1路USB2.0主機/裝置介面、多通道12位ADC轉換模組、多通道TouchKey、多組定時器、多路IIC/USART/SPI介面等豐富的外設資源。

 

本章教程使用CH32V103開發板的ADC1通道1對開發板的VCC引腳和GND引腳進行取樣,並將取樣結果通過串列埠除錯助手列印顯示。

1ADC及相關函式介紹

CH32V103ADC模組包含一個 12 位的逐次逼近型的模擬數字轉換器,最高14MHz的輸入時鐘。支援

16個外部通道和2個內部訊號源取樣源。可完成通道的單次轉換、連續轉換,通道間自動掃描模式、間斷模式、外部觸發模式等功能。可以通過模擬看門狗功能監測通道電壓是否在閾值範圍內。

 

關於ADC具體資訊,可參考CH32V103應用手冊。ADC標準庫函式具體內容如下:

1.1void ADC_DeInit(ADC_TypeDef* ADCx)

 能:將ADCx外圍暫存器初始化為其預設重置值。

 入:ADCx:其中x可以是1以選擇ADC外圍裝置。

 

1.2void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct)

 能:根據ADC_InitStruct

中指定的引數初始化ADCx外圍裝置。

 入:ADCx:其中x可以是1以選擇ADC外圍裝置;ADC_InitStruct:指向包含指定ADC外圍裝置的配置資訊的ADC_InitTypeDef結構的指標。

 

1.3void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct)

 能:用預設值填充每個ADC_InitStruct成員。

 入:ADC_InitStruct:指向包含指定ADC外圍裝置的配置資訊的ADC_InitTypeDef結構的指標。

 

1.4void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState)

 能:啟用或禁用指定的ADC外圍裝置。

 入:ADCx:其中x可以是1以選擇ADC外圍裝置;NewState:啟用或禁用。

 

1.5void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState)

 能:啟用或禁用指定的ADC DMA請求。

 入:ADCx:其中x可以是1以選擇ADC外圍裝置;NewState:啟用或禁用。

 

1.6void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState)

 能:啟用或禁用指定的ADC中斷。

 入:ADCx:其中x可以是1以選擇ADC外圍裝置;ADC_IT:指定要啟用或禁用的ADC中斷源。NewState:啟用或禁用。

 

1.7void ADC_ResetCalibration(ADC_TypeDef* ADCx)

 能:重置所選ADC校準暫存器。

 入:ADCx:其中x可以是1以選擇ADC外圍裝置。

 

1.8FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx)

 能:獲取所選ADC重置校準暫存器狀態。

 入:ADCx:其中x可以是1以選擇ADC外圍裝置。

 

1.9void ADC_StartCalibration(ADC_TypeDef* ADCx)

 能:啟動所選ADC校準過程。

 入:ADCx:其中x可以是1以選擇ADC外圍裝置。

 

1.10FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx)

 能:獲取所選ADC校準狀態。

 入:ADCx:其中x可以是1以選擇ADC外圍裝置。

 

1.11void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState)

 能:啟用或禁用所選ADC軟體啟動轉換。

 入:ADCx:其中x可以是1以選擇ADC外圍裝置;NewState:啟用或禁用。

 

1.12FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef* ADCx)

 能:獲取所選ADC軟體開始轉換狀態。

 入:ADCx:其中x可以是1以選擇ADC外圍裝置。

 

1.13void ADC_DiscModeChannelCountConfig(ADC_TypeDef* ADCx, uint8_t Number)

 能:為所選ADC常規組通道配置不連續模式。

 入:ADCx:其中x可以是1以選擇ADC外圍裝置;Number:指定不連續模式常規通道計數值。

 

1.14void ADC_DiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState)

 能:為指定的ADC啟用或禁用常規組通道上的不連續模式。

 入:ADCx:其中x可以是1以選擇ADC外圍裝置;NewState:啟用或禁用。

 

1.15void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime)

 能:為所選ADC常規通道配置其在序列器中的相應列組及其取樣時間。

 入:ADCx:其中x可以是1以選擇ADC外圍裝置;ADC_Channel:要配置的ADC通道;Rank:常規組序列器中的等級;ADC_SampleTime:要為所選通道設定的取樣時間值。

 

1.16void ADC_ExternalTrigConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState)

 能:通過外部觸發器啟用或禁用ADCx轉換。

 入:ADCx:其中x可以是1以選擇ADC外圍裝置;NewState:啟用或禁用。

 

1.17uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx)

 能:返回常規通道的最後一個ADCx轉換結果資料。

 入:ADCx:其中x可以是1以選擇ADC外圍裝置。

 

1.18uint32_t ADC_GetDualModeConversionValue(void)

 能:以雙模式返回最後一個ADC1ADC2轉換結果資料。

 入:無。

 

1.19void ADC_AutoInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState)

 能:啟用或禁用所選ADC在常規轉換後自動注入組轉換。

 入:ADCx:其中x可以是1以選擇ADC外圍裝置;NewState:啟用或禁用。

 

1.20void ADC_InjectedDiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState)

 能:為指定的ADC啟用或禁用注入組通道的不連續模式。

 入:ADCx:其中x可以是1以選擇ADC外圍裝置;NewState:啟用或禁用。

 

1.21void ADC_ExternalTrigInjectedConvConfig(ADC_TypeDef* ADCx, uint32_t ADC_ExternalTrigInjecConv)

 能:為注入通道轉換配置ADCx外部觸發器。

 入:ADCx:其中x可以是1以選擇ADC外圍裝置;ADC_ExternalTrigInjecConv:指定開始注入轉換的ADC觸發器。

 

1.22void ADC_ExternalTrigInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState)

 能:通過外部觸發器啟用或禁用ADCx注入通道轉換。

 入:ADCx:其中x可以是1以選擇ADC外圍裝置;NewState:啟用或禁用。

 

1.23void ADC_SoftwareStartInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState)

 能:啟用或禁用注入通道轉換的所選ADC啟動。

 入:ADCx:其中x可以是1以選擇ADC外圍裝置;NewState:啟用或禁用。

 

1.24FlagStatus ADC_GetSoftwareStartInjectedConvCmdStatus(ADC_TypeDef* ADCx)

 能:獲取所選ADC軟體開始注入轉換狀態。

 入:ADCx:其中x可以是1以選擇ADC外圍裝置。

 

1.25void ADC_InjectedChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime)

 能:為所選ADC注入通道配置其在序列器中的相應秩及其取樣時間。

 入:ADCx:其中x可以是1以選擇ADC外圍裝置;ADC_Channel:要配置的ADC通道;Rank:注入組序列器中的秩;ADC_SampleTime:要為所選通道設定的取樣時間值。

 

1.26void ADC_InjectedSequencerLengthConfig(ADC_TypeDef* ADCx, uint8_t Length)

 能:配置注入通道的序列器長度。

 入:ADCx:其中x可以是1以選擇ADC外圍裝置;Length:序列器的長度。

 

1.27void ADC_SetInjectedOffset(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel, uint16_t Offset)

 能:設定注入通道轉換值偏移。

 入:ADCx:其中x可以是1以選擇ADC外圍裝置;Offset:所選ADC注入通道的偏移值。

 

1.28uint16_t ADC_GetInjectedConversionValue(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel)

 能:ADC返回注入通道的結果。

 入:ADCx:其中x可以是1以選擇ADC外圍裝置;ADC_InjectedChannel:轉換後的ADC注入通道。

 

1.29void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog)

 能:啟用或禁用單個/所有常規或注入通道上的模擬看門狗。

 入:ADCx:其中x可以是1以選擇ADC外圍裝置;ADC_AnalogWatchdogADC模擬看門狗配置。

 

1.30void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef* ADCx, uint16_t HighThreshold,uint16_t LowThreshold)

 能:配置模擬看門狗的高閾值和低閾值。

 入:ADCx:其中x可以是1以選擇ADC外圍裝置;HighThresholdADC模擬看門狗高閾值;LowThresholdADC模擬看門狗低閾值。

 

1.31void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel)

 能:配置模擬看門狗保護的單通道。

 入:ADCx:其中x可以是1以選擇ADC外圍裝置;ADC_Channel:為模擬看門狗配置的ADC通道。

 

1.32void ADC_TempSensorVrefintCmd(FunctionalState NewState)

 能:啟用或禁用溫度感測器和Vrefint通道。

 入:NewState:啟用或禁用。

 

1.33FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG)

 能:檢查是否設定了指定的ADC標誌。

 入:ADCx:其中x可以是1以選擇ADC外圍裝置;ADC_FLAG:指定要檢查的標誌。

 

1.34void ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_t ADC_FLAG)

 能:清除ADCx的掛起標誌。

 入:ADCx:其中x可以是1以選擇ADC外圍裝置;ADC_FLAG:指定要清除的標誌。

 

1.35ITStatus ADC_GetITStatus(ADC_TypeDef* ADCx, uint16_t ADC_IT)

 能:檢查指定的ADC中斷是否已發生。

 入:ADCx:其中x可以是1以選擇ADC外圍裝置;ADC_IT:指定要檢查的ADC中斷源。

 

1.36void ADC_ClearITPendingBit(ADC_TypeDef* ADCx, uint16_t ADC_IT)

 能:清除ADCx的中斷掛起位。

 入:ADCx:其中x可以是1以選擇ADC外圍裝置;ADC_IT:指定要清除的ADC中斷掛起位。

 

1.37s32 TempSensor_Volt_To_Temper(s32 Value)

 能:內部溫度感測器電壓與溫度之間的關係。

 入:Value:電壓值。

 

以上函式均為庫函式內部函式,在進行使用時只需在程式中進行呼叫即可。

2、硬體設計

本章教程通過ADC1通道1讀取開發板VCC引腳和GND引腳ADC值,並通過串列埠除錯助手列印顯示出來。

 

3、軟體設計

CH32V103C8T6ADC_IN1PC1PA1引腳,本文使用PA1,通過PA1讀取開發板VCC引腳ADC值和GND引腳ADC值,具體程式如下:

adc.h檔案

adc.c檔案

main.c檔案

main.c檔案主要進行相關函式的初始化以及列印輸出通過ADC_IN1讀取到的ADC值。

4、下載驗證

將編譯好的程式下載到開發板並復位,用杜邦線將PA1引腳分別與VCC引腳和GND引腳連線,讀取ADC值。注意,此處VCC引腳連線3.3V。串列埠列印情況具體如下:

當連線GND引腳時:

當連線VCC3.3V)引腳時: