在實際產品開發中有時可能需要實現一些指定個數脈沖的輸出,這里介紹幾種基于定時器的實現方式。
1、 利用RCR寄存器結合單脈沖模式;
2、 利用DMA實時修改CCR寄存器的模式;
3、 利用定時器主從模式;
4、 利用中斷對脈沖實現計數模式;
一、利用RCR結合單脈沖模式
這種方式僅限于帶RCR寄存器的高級定時器,配合單脈沖模式,實現起來非常方便。
基本原理:計數器發生RCR+1個溢出動作后觸發更新事件,在單脈沖模式下,定時器發生更新事件時將停止計數并實現指定個數的脈沖輸出。
參考配置:
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);//TIM1通道1輸出一串脈沖。
二、利用DMA實時修改CCR寄存器的模式;
基本原理:基于定時器事件觸發DMA從而動態修改CCR寄存器的值最終實現指定個數的脈沖輸出。
下面示例使用定時器更新事件觸發DMA,輸出10個脈寬各不一樣的脈沖.
uint16_tDataforCCr[]={25,43,18,65,27,44,66,38,76,11,00};
參考配置:
TIM_CCxChannelCmd(htim3.Instance, TIM_CHANNEL_1,TIM_CCx_ENABLE);
__HAL_TIM_CLEAR_FLAG(&htim3, TIM_FLAG_UPDATE);
__HAL_TIM_ENABLE_DMA(&htim3, TIM_DMA_UPDATE);
HAL_DMA_Start(&hdma_tim3_up,(uint32_t)DataforCCr, (uint32_t)&htim3.Instance->CCR1, 11);
__HAL_TIM_ENABLE(&htim3);
TIM3->EGR = TIM_EGR_UG;
眼尖的人可能發現上圖中最后有個額外的尖脈沖,那是因為這里是基于更新事件觸發DMA,DMA傳輸新數據過來時有點延遲導致下一個PWM脈沖已經發生作用。這時,我們可以調整觸發事件,比方這里將觸發事件調整為比較事件,并開啟預裝功能即可以消除這個問題。上面測試過程是關閉了CCR寄存器的預裝功能的。
該方式可以做到非常靈活精準,但要多用個DMA外設。
三、利用定時器主從模式
基本原理:利用兩個定時器級聯成主從模式,一個定時器輸出門控信號,控制另外一個定時器的計數工作。
下面TIM4工作在主模式,其OC輸出作為觸發信號給到TIM8,TIM8工作在門控模式。
TIM_CCxChannelCmd(htim4.Instance, TIM_CHANNEL_1,TIM_CCx_ENABLE);
__HAL_TIM_ENABLE(&htim4);
TIM_CCxChannelCmd(htim8.Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE);
__HAL_TIM_MOE_ENABLE(&htim8);
__HAL_TIM_ENABLE(&htim8);
此模式實現起來簡單快捷,但當門控信號時鐘與從定時器時鐘缺乏同步關系時,輸出脈沖個數可能有偏差,尤其結尾的電平可能搖擺不定。
四、利用定時器中斷模式
基本原理:基于定時器更新事件或比較事件對脈沖個數進行實時計數,到達指
定數據后通過修改CCR或ARR寄存器的值來停止后續PWM的輸出。具體操
作需結合PWM輸出模式和最后希望停止輸出時的電平來對CCR進行賦值。
比如:輸出10個脈沖,最后電平停留在高電平。我們可以基于比較事件來對脈沖進行,并開啟CCR寄存器的預裝功能。若選用PWM1模式,極性選擇為高有效,向上計數模式時,則在第10個比較中斷里修改CCR=ARR+n[n大于等于1];若選用PWM2模式,極性選擇為高有效,則在第10個比較中斷里修改CCR=00。
該模式實現起來較為簡單,只需對定時器有些基本的了解即可,無需涉及定時器更多知識及DMA方面的應用等。
上面大體介紹了利用STM32定時器實現指定個數脈沖輸出的四種模式,各有特色,供君參考。我們實際應用中可以靈活采用。
審核編輯:湯梓紅
-
寄存器
+關注
關注
31文章
5363瀏覽量
121171 -
STM32
+關注
關注
2272文章
10924瀏覽量
357583 -
定時器
+關注
關注
23文章
3255瀏覽量
115373 -
脈沖輸出
+關注
關注
0文章
18瀏覽量
10788
原文標題:使用定時器輸出指定個數脈沖的幾種方式
文章出處:【微信號:stmcu832,微信公眾號:茶話MCU】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論