TIM1 單路PWM的配置
1.開(kāi)啟TIM1定時(shí)器時(shí)鐘,配置PA8為復(fù)用輸出(說(shuō)明PA8不再是簡(jiǎn)單的IO口,而是做定時(shí)器用了,注意IO輸出最大為50MHZ)有一點(diǎn)要注意,定時(shí)器的時(shí)鐘不是直接來(lái)自APB1或APB2,而是來(lái)自于輸入為APB1或APB2的一個(gè)倍頻器,當(dāng)APB1的預(yù)分頻系數(shù)為1時(shí),這個(gè)倍頻器不起作用,定時(shí)器的時(shí)鐘頻率等于APB1的頻率;當(dāng) APB1的預(yù)分頻系數(shù)為其它數(shù)值(即預(yù)分頻系數(shù)為2、4、8或16)時(shí),這個(gè)倍頻器起作用,定時(shí)器的時(shí)鐘頻率等于APB1的頻率兩倍。
庫(kù)函數(shù)使能TIM3的方法:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
PA8的復(fù)用功能配置
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//復(fù)用推挽輸出
2.在開(kāi)啟了TIM1時(shí)鐘后就需要設(shè)置ARR,PSC,通過(guò)設(shè)置這兩個(gè)值來(lái)控制PWM的周期
具體配置如下
TIM_TimeBaseStructure.TIM_Period = arr; //設(shè)置自動(dòng)重裝載值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //設(shè)置預(yù)分頻值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設(shè)置時(shí)鐘分割:TDTS =Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上計(jì)數(shù)模式
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根據(jù)指定的參數(shù)初始化TIMx 的
3)設(shè)置 TIM1_CH1 的 PWM 模式及通道方向,使能 TIM1 的 CH1 輸出。
接下來(lái),我們要設(shè)置 TIM1_CH1 為 PWM 模式(默認(rèn)是凍結(jié)的),因?yàn)槲覀兊?DS0 是低電
平亮,而我們希望當(dāng) CCR1 的值小的時(shí)候, DS0 就暗, CCR1 值大的時(shí)候, DS0 就亮,所以我
們要通過(guò)配置 TIM1_CCMR1 的相關(guān)位來(lái)控制 TIM1_CH1 的模式。在庫(kù)函數(shù)中, PWM 通道設(shè)
置是通過(guò)函數(shù) TIM_OC1Init()~TIM_OC4Init()來(lái)設(shè)置的,不同的通道的設(shè)置函數(shù)不一樣,這里我
們使用的是通道 1,所以使用的函數(shù)是TIM_OC1Init()。
void TIM——OC1Init(TIM_TypeDef*TIMx,TIM_OCInitTypeDef*TIM_OCInitStructure)
這種初始化格式大家學(xué)到這里應(yīng)該也熟悉了,所以我們直接來(lái)看看結(jié)構(gòu)體 TIM_OCInitTypeDef
的定義:
typedef struct
{
uint16_t TIM_OCMode;
uint16_t TIM_OutputState;
uint16_t TIM_OutputNState; */
uint16_t TIM_Pulse;
uint16_t TIM_OCPolarity;
uint16_t TIM_OCNPolarity;
uint16_t TIM_OCIdleState;
uint16_t TIM_OCNIdleState;
}TIM_OCInitTypeDef;
參數(shù) TIM_OCMode 設(shè)置模式是 PWM 還是輸出比較,這里我們是 PWM 模式。
參數(shù) TIM_OutputState 用來(lái)設(shè)置比較輸出使能,也就是使能 PWM 輸出到端口。
參數(shù) TIM_OCPolarity 用來(lái)設(shè)置極性是高還是低。
其他的參數(shù) TIM_OutputNState, TIM_OCNPolarity, TIM_OCIdleState 和TIM_OCNIdleState 是
高級(jí)定時(shí)器 TIM1 和 TIM8 才用到的。
要實(shí)現(xiàn)我們上面提到的場(chǎng)景,方法是:
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //選擇 PWM 模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//比較輸出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//輸出極性高
TIM_OC1Init(TIM1, &TIM_OCInitStructure); //初始化 TIM1OC1
4)使能 TIM1。
在完成以上設(shè)置了之后,我們需要使能 TIM1。使能 TIM1 的方法前面已經(jīng)講解過(guò):
TIM_Cmd(TIM1, ENABLE); //使能 TIM1
5)設(shè)置 MOE 輸出,使能 PWM 輸出。
普通定時(shí)器在完成以上設(shè)置了之后,就可以輸出 PWM 了,但是高級(jí)定時(shí)器,我們還需要
使能剎車(chē)和死區(qū)寄存器(TIM1_BDTR)的 MOE 位,以使能整個(gè) OCx(即 PWM)輸出。 庫(kù)函
數(shù)的設(shè)置函數(shù)為:【這個(gè)配置只用于定時(shí)器1與定時(shí)器8兩個(gè)高級(jí)定時(shí)器,一般的定時(shí)不要配置這兩個(gè)】
TIM_CtrlPWMOutputs(TIM1,ENABLE);//MOE 主輸出使能
6)修改 TIM1_CCR1 來(lái)控制占空比。
最后,在經(jīng)過(guò)以上設(shè)置之后, PWM 其實(shí)已經(jīng)開(kāi)始輸出了,只是其占空比和頻率都是固定
的,而我們通過(guò)修改 TIM1_CCR1 則可以控制 CH1 的輸出占空比。繼而控制 DS0 的亮度。
在庫(kù)函數(shù)中,修改 TIM1_CCR1 占空比的函數(shù)是:
void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);
理所當(dāng)然,對(duì)于其他通道,分別有一個(gè)函數(shù)名字,函數(shù)格式為T(mén)IM_SetComparex(x=1,2,3,4);
PWM占空比,周期計(jì)算
下面的這個(gè)是stm32的定時(shí)器邏輯圖,上來(lái)有助于理解:
TIM3的ARR寄存器和PSC寄存器,
確定PWM頻率。
這里配置的這兩個(gè)定時(shí)器確定了PWM的頻率,我的理解是:PWM的周期(頻率)就是ARR寄存器值與PSC寄存器值相乘得來(lái),但不是簡(jiǎn)單意義上的相乘,例如要設(shè)置PWM的頻率參考上次通用定時(shí)器中設(shè)置溢出時(shí)間的算法,例如輸出100HZ頻率的PWM,首先,確定TIMx的時(shí)鐘,除非APB1的時(shí)鐘分頻數(shù)設(shè)置為1,否則通用定時(shí)器TIMx的時(shí)鐘是APB1時(shí)鐘的2倍,這時(shí)的TIMx時(shí)鐘為72MHz,用這個(gè)TIMx時(shí)鐘72MHz除以(PSC+1),得到定時(shí)器每隔多少秒漲一次,這里給PSC賦7199,計(jì)算得定時(shí)器每隔0.0001秒漲一次,即此時(shí)頻率為10KHz,再把這個(gè)值乘以(ARR+1)得出PWM頻率,假如ARR值為0,即0.0001*(0+1),則輸出PWM頻率為10KHz,再假如輸出頻率為100Hz的PWM,則將ARR寄存器設(shè)置為99即可。如果想調(diào)整PWM占空比精度,則只需降低PSC寄存器的值即可。
TIMx_CCRx寄存器,
確定PWM的占空比。
TIMx_CCR1—TIMx_CCR4確定定時(shí)器的CH1—CH4四路PWM的占空比。直接給該寄存器賦0—65535值即可確定占空比。占空比計(jì)算方法:TIMx_CCRx的值除以ARR寄存器的值即為占空比,因?yàn)檎伎毡仍?—100%之間,所以一般TIMx_CCRx寄存器值不能超過(guò)ARR寄存器的值,否則可能會(huì)引起PWM的頻率或占空比的準(zhǔn)確性。
歡迎光臨 (http://www.torrancerestoration.com/bbs/) | Powered by Discuz! X3.1 |