ADC(Analog-to-Digital Converter)即模數轉換器,輸入模擬電壓即可轉換為數字量。
一、STM32的ADC
STM32F1有三個ADC,分別是ADC1、ADC2、ADC3,根據STM32參考手冊可知,ADC1和ADC2均有16個輸入通道,ADC3有若干個輸入通道(根據芯片類型不同有差異),還有有一個內部溫度傳感器通道和一個光敏傳感器通道。分布在各個引腳上,可根據STM32 芯片手冊查詢。如ADC1 IN1 (通道1)在PA1上。
二、STM32 ADC的一些概念 (單次轉換、連續轉換、掃描模式)
1、單次轉換:一次轉換結束后,需要手動開啟才能進行下一次轉換。
2、連續轉換:一次轉換結束后繼續下一次轉換。
3、掃描模式:對多通道的轉換進行逐個轉換。若此時開啟單次轉換模式,掃描完所有通道后需要手動啟動下一次掃描轉換;若此時開啟連續轉換模式,掃描完成后自動進入下一次掃描轉換,所以掃描模式需要配合DMA才能讀取數據。
三、ADC的配置(HAL庫版)
要使用ADC,必須先對其進行配置,HAL庫提供了若干函數來對ADC進行配置。
1、配置ADC時鍾,這個基本沒有什么修改的余地
RCC_PeriphCLKInitTypeDef ADC_CLKInit; ADC_CLKInit.PeriphClockSelection=RCC_PERIPHCLK_ADC; //ADC外設時鍾 ADC_CLKInit.AdcClockSelection=RCC_ADCPCLK2_DIV6; //分頻因子6時鍾為72M/6=12MHz HAL_RCCEx_PeriphCLKConfig(&ADC_CLKInit); //設置ADC時鍾
2、配置ADC,使用到哪個ADC就配置哪個
__HAL_RCC_ADC1_CLK_ENABLE(); //使能ADC1時鍾
ADC1_Handler.Instance=ADC1; ADC1_Handler.Init.DataAlign=ADC_DATAALIGN_RIGHT; //右對齊 ADC1_Handler.Init.ScanConvMode=DISABLE; //不掃描模式 ADC1_Handler.Init.ContinuousConvMode=DISABLE; //不連續轉換 ADC1_Handler.Init.NbrOfConversion=1; //一個規則通道轉換 ADC1_Handler.Init.DiscontinuousConvMode=DISABLE; //禁止不連續采樣模式 ADC1_Handler.Init.NbrOfDiscConversion=0; //不連續采樣通道數為0 ADC1_Handler.Init.ExternalTrigConv=ADC_SOFTWARE_START; //軟件觸發 HAL_ADC_Init(&ADC1_Handler); //初始化
其中掃描模式和連續轉換模式根據需求改,規則轉換通道數NbrOfConversion 為你要使用的ADC轉換通道數。
3、自動校准ADC,調用即可
HAL_ADCEx_Calibration_Start(&ADC1_Handler); //校准ADC
4、配置輸入的I/O口
GPIO_InitTypeDef GPIO_Initure; __HAL_RCC_GPIOA_CLK_ENABLE(); //開啟GPIOA時鍾 GPIO_Initure.Pin=GPIO_PIN_1|GPIO_PIN_0; //PA1和PA0 GPIO_Initure.Mode=GPIO_MODE_ANALOG; //模擬輸入 GPIO_Initure.Pull=GPIO_NOPULL; //不帶上下拉 HAL_GPIO_Init(GPIOA,&GPIO_Initure);
5、配置通道之后開啟ADC轉換
ADC_ChannelConfTypeDef ADC1_ChanConf; ADC1_ChanConf.Channel=ch; //通道 ADC1_ChanConf.Rank=1; //第1個序列,序列1
ADC1_ChanConf.SamplingTime=ADC_SAMPLETIME_239CYCLES_5; //采樣時間 HAL_ADC_ConfigChannel(&ADC1_Handler,&ADC1_ChanConf); //通道配置 HAL_ADC_Start(&ADC1_Handler); //開啟ADC
- Channel是需要進行ADC轉換的通道,其值為 ADC_CHANNEL_0~ADC_CHANNEL_16 或者 ADC_CHANNEL_TEMPSENSOR(內部溫度傳感器)或者 ADC_CHANNEL_VREFINT 光敏傳感器
- Rank的意思是:假如有多個通道需要轉換,本通道將是第Rank個進行轉換。因為例程中只有1個通道要轉換,所以是第一個轉換。
6、HAL庫提供了一個輪詢轉換和一個獲取轉換結果的函數
HAL_ADC_PollForConversion(&ADC1_Handler,10); //輪詢轉換 HAL_ADC_GetValue(&ADC1_Handler); //返回最近一次ADC1規則組的轉換結果
三、應用
若需要采用多通道掃描模式進行轉換,需要用到DMA功能,我還在學習中,以后再更。
若使用單次轉換進行兩個通道轉換,串行單次轉換兩次即可。