ADC(Analog-to-Digital Converter)即模數轉換器,輸入模擬電壓便可轉換爲數字量。git
1、STM32的ADC函數
STM32F1有三個ADC,分別是ADC一、ADC二、ADC3,根據STM32參考手冊可知,ADC1和ADC2均有16個輸入通道,ADC3有若干個輸入通道(根據芯片類型不一樣有差別),還有有一個內部溫度傳感器通道和一個光敏傳感器通道。分佈在各個引腳上,可根據STM32 芯片手冊查詢。如ADC1 IN1 (通道1)在PA1上。學習
2、STM32 ADC的一些概念 (單次轉換、連續轉換、掃描模式)spa
一、單次轉換:一次轉換結束後,須要手動開啓才能進行下一次轉換。code
二、連續轉換:一次轉換結束後繼續下一次轉換。blog
三、掃描模式:對多通道的轉換進行逐個轉換。若此時開啓單次轉換模式,掃描完全部通道後須要手動啓動下一次掃描轉換;若此時開啓連續轉換模式,掃描完成後自動進入下一次掃描轉換,因此掃描模式須要配合DMA才能讀取數據。ip
3、ADC的配置(HAL庫版)it
要使用ADC,必須先對其進行配置,HAL庫提供了若干函數來對ADC進行配置。io
一、配置ADC時鐘,這個基本沒有什麼修改的餘地class
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時鐘
二、配置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轉換通道數。
三、自動校準ADC,調用便可
HAL_ADCEx_Calibration_Start(&ADC1_Handler); //校準ADC
四、配置輸入的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);
五、配置通道以後開啓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個通道要轉換,因此是第一個轉換。
六、HAL庫提供了一個輪詢轉換和一個獲取轉換結果的函數
HAL_ADC_PollForConversion(&ADC1_Handler,10); //輪詢轉換 HAL_ADC_GetValue(&ADC1_Handler); //返回最近一次ADC1規則組的轉換結果
3、應用
若須要採用多通道掃描模式進行轉換,須要用到DMA功能,我還在學習中,之後再更。
若使用單次轉換進行兩個通道轉換,串行單次轉換兩次便可。