硬件:Stm32f103c8t6最小系統(tǒng)。
開(kāi)發(fā)平臺(tái):MDK-Arm。
目的:使用Stm32高級(jí)定時(shí)器TIM1。配置中心對(duì)齊模式輸出三路互補(bǔ)PWM。
(1)Stm32的高級(jí)定時(shí)器:
Stm32f103c8t6有一個(gè)高級(jí)定時(shí)器TIM1。STM32的高級(jí)定時(shí)器比通用定時(shí)器增加了可編程死區(qū)互補(bǔ)輸出,重復(fù)計(jì)數(shù)器,帶剎車(短路)功能。這些功能為電機(jī)控制提供了便利。其中重復(fù)計(jì)數(shù)器下篇文章單獨(dú)講。
TIM1的IO分配:
(2)高級(jí)定時(shí)器框圖分析:
圖1
圖1高級(jí)定時(shí)器框圖,可分為6部分,①時(shí)鐘源選擇,②控制器,③時(shí)基單元,④輸入捕獲,⑤輸出比較,⑥剎車斷路。
①時(shí)鐘選擇:
時(shí)鐘源有:內(nèi)部時(shí)鐘(CK_INT),外部時(shí)鐘模式1,外部時(shí)鐘模式2,內(nèi)部觸發(fā)輸入(ITRx)。具體可以看TIMx_SMCR寄存器SMS位和ECE位這里我們使用內(nèi)部時(shí)鐘64MHz(沒(méi)使用外部晶振,系統(tǒng)時(shí)鐘是64MHz)。
②控制器
控制器部分包含觸發(fā)控制器,從模式控制器,編碼器接口。觸發(fā)控制器可以為片內(nèi)外設(shè)提供觸發(fā)信號(hào)。
③⑤時(shí)基單元和輸出比較
時(shí)基單元的計(jì)數(shù)模式選中心對(duì)齊模式和比較輸出的比較模式選PWM模式來(lái)講解。
首先時(shí)鐘源通過(guò)預(yù)分頻寄存器PSC分頻得到CK_CNT,得到計(jì)數(shù)器CNT計(jì)數(shù)頻率,計(jì)數(shù)器開(kāi)始從0向上計(jì)數(shù),每計(jì)一次,和CCR比較一次,當(dāng)CRR>CNT, 輸出高電平,反之輸出低電平,計(jì)數(shù)器CNT繼續(xù)計(jì)數(shù),當(dāng)計(jì)數(shù)器等于ARR值時(shí),計(jì)數(shù)器向下計(jì)數(shù),當(dāng)計(jì)數(shù)器CNT>CCR時(shí),輸出低電平,反之輸出高電平。計(jì)數(shù)器周而復(fù)始向上向下計(jì)數(shù)并不斷的和CRR值比較,參考圖2。
圖2
實(shí)際此過(guò)程我們可以看成一個(gè)比較器,CRR作為參考電壓,接到比較器同相輸入端,CNT作為信號(hào)電壓,接到比較器反相輸入端,這樣根據(jù)比較輸出PWM。反之把CNT和CRR調(diào)換位置,會(huì)輸出相反極性的PWM,參考圖2.
計(jì)數(shù)器計(jì)數(shù)模式有:向上計(jì)數(shù),向下計(jì)數(shù),中心對(duì)齊計(jì)數(shù)。
比較輸出比較模式:凍結(jié),匹配時(shí)設(shè)置通道x為有效電平,匹配時(shí)設(shè)置通道x為無(wú)效電平,翻轉(zhuǎn),強(qiáng)制為無(wú)效電平,強(qiáng)制為有效電平,PWM1,PWM2。
死區(qū)發(fā)生器:
通過(guò)寄存器BDTR的位UTG[7:0]來(lái)配置死區(qū)時(shí)間,關(guān)于死區(qū)時(shí)間設(shè)置可以這篇文章:
⑥短路功能
斷路功能用于電控的剎車功能,可以通過(guò)寄存器BDTR的BKE位使能斷路功能,BKP位設(shè)置斷路輸入引腳的有效電平
④輸入捕獲
輸入捕獲可以對(duì)輸入的信號(hào)的上升沿,下降沿或者雙邊沿進(jìn)行捕獲,常用的有測(cè)量輸 入信號(hào)的脈寬和測(cè)量 PWM 輸入信號(hào)的頻率和占空比這兩種。
輸入捕獲的大概的原理就是,當(dāng)捕獲到信號(hào)的跳變沿的時(shí)候,把計(jì)數(shù)器 CNT 的值鎖存 到捕獲寄存器 CCR 中,把前后兩次捕獲到的 CCR 寄存器中的值相減,就可以算出脈寬或者頻率。如果捕獲的脈寬的時(shí)間長(zhǎng)度超過(guò)你的捕獲定時(shí)器的周期,就會(huì)發(fā)生溢出,這個(gè)我 們需要做額外的處理。
(3)程序設(shè)計(jì)
程序使用ST官方固件庫(kù),編程步驟:
①GPIO初始化;
②時(shí)基結(jié)構(gòu)體TIM_TimeBaseInitTypeDef 初始化;
③比較結(jié)構(gòu)體 TIM_OCInitTypeDef 初始化;
④剎車和死區(qū)結(jié)構(gòu)體 TIM_BDTRInitTypeDef 初始化。
程序分析:
①宏定義:
#define RCC_TIMGPIO_CLK RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB
#define TIM_CHxGPIO_Pinx GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11
#define TIM_CHxGPIOx GPIOA
#define TIM_CHxNGPIO_Pinx GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15
#define TIM_CHxNGPIOx GPIOB
#define TIM_BKINGPIO_Pinx GPIO_Pin_2
#define TIM_BKINGPIOx GPIOB
//TIM1 macro definition
/ PWM頻率和死區(qū)時(shí)間計(jì)算 */
//電機(jī)控制載波頻率一般配置在15-20KHz,頻率配置低了電機(jī)噪聲大,配置高了,對(duì)MOS
//管開(kāi)關(guān)頻率要求高,且開(kāi)關(guān)損耗大,這里載波配置為20KHz。
//計(jì)數(shù)器頻率計(jì)算CK_CNT = 64MHz/(PSC+1) = 64MHz/1=64MHz
//中心對(duì)齊PWM頻率=CK_INT/2(ARR+1)=64M/2(1599+1)=20KHz。
//死區(qū)時(shí)間配置為2us
//64M/(CKD+1)/ UTG = 500KHz,換算成時(shí)間位2us
// TIMx_CR1寄存器CKD 位,TIMx_BDTR寄存器UTG位。
#define TIMx TIM1
#define RCC_TIM_CLK RCC_APB2Periph_TIM1
#define TIM_ARR 1599
#define TIM_CK_PSC 0
#define TIM_RCR 0
#define TIM_CCRx 799
#define PWM_DeadTime 128
②GPIO初始化:
static void GPIO_TIM_Config(void){
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_TIMGPIO_CLK, ENABLE);
//TIM1_PA8CH1 PA9CH2 PA10CH3 PA11CH4
GPIO_InitStructure.GPIO_Pin = TIM_CHxGPIO_Pinx;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//PB13CH1N PB14CH2N PB15CH3N PB12BKIN
GPIO_InitStructure.GPIO_Pin = TIM_CHxNGPIO_Pinx;
GPIO_Init(TIM_CHxNGPIOx, &GPIO_InitStructure);
//PB12BKIN
GPIO_InitStructure.GPIO_Pin = TIM_BKINGPIO_Pinx;
GPIO_Init(TIM_BKINGPIOx, &GPIO_InitStructure);
GPIO_ResetBits(TIM_BKINGPIOx,TIM_BKINGPIO_Pinx);//剎車
}
③定時(shí)器時(shí)基單元,輸出比較,剎車死區(qū)初始化:
static void AdvanceTIM1_Config(void){
//開(kāi)啟定時(shí)器時(shí)鐘,即內(nèi)部時(shí)鐘CK_INT=64MHz
RCC_APB2PeriphClockCmd(RCC_TIM_CLK,ENABLE);
/*--------------------時(shí)基結(jié)構(gòu)體初始化-------------------------*/
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = TIM_ARR; //自動(dòng)重裝載寄存器的值,累計(jì)TIM_Period+1個(gè)頻率后產(chǎn)生一個(gè)更新或者中斷
TIM_TimeBaseStructure.TIM_Prescaler = TIM_CK_PSC; //驅(qū)動(dòng)CNT計(jì)數(shù)器的時(shí)鐘 = Fck_int/(psc+1)
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //時(shí)鐘分頻因子 ,配置死區(qū)時(shí)間時(shí)需要用到
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned1; //中心對(duì)齊1
TIM_TimeBaseStructure.TIM_RepetitionCounter = TIM_RCR; //重復(fù)計(jì)數(shù)器的值,沒(méi)用到不用管
TIM_TimeBaseInit(TIMx, &TIM_TimeBaseStructure); //初始化定時(shí)器
/*--------------------輸出比較結(jié)構(gòu)體初始化-------------------*/
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //PWM1模式
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //輸出使能
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; //互補(bǔ)輸出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出通道電平極性配置
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; //互補(bǔ)輸出通道電平極性配置
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; //輸出通道空閑電平極性配置
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset; //互補(bǔ)輸出通道空閑電平極性配置
TIM_OCInitStructure.TIM_Pulse = TIM_CCRx; //設(shè)置占空比大小
TIM_OC1Init(TIMx, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIMx, TIM_OCPreload_Enable);
TIM_OC2Init(TIMx, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIMx, TIM_OCPreload_Enable);
TIM_OC3Init(TIMx, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIMx, TIM_OCPreload_Enable);
/*-------------------剎車和死區(qū)結(jié)構(gòu)體初始化-------------------*/
//有關(guān)剎車和死區(qū)結(jié)構(gòu)體的成員具體可參考BDTR寄存器的描述
TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;
//輸出比較信號(hào)死區(qū)時(shí)間配置,具體如何計(jì)算可參考 BDTR:UTG[7:0]的描述
//這里配置的死區(qū)時(shí)間為2uS
TIM_BDTRInitStructure.TIM_DeadTime = 128;
TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable;
//當(dāng)BKIN引腳檢測(cè)到高電平的時(shí)候,輸出比較信號(hào)被禁止,就好像是剎車一樣
TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
TIM_BDTRConfig(TIMx, &TIM_BDTRInitStructure);
TIM_Cmd(TIMx, ENABLE);
//主輸出使能,當(dāng)使用的是通用定時(shí)器時(shí),這句不需要
TIM_CtrlPWMOutputs(TIMx, ENABLE);
}
(4)程序燒錄驗(yàn)證:圖3是一對(duì)PWM互補(bǔ)輸出波形。
圖3
-
電機(jī)控制
+關(guān)注
關(guān)注
3534文章
1879瀏覽量
268817 -
PWM波
+關(guān)注
關(guān)注
0文章
99瀏覽量
16857 -
預(yù)分頻器
+關(guān)注
關(guān)注
0文章
18瀏覽量
8135 -
STM32F103C8T6
+關(guān)注
關(guān)注
108文章
160瀏覽量
83573 -
stm32定時(shí)器
+關(guān)注
關(guān)注
0文章
13瀏覽量
2294
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論