STM32F1 ADC實驗(HAL庫版)

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功能,我還在學習中,之後再更。

  若使用單次轉換進行兩個通道轉換,串行單次轉換兩次便可。

相關文章
相關標籤/搜索