STM32的ADC支援多樣的觸發取樣方式,除了用軟體寫入register觸發外,還可以利用Timer和GPIO做觸發,以STM32F070RBT6為例,除了軟體觸發外還支援下列來源的觸發。
這個範例,採用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。
大大购相关商品 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已依照設定的取樣率工作。
評論