1. 程式人生 > >ADC配置成定時器觸發的啟發

ADC配置成定時器觸發的啟發

會同 產生 我們 轉換 註意 想要 凍結 獨立 這一

百度文庫:https://wenku.baidu.com/view/99d39413f78a6529647d5344.html

STM32關於使用定時器觸發ADC轉換的解決辦法和詳細說明

本人在使用STM32上的TIM2_CC2觸發ADC轉換的時候,發現始終調不出來,在網上找到了一些有價值的參考信息,然後在不懈的尋根究底下,終於找到問題的原因,廢話少說,進入正題: 以STM32 ADC的常規通道為例(註入通道類似):

技術分享圖片

如上圖,STM32 ADC的常規通道可以由以上6個信號觸發任何一個,我們以使用TIM2_CH2觸發ADC1,獨立模式,每次僅測一條通道,則ADC的配置如下:(以下代碼使用STM32固件庫V3.5)

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

上圖中紅藍兩個框的中間部分,頂上是TIM2的自動重裝寄存器和計數器寄存器,下面4個Capture/compare x register是TIM2_CCRx寄存器

要使用TIM2的CC2來觸發ADC,看懂這個圖是關鍵。
首先要明確,這個圖的紅框部分和藍框部分,是不會同時工作的,紅框是配置為輸入捕捉模式才能生效,藍框是配置為輸出比較模式才能生效,通過配置TIM2_CCMR1_CC2S來控制TIM2_CC2究竟是處於哪種模式(CC2S=0為比較輸出,>0為輸入捕捉),請註意:這裏藍框的其中一個輸出是TIMx_CH2,而TIM2_CH2又是ADC規則通道的觸發源,也就是說如果要觸發ADC,則需要每次比較匹配時,在TIM2_CH2上產生一次上升沿。

那麽我們首先需要操作藍框內的最左邊部分也就是OC2REF,要使比較匹配時發生一次上升沿,(以定時器向上計數為例,)就需要在TIM2_CNT<TIM2_CCR2時,通道2為低電平,TIM2_CNT>=TIM2_CCR2時,通道2為高電平。
從參考手冊定時器一章4.7節的CCMR1寄存器中的0C2M[2:0]的介紹可以看出來,只有在PWM模式才能滿足上面所說的條件,任何單純的凍結、配置OC2REF為高或者為低、強制OC2REF為高或者為低,都無法滿足要求,不少同學就是死在這個上面,以為是配置TIMING模式,實際上這樣根本無法改變OC2REF的電平,就無從觸發ADC了。
CCMR1_CCxS(x為1、2、3、4,決定是哪個通道)是選擇為捕捉輸入還是比較輸出,這裏我們需要配置為輸出。 以上兩段配置程序,可以以100ms的周期驅動AD轉換一次,不再需要使用TIM和ADC中斷資源。

總結:想要使用STM32的定時器觸發ADC,必須將定時器配置為比較輸出PWM模式,並且一定要註意TIMx_CHx輸出上升沿才出發,若是在比較匹配的瞬時產生的不是上升沿而是下降沿,那麽就不一定是在比較匹配的瞬間觸發ADC了,特別是在類似於電機控制的應用中要註意這一點

ADC配置成定時器觸發的啟發