ADC簡介
????????ADC(Analog-Digital Converter)模擬-數字轉換器
????????ADC可以將引腳上連續變化的模擬電壓轉換為內存中存儲的數字變量,建立模擬電路到數字電路的橋梁
????????12位逐次逼近型ADC,1us轉換時間
????????輸入電壓范圍:0~3.3V,轉換結果范圍:0~4095
????????18個輸入通道,可測量16個外部和2個內部信號源
????????規則組和注入組兩個轉換單元
????????模擬看門狗自動監測輸入電壓范圍
????????STM32F103C8T6 ADC資源:ADC1、ADC2,10個外部輸入通道
ADC框圖
ADC基本結構圖
輸入通道
通道 | ADC1 | ADC2 | ADC3 |
通道0 | PA0 | PA0 | PA0 |
通道1 | PA1 | PA1 | PA1 |
通道2 | PA2 | PA2 | PA2 |
通道3 | PA3 | PA3 | PA3 |
通道4 | PA4 | PA4 | PF6 |
通道5 | PA5 | PA5 | PF7 |
通道6 | PA6 | PA6 | PF8 |
通道7 | PA7 | PA7 | PF9 |
通道8 | PB0 | PB0 | PF10 |
通道9 | PB1 | PB1 | |
通道10 | PC0 | PC0 | PC0 |
通道11 | PC1 | PC1 | PC1 |
通道12 | PC2 | PC2 | PC2 |
通道13 | PC3 | PC3 | PC3 |
通道14 | PC4 | PC4 | |
通道15 | PC5 | PC5 | |
通道16 | 溫度傳感器 | ||
通道17 | 內部參考電壓 |
轉換模式
單詞轉換 非掃描模式
連續轉換 非掃描模式
單次轉換 掃描模式
連續轉換 掃描模式
轉換時間
????????AD轉換的步驟:采樣,保持,量化,編碼
STM32 ADC的總轉換時間為:
????????TCONV = 采樣時間 + 12.5個ADC周期
例如:當ADCCLK=14MHz,采樣時間為1.5個ADC周期
????????TCONV = 1.5 + 12.5 = 14個ADC周期 = 1μs
校準
????????ADC有一個內置自校準模式。校準可大幅減小因內部電容器組的變化而造成的準精度誤差。校準期間,在每個電容器上都會計算出一個誤差修正碼(數字值),這個碼用于消除在隨后的轉換中每個電容器上產生的誤差
????????建議在每次上電后執行一次校準
啟動校準前, ADC必須處于關電狀態超過至少兩個ADC時鐘周期
函數介紹
在rcc.h里,這個函數是用來配置ADCCLK分頻器的,它可以對APB2的72MHz時鐘選擇2、4、6、8分頻,輸入到ADCCLK
void RCC_ADCCLKConfig(uint32_t RCC_PCLK2);
接下來都是在adc.h里,
//DeInit恢復缺省設置,恢復為上電默認狀態,
void ADC_DeInit(ADC_TypeDef* ADCx);//初始化
void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);//結構體初始化
void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct);//給ADC上電的
void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);
開啟DMA輸出信號的,如果使用DMA轉運數據,就得調用這個函數
void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState);
中斷輸出控制,用于控制某個中斷,能不能通往NVIC
void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState);
下面四個函數分別是復位校準、獲取復位校準狀態,開始校準、獲取開始校準狀態,這就是用于控制校準的函數,在ADC初始化完成之后,以此調用
void ADC_ResetCalibration(ADC_TypeDef* ADCx);
FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx);
void ADC_StartCalibration(ADC_TypeDef* ADCx);
FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx);
這個是用于軟件觸發的函數
void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
ADC獲取軟件開始轉換狀態(一般不用這個函數)
FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef* ADCx);
第一個獲取標志位狀態,用來判斷轉換是否結束,第二個清除標志位,第三個獲取中斷狀態,第四個清除中斷掛起位
FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);
void ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);
ITStatus ADC_GetITStatus(ADC_TypeDef* ADCx, uint16_t ADC_IT);
void ADC_ClearITPendingBit(ADC_TypeDef* ADCx, uint16_t ADC_IT);
配置間斷模式,第一個函數是,每個幾個通道間斷一次,第二個函數是,是否啟用間斷模式
void ADC_DiscModeChannelCountConfig(ADC_TypeDef* ADCx, uint8_t Number);
void ADC_DiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
ADC規則組通道,第一個參數ADCx,第二個參數ADC_Channel就是你想指定的通道,第三個Rank就是序列幾的位置,第四個SampleTime就是指定通道的采樣時間(這個函數比較重要)
void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);
ADC外部觸發轉換控制,就是是否允許外部觸發轉換
void ADC_ExternalTrigConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
ADC獲取轉換值,就是獲取AD轉換的數據寄存器,讀取轉換結果就是要使用這個函數(這個函數比較重要)
uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);
ADC獲取雙模式轉換值,這個是雙ADC模式讀取轉換結果的函數
uint32_t ADC_GetDualModeConversionValue(void);
下面三個函數是對模擬看門狗進行配置的,第一個是是否啟動模擬看門狗,第二個是配置高低閾值,第三個是配置看門的通道,
void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog);
void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef* ADCx, uint16_t HighThreshold, uint16_t LowThreshold);
void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel);
ADC溫度傳感器,內部參考電壓控制,這個是用來開啟內部的兩個通道的,如果要用這兩個通道,就得調用這個函數
void ADC_TempSensorVrefintCmd(FunctionalState NewState);