码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-01-21 20:07:11      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:

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


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


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

标签:

原文地址:http://blog.csdn.net/qq_16255321/article/details/42974057

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!