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