基於STM32 CubeMX 配置 ADC


目標:循環接收一路0-3.3V電壓信號,使用獨立模式,使用DMA搬運至寄存器,采集觸發使用TIM3定時器。

材料:STM32F103C8

STM32 ADC簡介:  

  STM32的 ADC是 12位模擬數字轉換器。STM32的 ADC最大的轉換速率為 1Mhz,也就是轉換時間為 1us(在 ADCCLK=14M,采樣周期為 1.5個 ADC

時鍾下得到),不要讓 ADC的時鍾超過 14M,否則將導致結果准確度下降。STM32將 ADC的轉換分為 2個通道組:規則通道組和注入通道組。規則通道相

當於正常運行的程序,而注入通道相當於中斷。在程序正常執行的時候,中斷是可以打斷正常程序進行執行。同這個類似,注入通道的轉換可以打斷規則通

道的轉換, 在注入通道被轉換完成之后,規則通道才得以繼續轉換。

1、時鍾配置:

 

對應STM32F103 ADC時鍾不能超過12MHZ那么采樣時間和轉換時間怎么計算呢?
如果采樣時間設定為1.5個周期,ADC時鍾的預分頻設置為6,那么采樣時間計算如下;
    APB2/4=ADC Clocks
    ADC Clocks/6=Fs
    Fs=采樣頻率
    72/6=12MHZ
采樣周期設置為1.5時,另外因為采樣到值以后進行轉換需要12.5周期,那么實際轉換時間為;
    12MHZ /1.5 /12.5 = 640KHZ
頻率換算周期等於1的倒數;
    1s/640KHZ=1000 000us /640 000HZ =1.5625us
實際采樣轉換時間為1.5625us

 3、配置ADC

 

 

 

對應上圖配置如下:

Parameter Settings
一、 ADCs_Common_Settings

Mode: 設置ADC 工作模式(獨立模式或多重模式)
獨立模式
<1> Independent mode                      ADC1 和ADC2 工作在獨立模式
雙重模式
<2> Dual regular simultaneous + injected simultaneous mode     ADC1 和ADC2 工作在同步規則模式和同步注入模式
<3> regular regular simultaneous + alternate trigger mode        ADC1 和ADC2 工作在同步規則模式和交替觸發模式
<4> Dual injected simultaneous mode only              ADC1 和ADC2 工作在同步注入模式
<5> Dual regular simultaneous mode only               ADC1 和ADC2 工作在同步規則模式
<6> Dual interleaved mode only                  ADC1 和ADC2 工作在交叉模式
<7> Dual alternate trigger mode only                ADC1 和ADC2 工作在交替觸發模式
三重模式
<8> Triple combined regular simultaneous + injected simultaneous mode       工作在同步規則模式和同步注入模式
<9> Triple combined regular simultaneous + alternate trigger mode           工作在同步規則模式和交替觸發模式
<10> Triple injected simultaneous mode only                     ADC1 和ADC2 工作在同步注入模式
<11> Triple regular simultaneous mode only                      ADC1 和ADC2 工作在同步規則模式
<12> Triple interleaved mode only                        ADC1 和ADC2 工作在交叉模式
<13> Triple alternate trigger mode only                      ADC1 和ADC2 工作在交替觸發模式

DMA Access Mode :(DMA)                         直接存儲器存取訪問模式(在多重模式下才有此項)

Delay between 2 sampling phases:                        2個抽樣階段的延遲(在多重模式下才有此項)

二、 ADCs _Settings
<1> Clock Prescaler                                ADC的時鍾分頻數
<2> Resolution                                  分辨率(意思是AD位數)
<3> Data Alignment                                 ADC 數據向左邊對齊還是向右邊對齊
<4> Scan Conversion Mode                              ADC工作在掃描模式(多通道)還是單次(單通道)模式。可以設置這個參數為ENABLE 或者DISABLE
<5> Continuous Conversion Mode                            ADC模數轉換工作在連續模式。可以設置這個參數為 ENABLE或者DISABLE
<6> Discontinuous Conversion Mode                          ADC模數轉換工作在不連續模式(單次模式)。可以設置這個參數為 ENABLE或者DISABLE
<7> DMA Continuous Requests                           DMA連續請求
<8> End of Conversion Selection                           轉換選擇結束

