STM32應用:利用TIMER觸發ADC,並利用DMA傳輸的自動採樣設計

關鍵字 :STM32ADCDMATIM
STM32的ADC支援多樣的觸發取樣方式,除了用軟體寫入register觸發外,還可以利用Timer和GPIO做觸發,以STM32F070RBT6為例,除了軟體觸發外還支援下列來源的觸發。

   大大购相关商品    NUCLEO-F070RB >>查询存货及售价




這個範例,採用TIMER 1 CC4作為ADC觸發訊號來示範。
在STM32CubeMX中,首先對ADC做設置如下。

先任意新增一個ADC IN通道。


新增一個和ADC連結的DMA通道。



設置ADC設定,打開DMA Continuous Requests。



依據線路,適當的更改Sampling Time,外部觸發來源更改為Timer 1 Capture Compare 4 event,觸發緣改為上升下降緣皆可觸發。



到這邊為止,ADC的設置已經告一段落,接下來對Timer做適當的設置。
設定Timer 1 Channel 4為PWM,因為我們不需要從pin腳輸出波形,只需要產生的event,所以設置為No Output。



因為主頻為48MHz,這實驗希望採樣頻率為100Hz,故設置Timer參數如下,產生一個頻率為100Hz的PWM。




然後在main.c中,新增程式碼如下。

/* USER CODE BEGIN PV */
uint16_t adc_dr[10];
/* USER CODE END PV */

/* USER CODE BEGIN 2 */
  HAL_ADC_Start_DMA(&hadc, (uint32_t *)adc_dr, 10);
  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4);
/* USER CODE END 2 */

/* USER CODE BEGIN 4 */
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
  HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
}
/* USER CODE END 4 */

HAL_ADC_Start_DMA為啟動ADC DMA傳輸,取樣傳輸10次後結束。
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4);為啟動Timer 1 Channel 4,當timer啟動後才會觸發ADC取樣。
當取樣完10次後,會自動呼叫HAL_ADC_ConvCpltCallback這個callback函式,我們在這邊做一個GPIO High / Low動作,接到示波器量測,得到波形如下。


以100Hz取樣率,取樣10次後觸發完成,由示波器上看約100ms,GPIO就改變一次High / Low,可得知ADC已依照設定的取樣率工作。

技術文檔

類型標題檔案
軟件IOC
操作手冊User Manual

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論