cortex_m3_stm32嵌入式学习笔记(九):PWM 输出实验(定时器的PWM输出)

ARM 185浏览
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); 		} 	} }

可以看到类似呼吸灯的效果