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引腳進行取樣,並將取樣結果通過串列埠除錯助手列印顯示。
1、ADC及相關函式介紹
CH32V103的ADC模組包含一個 12 位的逐次逼近型的模擬數字轉換器,最高14MHz的輸入時鐘。支援
關於ADC具體資訊,可參考CH32V103應用手冊。ADC標準庫函式具體內容如下:
1.1、void ADC_DeInit(ADC_TypeDef* ADCx)
功 能:將ADCx外圍暫存器初始化為其預設重置值。
輸 入:ADCx:其中x可以是1以選擇ADC外圍裝置。
1.2、void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct)
功 能:根據ADC_InitStruct
輸 入:ADCx:其中x可以是1以選擇ADC外圍裝置;ADC_InitStruct:指向包含指定ADC外圍裝置的配置資訊的ADC_InitTypeDef結構的指標。
1.3、void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct)
功 能:用預設值填充每個ADC_InitStruct成員。
輸 入:ADC_InitStruct:指向包含指定ADC外圍裝置的配置資訊的ADC_InitTypeDef結構的指標。
1.4、void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState)
功 能:啟用或禁用指定的ADC外圍裝置。
輸 入:ADCx:其中x可以是1以選擇ADC外圍裝置;NewState:啟用或禁用。
1.5、void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState)
功 能:啟用或禁用指定的ADC DMA請求。
輸 入:ADCx:其中x可以是1以選擇ADC外圍裝置;NewState:啟用或禁用。
1.6、void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState)
功 能:啟用或禁用指定的ADC中斷。
輸 入:ADCx:其中x可以是1以選擇ADC外圍裝置;ADC_IT:指定要啟用或禁用的ADC中斷源。NewState:啟用或禁用。
1.7、void ADC_ResetCalibration(ADC_TypeDef* ADCx)
功 能:重置所選ADC校準暫存器。
輸 入:ADCx:其中x可以是1以選擇ADC外圍裝置。
1.8、FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx)
功 能:獲取所選ADC重置校準暫存器狀態。
輸 入:ADCx:其中x可以是1以選擇ADC外圍裝置。
1.9、void ADC_StartCalibration(ADC_TypeDef* ADCx)
功 能:啟動所選ADC校準過程。
輸 入:ADCx:其中x可以是1以選擇ADC外圍裝置。
1.10、FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx)
功 能:獲取所選ADC校準狀態。
輸 入:ADCx:其中x可以是1以選擇ADC外圍裝置。
1.11、void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState)
功 能:啟用或禁用所選ADC軟體啟動轉換。
輸 入:ADCx:其中x可以是1以選擇ADC外圍裝置;NewState:啟用或禁用。
1.12、FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef* ADCx)
功 能:獲取所選ADC軟體開始轉換狀態。
輸 入:ADCx:其中x可以是1以選擇ADC外圍裝置。
1.13、void ADC_DiscModeChannelCountConfig(ADC_TypeDef* ADCx, uint8_t Number)
功 能:為所選ADC常規組通道配置不連續模式。
輸 入:ADCx:其中x可以是1以選擇ADC外圍裝置;Number:指定不連續模式常規通道計數值。
1.14、void ADC_DiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState)
功 能:為指定的ADC啟用或禁用常規組通道上的不連續模式。
輸 入:ADCx:其中x可以是1以選擇ADC外圍裝置;NewState:啟用或禁用。
1.15、void 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.16、void ADC_ExternalTrigConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState)
功 能:通過外部觸發器啟用或禁用ADCx轉換。
輸 入:ADCx:其中x可以是1以選擇ADC外圍裝置;NewState:啟用或禁用。
1.17、uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx)
功 能:返回常規通道的最後一個ADCx轉換結果資料。
輸 入:ADCx:其中x可以是1以選擇ADC外圍裝置。
1.18、uint32_t ADC_GetDualModeConversionValue(void)
功 能:以雙模式返回最後一個ADC1和ADC2轉換結果資料。
輸 入:無。
1.19、void ADC_AutoInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState)
功 能:啟用或禁用所選ADC在常規轉換後自動注入組轉換。
輸 入:ADCx:其中x可以是1以選擇ADC外圍裝置;NewState:啟用或禁用。
1.20、void ADC_InjectedDiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState)
功 能:為指定的ADC啟用或禁用注入組通道的不連續模式。
輸 入:ADCx:其中x可以是1以選擇ADC外圍裝置;NewState:啟用或禁用。
1.21、void ADC_ExternalTrigInjectedConvConfig(ADC_TypeDef* ADCx, uint32_t ADC_ExternalTrigInjecConv)
功 能:為注入通道轉換配置ADCx外部觸發器。
輸 入:ADCx:其中x可以是1以選擇ADC外圍裝置;ADC_ExternalTrigInjecConv:指定開始注入轉換的ADC觸發器。
1.22、void ADC_ExternalTrigInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState)
功 能:通過外部觸發器啟用或禁用ADCx注入通道轉換。
輸 入:ADCx:其中x可以是1以選擇ADC外圍裝置;NewState:啟用或禁用。
1.23、void ADC_SoftwareStartInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState)
功 能:啟用或禁用注入通道轉換的所選ADC啟動。
輸 入:ADCx:其中x可以是1以選擇ADC外圍裝置;NewState:啟用或禁用。
1.24、FlagStatus ADC_GetSoftwareStartInjectedConvCmdStatus(ADC_TypeDef* ADCx)
功 能:獲取所選ADC軟體開始注入轉換狀態。
輸 入:ADCx:其中x可以是1以選擇ADC外圍裝置。
1.25、void 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.26、void ADC_InjectedSequencerLengthConfig(ADC_TypeDef* ADCx, uint8_t Length)
功 能:配置注入通道的序列器長度。
輸 入:ADCx:其中x可以是1以選擇ADC外圍裝置;Length:序列器的長度。
1.27、void ADC_SetInjectedOffset(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel, uint16_t Offset)
功 能:設定注入通道轉換值偏移。
輸 入:ADCx:其中x可以是1以選擇ADC外圍裝置;Offset:所選ADC注入通道的偏移值。
1.28、uint16_t ADC_GetInjectedConversionValue(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel)
功 能:ADC返回注入通道的結果。
輸 入:ADCx:其中x可以是1以選擇ADC外圍裝置;ADC_InjectedChannel:轉換後的ADC注入通道。
1.29、void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog)
功 能:啟用或禁用單個/所有常規或注入通道上的模擬看門狗。
輸 入:ADCx:其中x可以是1以選擇ADC外圍裝置;ADC_AnalogWatchdog:ADC模擬看門狗配置。
1.30、void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef* ADCx, uint16_t HighThreshold,uint16_t LowThreshold)
功 能:配置模擬看門狗的高閾值和低閾值。
輸 入:ADCx:其中x可以是1以選擇ADC外圍裝置;HighThreshold:ADC模擬看門狗高閾值;LowThreshold:ADC模擬看門狗低閾值。
1.31、void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel)
功 能:配置模擬看門狗保護的單通道。
輸 入:ADCx:其中x可以是1以選擇ADC外圍裝置;ADC_Channel:為模擬看門狗配置的ADC通道。
1.32、void ADC_TempSensorVrefintCmd(FunctionalState NewState)
功 能:啟用或禁用溫度感測器和Vrefint通道。
輸 入:NewState:啟用或禁用。
1.33、FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG)
功 能:檢查是否設定了指定的ADC標誌。
輸 入:ADCx:其中x可以是1以選擇ADC外圍裝置;ADC_FLAG:指定要檢查的標誌。
1.34、void ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_t ADC_FLAG)
功 能:清除ADCx的掛起標誌。
輸 入:ADCx:其中x可以是1以選擇ADC外圍裝置;ADC_FLAG:指定要清除的標誌。
1.35、ITStatus ADC_GetITStatus(ADC_TypeDef* ADCx, uint16_t ADC_IT)
功 能:檢查指定的ADC中斷是否已發生。
輸 入:ADCx:其中x可以是1以選擇ADC外圍裝置;ADC_IT:指定要檢查的ADC中斷源。
1.36、void ADC_ClearITPendingBit(ADC_TypeDef* ADCx, uint16_t ADC_IT)
功 能:清除ADCx的中斷掛起位。
輸 入:ADCx:其中x可以是1以選擇ADC外圍裝置;ADC_IT:指定要清除的ADC中斷掛起位。
1.37、s32 TempSensor_Volt_To_Temper(s32 Value)
功 能:內部溫度感測器電壓與溫度之間的關係。
輸 入:Value:電壓值。
以上函式均為庫函式內部函式,在進行使用時只需在程式中進行呼叫即可。
2、硬體設計
本章教程通過ADC1通道1讀取開發板VCC引腳和GND引腳ADC值,並通過串列埠除錯助手列印顯示出來。
3、軟體設計
CH32V103C8T6的ADC_IN1在PC1和PA1引腳,本文使用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引腳時:
當連線VCC(3.3V)引腳時: