專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> STM32 >> 瀏覽文章

STM32高級(jí)定時(shí)器1控制伺服直流電機(jī)

作者:洛陽(yáng)煙塵   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年05月15日   【字體:

 使用STM32也有很多年了,現(xiàn)在畢業(yè)臨近了,就想寫寫,做做記錄也希望能幫助到可以幫助的人。

 
STM32定時(shí)器有很多的用途,我也不一一舉例,我最常用的就是輸出PWM,定時(shí)器,輸入捕獲以及編碼盤模式等等。
 
第一 : 用STM32高級(jí)定時(shí)器1控制伺服直流電機(jī)
 
///////////////////////////////////////////
//定時(shí)器1PWM初始化 共4路可變掌控比/////////
//輸入?yún)?shù)PWM1/2/3/4掌控比參數(shù)30000-60000//
//////////////////////////////////////////
void TIM1_PWM(unsigned int PWM1_Val,unsigned int PWM2_Val,unsigned int PWM3_Val,unsigned int PWM4_Val )
{
vu16 CCR1_Val = PWM1_Val;
vu16 CCR2_Val = PWM2_Val;
vu16 CCR3_Val = PWM3_Val;
vu16 CCR4_Val = PWM4_Val;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_TIM1 , ENABLE); //打開相應(yīng)的定時(shí)器時(shí)鐘和復(fù)用推挽輸出對(duì)應(yīng)I/O口時(shí)鐘
//這里是定時(shí)器對(duì)應(yīng)的是TOP值是60000
 
TIM_TimeBaseStructure.TIM_Period = 60000;//計(jì)數(shù)器向上最大計(jì)數(shù)到65535后產(chǎn)生更新事件,計(jì)數(shù)值歸零
TIM_TimeBaseStructure.TIM_Prescaler = 2; //設(shè)置預(yù)分頻器分頻系數(shù)2 TIM_TimeBaseStructure.TIM_ClockDivision = 0;//設(shè)置了時(shí)鐘分割
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//選擇向上計(jì)數(shù)
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
 
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);//根據(jù)TIM_TimeBaseInitStruct中指定的參數(shù)初始化TIMx
 
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2 ;//PWM2模式
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//輸出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;//TIM輸出比較極性
 
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;//配著相對(duì)應(yīng)的I/O
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//復(fù)用推挽輸出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //翻轉(zhuǎn)頻率為50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure);
 
 
TIM_OCInitStructure.TIM_Pulse = CCR1_Val;//比較數(shù)
TIM_OC1Init(TIM1, &TIM_OCInitStructure);//初始化定時(shí)1
 
TIM_OCInitStructure.TIM_Pulse = CCR2_Val;
TIM_OC2Init(TIM1, &TIM_OCInitStructure);//初始化定時(shí)1
 
TIM_OCInitStructure.TIM_Pulse = CCR3_Val;
TIM_OC3Init(TIM1, &TIM_OCInitStructure);//初始化定時(shí)1
 
TIM_OCInitStructure.TIM_Pulse = CCR4_Val;
TIM_OC4Init(TIM1, &TIM_OCInitStructure);//初始化定時(shí)1
 
TIM_Cmd(TIM1, ENABLE);//使能定時(shí)器
 
TIM_CtrlPWMOutputs(TIM1,ENABLE);
}
 
在這個(gè)函數(shù)中我已經(jīng)把STM32定時(shí)器輸出PWM的模板寫好了,你可以去改進(jìn)也可以去深入的學(xué)習(xí),即使有了程序還是不夠的,你必須了解定時(shí)器工作的原理和它為什么能達(dá)到這樣的效果,不然你僅僅只會(huì)使用而不能得心應(yīng)手把它很好應(yīng)用到你自己的項(xiàng)目中。
 
對(duì)于定時(shí)器你去學(xué)習(xí)單片機(jī)時(shí)肯定會(huì)遇到的一個(gè)很重要的問(wèn)題,在視頻教學(xué)里面有很多的講解和看法,在這里我也來(lái)說(shuō)說(shuō)自己的看法。
 
定時(shí)器我認(rèn)為就是一個(gè)只要你使能它,它就一直在計(jì)數(shù)的一個(gè)16位的計(jì)數(shù)器,從0到65535,當(dāng)你配置了相應(yīng)的定時(shí)器模式、TOP值、匹配值時(shí),它就會(huì)在計(jì)數(shù)到相應(yīng)的位置產(chǎn)生中斷或者從新計(jì)數(shù)也就是說(shuō)發(fā)生更新事件。就拿輸出PWM來(lái)做解釋,在上面我設(shè)定了TOP值為60000,設(shè)置了為PWM2模式,使定時(shí)器的輸出極性為低。通俗的說(shuō)就是當(dāng)我在主函數(shù)中配置該定時(shí)器時(shí),高級(jí)定時(shí)器TIM1就會(huì)啟動(dòng),這里如果我設(shè)定比較值為30000,那么定時(shí)器一直計(jì)數(shù),從0開始對(duì)應(yīng)的I/O口為高電平,一旦定時(shí)器計(jì)數(shù)到30000,對(duì)應(yīng)I/O口出現(xiàn)下降沿,電平發(fā)生改變,從高電平轉(zhuǎn)變成低電平,然后計(jì)數(shù)到60000,定時(shí)器出現(xiàn)更新事件,對(duì)應(yīng)的I/O出現(xiàn)上升沿,電平發(fā)生改變,從低電平轉(zhuǎn)變成高電平。由此反復(fù),從而形成50%占空比的PWM,這個(gè)函數(shù)可以自定義占空比,但是不能改變頻率。
 
這里我只是很隨意的講解了定時(shí)器的比較簡(jiǎn)單的應(yīng)用,如果你想深入的了解,就一定要去看芯片手冊(cè),看懂它,熟透它,只有這樣你才能對(duì)它使用的得心應(yīng)手,如果想做好就一定要去努力。
 
當(dāng)然定時(shí)器的時(shí)鐘這塊很是重要,也可以說(shuō)STM32的時(shí)鐘樹是一定要了解,精通和熟透的東西,在這個(gè)我不講解,在后面的過(guò)程中我會(huì)用一個(gè)比較大的篇幅去講解STM32時(shí)鐘樹,還有一些我自己的看法。
 
希望能對(duì)有些初入的學(xué)者有所幫助,我也是記錄我自己的學(xué)習(xí)歷程,一起努力。
關(guān)閉窗口

相關(guān)文章