三、 ADCs_Regular_ConversionMode                          (規則通道轉換模式)

<1> Enable Regular Conversions                       啟用定期轉換  ENABLE或者DISABLE
<2> Number of Conversion                              ADC轉換的通道數量  1
<3> External Trigger Conversion Source                        ADC外部觸發轉換源    TIM3 更新事件
<4> External Trigger Conversion Edge                          ADC外部觸發轉換邊沿(意思是上升沿/下降沿觸發)

四、 Rank
<1> Channel                                   ADC轉換通道 1
<2> Sampling Time                                ADC轉換時間  1.5cyces

五、 ADC_Injected_ConversionMode                       (注入通道轉換模式)
<1> Number of Conversion                            ADC轉換的注入通道數
注入通道數不為0時,才有下面的配置項
<2> External Trigger Source                             ADC外部觸發轉換源
<3> External Trigger Edge                             ADC外部觸發轉換邊沿(意思是上升沿/下降沿觸發)
<4> Injected Conversion Mode                           ADC注入轉換通道模式

六、 Rank(ADC_Injected_ConversionMode的(Number of Conversion )        ADC轉換的注入通道數不為0時,才能配置注入通道的其他參數)
<1> Channel                                     ADC轉換通道
<2> Sampling Time                               ADC轉換時間
<3> Injected Offset                               ADC注入通道的偏值

七、 WatchDog
<1> Enable Analog WatchDog Mode

以上藍字為默認配置,紅色在STM32 CuebeMX選擇相關選項。

3.1 ACD的DMA配置

  選擇循環采集,地址不偏移,寄存器移位偏移。一個字節大小。

 

 

 

 

 

 

4、配置TIM3 ADC觸發轉換定時器

  配置好ADC后還需要給ADC一個觸發事件信號,這里通過定時器的上升沿觸發轉換,配置開啟更新事件,相關分頻設置轉換速度為10KHZ,配置如下。

 

 

 至此ADC的單通道獨立默認就配置好了,生成工程代碼。

 

5、使用

創建一個數組用於存儲ADC數據

/* USER CODE BEGIN 0 */
#define NPT 256									//樣本數量
uint32_t adc_buf[NPT]={0};			            //用於存儲ADC轉換結果的數組
/* USER CODE END 0 */

  

使能定時器觸發轉換,並用串口打印

  /* USER CODE BEGIN 2 */

    HAL_ADC_Start_DMA(&hadc1, adc_buf, NPT);  /*啟動ADC的DMA傳輸,配合定時器觸發ADC轉換  12位的ADC對應0-4095 */
    HAL_TIM_Base_Start(&htim3);               /*開啟定時器,用溢出時間來觸發ADC*/

    //HAL_ADC_Stop_DMA(&hadc1);               /*停止ADC的DMA傳輸*/
    //HAL_TIM_Base_Stop(&htim3);              /*停止定時器*/

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    printSwo("",adc_buf[0],LINE_FEED_EN);
    HAL_Delay(500);

  }
  /* USER CODE END 3 */

 

 

 增加一個DMA的回調函數用於轉換完成后處理一些其它操作。

/** 函數名稱:void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
 * 功能描述:ADC的DMA回調函數
 * 參數:hadc --- adc結構體指針
 * 返回值:無
 */
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
    uint16_t flag;
//	HAL_ADC_Stop_DMA(&hadc1);	//停止ADC的DMA傳輸
    flag = 1;					//標記ADC_DMA傳輸完成
}

  

 

 

 

參考鏈接:https://blog.csdn.net/qq_43225938/article/details/84098810

       https://blog.csdn.net/mc_li/article/details/81364766?spm=1001.2014.3001.5506


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM