概念+代碼
一、輸出比較
OC(Output Compare)輸出比較
輸出比較可以通過比較CNT與CCR寄存器值的關系,來對輸出電平進行置1、置0或翻轉的操作,用于輸出一定頻率和占空比的PWM波形
每個高級定時器和通用定時器都擁有4個輸出比較通道
高級定時器的前3個通道額外擁有死區(qū)生成和互補輸出的功能
二、PWM原理
PWM(Pulse Width Modulation)脈沖寬度調制
在具有慣性的系統中,可以通過對一系列脈沖的寬度進行調制,來等效地獲得所需要的模擬參量,常應用于電機控速等領域
PWM參數:
頻率 = 1 / TS
占空比 = TON / TS(高電平占總時間的比率),如占空比為50%,高電平=5V,低電平=0V,則模擬電壓為2.5V.
分辨率 = 占空比變化步距,即精度。
PWM基本結構:
當CNT計數小于CCR時,置高電平,當CNT大于CCR時,置低電平,當CNT=ARR時觸發(fā)事件,計數值歸零,又開始新的一輪周期,這樣就可以不斷的輸出PWM信號。因此,可以看出,CCR值的設置與占空比密切相關。
PWM頻率: Freq = CK_PSC / (PSC + 1) / (ARR + 1)
CK_PSC是預分頻頻率,一般是系統頻率。PSC是分頻系數,ARR是自動重裝載寄存器最大計數值。
PWM占空比: Duty = CCR / (ARR + 1)
CCR是輸出比較輸出PWM的一個限定比較值。
PWM分辨率: Reso = 1 / (ARR + 1)
三、輸出PWM
以正點原子PWM實驗為例:使用TIM3的CH2通道,在PB5端口輸出PWM波。
1.PWM初始化
void TIM3_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定時器3時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外設和AFIO復用功能模塊時鐘
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射 TIM3_CH2->PB5
//設置該引腳為復用輸出功能,輸出TIM3 CH2的PWM脈沖波形 GPIOB.5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
//初始化TIM3
//溢出時間time=(arr+1)*(psc+1)/144000000
TIM_TimeBaseStructure.TIM_Period = arr; //設置在下一個更新事件裝入活動的自動重裝載寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //設置用來作為TIMx時鐘頻率除數的預分頻值
TIM_TimeBaseStructure.TIM_ClockDivision = 1; //設置時鐘分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計數模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根據TIM_TimeBaseInitStruct中指定的參數初始化TIMx的時間基數單位
//初始化TIM3 Channel2 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //選擇定時器模式:TIM脈沖寬度調制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性:TIM輸出比較極性高
TIM_OCInitStructure.TIM_Pulse = 50;
TIM_OC2Init(TIM3, &TIM_OCInitStructure); //根據T指定的參數初始化外設TIM3 OC2
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR2上的預裝載寄存器
TIM_Cmd(TIM3, ENABLE); //使能TIM3
}
這里最重要的是:
1.該函數的參數為 arr 和 psc,分別表示自動重載寄存器的值和預分頻系數。根據這兩個參數,可以計算出 PWM 的頻率和占空比。
2.在函數中,首先使能了定時器 TIM3 和 GPIOB 外設的時鐘,以及 GPIO 的復用功能模塊時鐘。然后,通過 GPIO_PinRemapConfig 函數將 TIM3_CH2 信號映射到 GPIOB.5 引腳上。
這里有一個問題:為什么要配置AFIO復用功能模塊時鐘?如下圖:
可以看到:PB5的默認復用功能是I2C1_SMBA/ SPI3_MOSI,I2S3_SD,而其重定義功能才是TIM3_CH2,所以不能簡單直接的復用它,必須要配置重映射。
3.通過 TIM_OCInitTypeDef 結構體對 TIM3 的通道 2 進行初始化,選擇定時器模式為 PWM2,使能比較輸出,設置輸出極性為高電平,設置占空比為 50%。
最后,通過 TIM_OC2PreloadConfig 函數使能 TIM3 在 CCR2 上的預裝載寄存器,并通過TIM_Cmd 函數使能 TIM3。
2.輸出指定頻率PWM波
TIM3_Int_Init(5999,0);
//TIM3_PWM_Init(5999,0);//不分頻。PWM 頻率=96000/(5999+1)=16KHz
參考PWM頻率: Freq = CK_PSC / (PSC + 1) / (ARR + 1),這里我的芯片系統頻率是96MHz,對應CK_PSC,ARR是計數值,PSC是預分頻值,代入公式,得:頻率F=16000Hz=16KHz。
因此,這個代碼輸出了一個頻率固定為16KHz的PWM波。文章來源:http://www.zghlxwxcb.cn/news/detail-766633.html
3.輸出占空比可變的PWM波
TIM3_Int_Init(5999,0);
u16 pulse=400;
TIM_SetCompare2(TIM3,pulse);
對于定時器 TIM3,CCR2 寄存器的取值范圍是 0 到 ARR,即比較寄存器的值不能大于自動重載寄存器的值。因此,在設置占空比時,輸入的占空比值需要通過計算轉換為相應的比較寄存器的值。也就是說,pulse的值只能在0-5999之間設置,并且注意,這里調用的函數是TIM_SetCompare2()函數,是比較寄存器CCR2對應通道2,如果是ch3,則要調用TIM_SetCompare3()函數。如此,便實現了修改PWM波的占空比。文章來源地址http://www.zghlxwxcb.cn/news/detail-766633.html
到了這里,關于STM32(7)-定時器輸出PWM的原理分析的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!