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

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);
		}
	}
}


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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值