定時器分為普通定時器和高級定時器。STM32和GD32都有TIMERX_CHX_ON或者TIMERX_CHXN,這種定時器是一種互補(bǔ)定時器,我們同樣可以看到還存在與其名字很像的TIMERX_CHX,TIMERX_CHX,這些都是基本的定時器,按照基本的配置即可產(chǎn)生PWM信號,這里不做介紹 。
下面主要說一下利用互補(bǔ)通道產(chǎn)生PWM信號。
void TIM1_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //使能定時器3時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外設(shè)和AFIO復(fù)用功能模塊時鐘
TIM_DeInit(TIM1);
TIM_InternalClockConfig(TIM1);
// GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射 TIM3_CH2->PB5
//設(shè)置該引腳為復(fù)用輸出功能,輸出TIM1 的PWM脈沖波形 GPIOB.13
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //TIM_CH2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復(fù)用推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
//初始化TIM3
TIM_TimeBaseStructure.TIM_Period = arr; //設(shè)置在下一個更新事件裝入活動的自動重裝載寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //設(shè)置用來作為TIMx時鐘頻率除數(shù)的預(yù)分頻值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設(shè)置時鐘分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計數(shù)模式
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根據(jù)TIM_TimeBaseInitStruct中指定的參數(shù)初始化TIMx的時間基數(shù)單位
//初始化TIM1 Channel2 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1 ; //選擇定時器模式:TIM脈沖寬度調(diào)制模式2
// TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //輸出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性:TIM輸出比較極性高
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; //互補(bǔ)輸出極性
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; //互補(bǔ)輸出使能
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; //死區(qū)后輸出狀態(tài)
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Set; //死區(qū)后互補(bǔ)輸出狀態(tài)
TIM_OC1Init(TIM1, &TIM_OCInitStructure); //根據(jù)T指定的參數(shù)初始化外設(shè)TIM1 OC2
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //使能TIM1在CCR2上的預(yù)裝載寄存器
TIM_OC2Init(TIM1, &TIM_OCInitStructure); //根據(jù)T指定的參數(shù)初始化外設(shè)TIM1 OC2
TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable); //使能TIM1在CCR2上的預(yù)裝載寄存器
TIM_OC3Init(TIM1, &TIM_OCInitStructure); //根據(jù)T指定的參數(shù)初始化外設(shè)TIM1 OC2
TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable); //使能TIM1在CCR2上的預(yù)裝載寄存器
TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable; //自動輸出使能
TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable; //剎車功能使能
TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_Break_Disable; //剎車輸入極性
TIM_BDTRInitStructure.TIM_DeadTime = 36; //死區(qū)時間設(shè)置
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF; //鎖定設(shè)置
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable; //空閑模式下輸出選擇
TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable; //運行模式下按輸出選擇
TIM_CtrlPWMOutputs(TIM1,ENABLE); //輸出使能必須要有
TIM_Cmd(TIM1, ENABLE); //使能TIM3
}
接下來就是調(diào)用硬件驅(qū)動接口即可完成對PWM信號的產(chǎn)生與驅(qū)動。
如下:
int main(void)
{
u16 led0pwmval=0;
u8 dir=1;
delay_init(); //延時函數(shù)初始化
TIM1_PWM_Init(899,0); //不分頻。PWM頻率=72000000/900=80Khz
while(1)
{
delay_ms(10);
if(dir)led0pwmval++;
else led0pwmval--;
if(led0pwmval>300)dir=0;
if(led0pwmval==0)dir=1;
TIM_SetCompare1(TIM1,led0pwmval);
}
}
l利用keil測試debug。
魔術(shù)棒配置軟件模擬程序運行
仿真步驟
PB13引腳設(shè)置
審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
STM32
+關(guān)注
關(guān)注
2313文章
11195瀏覽量
374757 -
定時器
+關(guān)注
關(guān)注
23文章
3375瀏覽量
124679 -
PWM信號
+關(guān)注
關(guān)注
3文章
107瀏覽量
21190
發(fā)布評論請先 登錄
相關(guān)推薦
熱點推薦
STM32CubeIDE下配置STM32F103輸出帶死區(qū)的互補(bǔ)PWM波
STM32F103的TIM1和TIM8是高級定時器,可以產(chǎn)生嵌入死區(qū)時間的互補(bǔ)PWM波,使用STM32CubeIDE完成相關(guān)配置,可以直接生
采用STM32F030K6T6作互補(bǔ)PWM輸出時,互補(bǔ)通道沒有波形輸出是為什么?
各路大神指教,采用STM32F030K6T6作互補(bǔ)PWM輸出時,配置什么的都檢查了基本沒問題,但是只有主通道有輸出,互補(bǔ)
發(fā)表于 04-22 07:50
請問STM32怎么產(chǎn)生精確數(shù)量的互補(bǔ)PWM?
我想用PWM輸出4組互補(bǔ)的PWM,但是要求精確個數(shù)的PWM,比如,我要輸出互補(bǔ)的PWM脈沖數(shù)量是
發(fā)表于 04-24 06:31
STM32用TIM1產(chǎn)生互補(bǔ)PWM,怎么配置讓它是高電平
求助各位大俠本人在用TIM1定時器實現(xiàn)互補(bǔ)PWM輸出時,需要CH1通道產(chǎn)生PWM波形,互補(bǔ)
發(fā)表于 01-21 06:52
STM32F030K6T6作互補(bǔ)PWM輸出時互補(bǔ)通道沒有波形輸出
各路大神指教,采用STM32F030K6T6作互補(bǔ)PWM輸出時,配置什么的都檢查了基本沒問題,但是只有主通道有輸出,互補(bǔ)
發(fā)表于 04-18 07:57
20216 可以產(chǎn)生對稱互補(bǔ)PWM信號嗎
20216可以產(chǎn)生對稱互補(bǔ)PWM信號么(有死區(qū)保護(hù)的那種)。捉摸了好久HET IDE還是鬧不明白
發(fā)表于 05-21 14:32
PWM互補(bǔ)輸出的相關(guān)資料分享
**PWM互補(bǔ)輸出的配置和PWM模式配置相似,只是其中增加了高級定時器互補(bǔ)通道的配置,注意:只有高級定時器才能進(jìn)行
發(fā)表于 12-21 08:16
STM32F407高級定時器PWM兩通道互補(bǔ)輸出有何功能
這里寫自定義目錄標(biāo)題STM32F407高級定時器PWM兩通道互補(bǔ)輸出,帶死區(qū)和剎車功能程序代碼,實測有效:STM32F407高級定時器
發(fā)表于 01-20 06:18
基于NiosII的多通道PWM信號測量產(chǎn)生器節(jié)點設(shè)計
針對于列車控制系統(tǒng)半實物仿真平臺測速測距模塊的多通道PWM 信號測量/產(chǎn)生的要求,提出了一種利用NiosII 軟核處理器替代通訊用MCU 的
發(fā)表于 11-30 15:46
?13次下載
[STM32]STM32F407系列教程之四,pwm產(chǎn)生原理
[STM32]STM32F407系列教程之四,pwm產(chǎn)生原理
發(fā)表于 11-29 17:51
?54次下載
STM32 TIM 多通道互補(bǔ)PWM波形輸出配置快速入門
platform:stm32f103cb前言在做三相逆變的時候,需要軟件生成SVPWM波形,具體的算法需要產(chǎn)生三對互補(bǔ)的PWM,這樣可以驅(qū)動六個開關(guān)元件,
發(fā)表于 12-07 18:36
?24次下載
STM32利用互補(bǔ)通道產(chǎn)生PWM信號
評論