标签:
PWM 简介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 }
#ifndef _PWM_ #define _PWM_ #include "sys.h" void TIM1_PWM_Init(u16 arr,u16 psc); #endifPWM输出频率计算方式: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); } } }
cortex_m3_stm32嵌入式学习笔记(九):PWM 输出实验
标签:
原文地址:http://blog.csdn.net/qq_16255321/article/details/42974057