cortex_m3_stm32嵌入式學習筆記(九):PWM 輸出實驗(定時器的PWM輸出)

ARM 231瀏覽
PWM 簡介

脈沖寬度調制(PWM),是英文“Pulse Width Modulation” 的縮寫,簡稱脈寬調制,是利用微處理器的數字輸出來對模擬電路進行控制的一種非常有效的技術。簡單一點,就是對脈沖寬度的控制

STM32 的定時器除了 TIM6 和 7。其他的定時器都可以用來產生 PWM 輸出。其中高級定時器 TIM1 和 TIM8 可以同時產生多達 7 路的 PWM 輸出。而通用定時器也能同時產生多達4的 PWM 輸出,這樣, STM32 最多可以同時產生 30 路 PWM 輸出!

本實驗僅使用 TIM1的 CH1 產生一路 PWM 輸出,若要產生多路輸出,只需修改幾處代碼即可。。

先看原理圖



可以看到DS0是由 TIM1_CH1 即定時器1的通道1控制輸出的

配置TIM1的PWM輸出 pwm.c

#include "pwm.h" #include "led.h" //PWM 輸出初始化 //arr:自動重裝值 //psc:時鐘預分頻數 void TIM1_PWM_Init(u16 arr,u16 psc) { 	GPIO_InitTypeDef GPIO_ist; 	TIM_TimeBaseInitTypeDef TIM_Base_ist;   TIM_OCInitTypeDef TIM_OC_ist; 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);// ①使能tim1時鐘 	 	GPIO_ist.GPIO_Pin=GPIO_Pin_8;//LED0-->PA.8 	GPIO_ist.GPIO_Mode=GPIO_Mode_AF_PP;//復用推挽輸出 	GPIO_ist.GPIO_Speed=GPIO_Speed_50MHz; 	GPIO_Init(GPIOA,&GPIO_ist); 	 	TIM_Base_ist.TIM_Period=arr; 	TIM_Base_ist.TIM_Prescaler=psc; 	TIM_Base_ist.TIM_ClockDivision=0; 	TIM_Base_ist.TIM_CounterMode=TIM_CounterMode_Up; 	TIM_TimeBaseInit(TIM1, &TIM_Base_ist); 	//設置 TIM1_CH1 的 PWM 模式及通道方向 	TIM_OC_ist.TIM_OCMode = TIM_OCMode_PWM2; //脈寬調制模式 2   TIM_OC_ist.TIM_OutputState = TIM_OutputState_Enable;//比較輸出使能   TIM_OC_ist.TIM_Pulse = 0; //設置待裝入捕獲比較寄存器的脈沖值   TIM_OC_ist.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性高   TIM_OC1Init(TIM1, &TIM_OC_ist); //③初始化外設 TIMx 	   TIM_CtrlPWMOutputs(TIM1,ENABLE); //⑤MOE 主輸出使能 	TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //CH1 預裝載使能   TIM_ARRPreloadConfig(TIM1, ENABLE); //使能 TIMx 在 ARR 上的預裝載寄存器   TIM_Cmd(TIM1, ENABLE); //④使能 TIM1 } 

pwm.h

#ifndef _PWM_ #define _PWM_ #include "sys.h" void TIM1_PWM_Init(u16 arr,u16 psc); #endif

PWM輸出頻率計算方式:72000/[(arr+1)*(psc+1)]

主函數

#include "led.h" #include "delay.h" #include "usart.h" #include "pwm.h" #include "sys.h" void init(void) { 	delay_init(); 	LED_Init(); 	TIM1_PWM_Init(899,0);//PWM頻率80KHz } int main(void) { 	u16 i; 	init(); 	while(1) 	{ 		for(i=1;i<=300;i++) 		{ 			delay_ms(10); 			TIM_SetCompare1(TIM1,i); 		} 		for(i=300;i>0;i--) 		{ 			delay_ms(10); 			TIM_SetCompare1(TIM1,i); 		} 	} }

可以看到類似呼吸燈的效果


七星彩走势图2元网官网