MCU微課堂
CKS32F107xx TIM(四)
第四十八期 2024.11.22
定時器同步
CKS32F107xx系列部分定時器在內部是相連的,可用于定時器同步或鏈接,方便用戶配置不同的同步模式,以便在電機控制、數據采集和PWM信號生成等應用中,實現復雜的時間序列和多通道的同步操作。本節課我們將圍繞定時器同步功能概述展開,并以其中一種功能為例——將定時器2給定時器3當預分頻器,最終級聯同步PWM輸出。
依據《CKS32F107xx參考手冊》的從模式控制寄存器相關章節得知,并非任意兩個定時器都能任意級聯,硬件方面是固定的,若某個產品中沒有相應的定時器,則對應的觸發信號ITRx也不存在。如下表1所示。
表1 普通輸入捕獲概覽圖
如下圖1所示,TIM2更新事件的輸出信號TRGO1可以連接到TIM3的內部觸發信號線ITR1(可由表1查閱得知),作為TIM3 的時鐘輸入。
圖1 主從定時器示例
要使TIM2和TIM3級聯同步輸出PWM波形,我們還會用到控制寄存器2(TIMx_CR2)和從模式控制寄存器(TIMx_SMCR)。接下來我們簡單介紹下這兩個寄存器。
首先是控制寄存器2(TIMx_CR2),該寄存器的各位描述如下圖所示:
圖2 TIMx_CR2
關于該寄存器的詳細說明,請參照《CKS32F107xx參考手冊》。這里我們用到的是主模式選擇位域MMS,此部分由3位組成。共有8種模式可供選擇,因為我們使用的是更新模式,所以必須設置為010。
接下來我們介紹從模式控制寄存器(TIMx_SMCR),該寄存器的各位描述如下圖所示:
圖3 TIMx_SMCR
在該寄存器中,我們用到了SMS和TS位域,均由3位組成,各有8種不同模式組合。其中SMS控制從模式選擇,這里我們配置成100,選擇門控模式,確保從定時器的開始和結束都是由主定時器的輸出信號控制。TS控制觸發選擇,根據表1描述得知,我們必須配置成001。
定時器級聯同步輸出PWM配置操作
通過上述對定時器功能的描述,下面我們要實現TIM2發生事件更新時發送觸發信號驅動TIM3計數,并使能兩個定時器在PWM1模式下由定時器通道1輸出PWM波形。編程的要點如下所示。
1、配置PA0和PA6引腳為復用輸出功能
我們調用如下函數實現:
void TIM_GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
2、TIM2配置為主定時器
TIM2配置為PWM1模式輸出,使能主從模式,并選擇更新事件作為觸發輸出,主要代碼如下:
void TIM2_Master_Mode_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM2_TimeBaseStructure;
TIM_OCInitTypeDef TIM2_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
/* Time Base Configuration */
TIM2_TimeBaseStructure.TIM_Prescaler = 8;
TIM2_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM2_TimeBaseStructure.TIM_Period = 79;
TIM2_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseInit(TIM2, &TIM2_TimeBaseStructure);
/* TIM2 Channel 1 Configuration in PWM1 mode */
TIM2_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM2_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM2_OCInitStructure.TIM_Pulse = 40 ;
TIM2_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM2, &TIM2_OCInitStructure);
TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);
/* Master Mode selection */
TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);
}
從上述代碼可得知,TIM2CLK固定為72MHz,TIM2預分頻為8,因此主定時器TIM2計數器時鐘頻率為8MHz頻率,則TIM2頻率=TIM2計數器時鐘/(TIM2_Period + 1)=100KHz,占空比為TIM2_CCR1/(TIM2_ARR + 1) = 50%。
3、TIM3配置為從定時器
TIM3配置為門控模式,并選擇ITR1作為輸入,主要代碼如下:
void TIM3_Slave_Mode_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM3_TimeBaseStructure;
TIM_OCInitTypeDef TIM3_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
/* Time Base Configuration */
TIM3_TimeBaseStructure.TIM_Prescaler = 0;
TIM3_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM3_TimeBaseStructure.TIM_Period = 4;
TIM3_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseInit(TIM3, &TIM3_TimeBaseStructure);
/* TIM3 Channel 1 Configuration in PWM1 mode */
TIM3_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM3_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM3_OCInitStructure.TIM_Pulse = 2;
TIM3_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM3, &TIM3_OCInitStructure);
/* Slave Mode selection: TIM3 */
TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Gated);
TIM_SelectInputTrigger(TIM3, TIM_TS_ITR1);
}
從上述代碼可得知,從定時器TIM3頻率為(TIM2 frequency)/ (TIM3 period + 1)=20kHz,占空比為TIM3_CCR1/(TIM3_ARR + 1) = 40%。
4、主函數
初始化主從定時器,最終實現級聯同步PWM輸出,主要代碼如下:
int main(void)
{
TIM_GPIO_Configuration();
TIM3_Slave_Mode_Configuration();
TIM2_Master_Mode_Configuration();
TIM_Cmd(TIM2, ENABLE); /* Enable TIM2 Counter */
TIM_Cmd(TIM3, ENABLE); /* Enable TIM3 Counter */
while(1)
{
}
}
至此,用示波器測量PA0和PA6引腳的波形(注意共地);下載程序,調節示波器,可在示波器看到有PWM波形輸出,如下圖4所示:
圖4PWM波形輸出
-
電機控制
+關注
關注
3534文章
1877瀏覽量
268794 -
寄存器
+關注
關注
31文章
5343瀏覽量
120332 -
PWM
+關注
關注
114文章
5186瀏覽量
213902 -
定時器
+關注
關注
23文章
3248瀏覽量
114781
原文標題:MCU微課堂|CKS32F107xx TIM(四)
文章出處:【微信號:中科芯MCU,微信公眾號:中科芯MCU】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論