


TIM1 單路PWM的配置
1.開啟TIM1定時器時鐘,配置PA8為復用輸出(說明PA8不再是簡單的IO口,而是做定時器用了,注意IO輸出最大為50MHZ)有一點要注意,定時器的時鐘不是直接來自APB1或APB2,而是來自于輸入為APB1或APB2的一個倍頻器,當APB1的預分頻系數為1時,這個倍頻器不起作用,定時器的時鐘頻率等于APB1的頻率;當 APB1的預分頻系數為其它數值(即預分頻系數為2、4、8或16)時,這個倍頻器起作用,定時器的時鐘頻率等于APB1的頻率兩倍。
庫函數使能TIM3的方法:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
PA8的復用功能配置
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//復用推挽輸出
2.在開啟了TIM1時鐘后就需要設置ARR,PSC,通過設置這兩個值來控制PWM的周期
具體配置如下
TIM_TimeBaseStructure.TIM_Period = arr; //設置自動重裝載值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //設置預分頻值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設置時鐘分割:TDTS =Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上計數模式
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根據指定的參數初始化TIMx 的
3)設置 TIM1_CH1 的 PWM 模式及通道方向,使能 TIM1 的 CH1 輸出。
接下來,我們要設置 TIM1_CH1 為 PWM 模式(默認是凍結的),因為我們的 DS0 是低電
平亮,而我們希望當 CCR1 的值小的時候, DS0 就暗, CCR1 值大的時候, DS0 就亮,所以我
們要通過配置 TIM1_CCMR1 的相關位來控制 TIM1_CH1 的模式。在庫函數中, PWM 通道設
置是通過函數 TIM_OC1Init()~TIM_OC4Init()來設置的,不同的通道的設置函數不一樣,這里我
們使用的是通道 1,所以使用的函數是TIM_OC1Init()。
void TIM——OC1Init(TIM_TypeDef*TIMx,TIM_OCInitTypeDef*TIM_OCInitStructure)
這種初始化格式大家學到這里應該也熟悉了,所以我們直接來看看結構體 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;
參數 TIM_OCMode 設置模式是 PWM 還是輸出比較,這里我們是 PWM 模式。
參數 TIM_OutputState 用來設置比較輸出使能,也就是使能 PWM 輸出到端口。
參數 TIM_OCPolarity 用來設置極性是高還是低。
其他的參數 TIM_OutputNState, TIM_OCNPolarity, TIM_OCIdleState 和TIM_OCNIdleState 是
高級定時器 TIM1 和 TIM8 才用到的。
要實現我們上面提到的場景,方法是:
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。
在完成以上設置了之后,我們需要使能 TIM1。使能 TIM1 的方法前面已經講解過:
TIM_Cmd(TIM1, ENABLE); //使能 TIM1
5)設置 MOE 輸出,使能 PWM 輸出。
普通定時器在完成以上設置了之后,就可以輸出 PWM 了,但是高級定時器,我們還需要
使能剎車和死區寄存器(TIM1_BDTR)的 MOE 位,以使能整個 OCx(即 PWM)輸出。 庫函
數的設置函數為:【這個配置只用于定時器1與定時器8兩個高級定時器,一般的定時不要配置這兩個】
TIM_CtrlPWMOutputs(TIM1,ENABLE);//MOE 主輸出使能
6)修改 TIM1_CCR1 來控制占空比。
最后,在經過以上設置之后, PWM 其實已經開始輸出了,只是其占空比和頻率都是固定
的,而我們通過修改 TIM1_CCR1 則可以控制 CH1 的輸出占空比。繼而控制 DS0 的亮度。
在庫函數中,修改 TIM1_CCR1 占空比的函數是:
void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);
理所當然,對于其他通道,分別有一個函數名字,函數格式為TIM_SetComparex(x=1,2,3,4);
PWM占空比,周期計算
下面的這個是stm32的定時器邏輯圖,上來有助于理解:

TIM3的ARR寄存器和PSC寄存器,
確定PWM頻率。
這里配置的這兩個定時器確定了PWM的頻率,我的理解是:PWM的周期(頻率)就是ARR寄存器值與PSC寄存器值相乘得來,但不是簡單意義上的相乘,例如要設置PWM的頻率參考上次通用定時器中設置溢出時間的算法,例如輸出100HZ頻率的PWM,首先,確定TIMx的時鐘,除非APB1的時鐘分頻數設置為1,否則通用定時器TIMx的時鐘是APB1時鐘的2倍,這時的TIMx時鐘為72MHz,用這個TIMx時鐘72MHz除以(PSC+1),得到定時器每隔多少秒漲一次,這里給PSC賦7199,計算得定時器每隔0.0001秒漲一次,即此時頻率為10KHz,再把這個值乘以(ARR+1)得出PWM頻率,假如ARR值為0,即0.0001*(0+1),則輸出PWM頻率為10KHz,再假如輸出頻率為100Hz的PWM,則將ARR寄存器設置為99即可。如果想調整PWM占空比精度,則只需降低PSC寄存器的值即可。
TIMx_CCRx寄存器,
確定PWM的占空比。
TIMx_CCR1—TIMx_CCR4確定定時器的CH1—CH4四路PWM的占空比。直接給該寄存器賦0—65535值即可確定占空比。占空比計算方法:TIMx_CCRx的值除以ARR寄存器的值即為占空比,因為占空比在0—100%之間,所以一般TIMx_CCRx寄存器值不能超過ARR寄存器的值,否則可能會引起PWM的頻率或占空比的準確性。
| 歡迎光臨 (http://m.raoushi.com/bbs/) | Powered by Discuz! X3.1 |