PWM输出实验

一、通用定时器PWM概述

STM32 PWM工作过程

输入比较寄存器(CCRx)里存一个值,在计数器计数过程中,同CCRx值比较,大于(或小于)会产生低电位,相反产生高电位。定时器循环计数从而产生PWM波,其周期由ARR值决定,占空比与高电平持续时间占周期比例成正比(由CCRx决定)

STM32 工作过程(通道1为例)

1、计数器CNT的值会与CCR1值比较,如果CNT大于CCR1会产生一个高电平信号。

2、CCMR1有两个位,对于PWM方式下,用于设置PWM模式1或PWM模式2(计数器的值比CCRx的值小为有效电平)

模式1与模式2的区别:

3、比较之后会通过选择器进行选择,选择0或1由CCER:CC1P位决定。(CCER:CC1P位:输入/捕获1输出极性。0:高电平有效,1:低电平有效。)

4、信号到达输出使能电路,通过CCER:CC1E位使能(CCER:CC1E位:输入/捕获1输出使能。0:关闭,1:打开。)从而信号输出到相应引脚。

(先由PWM模式确定有效电平,再看有效电平是高电平还是低电平)

以向上计数配置为例

由图知

计数器寄存器ARR计数到8的时候重新计数,CCRx设为4则计数到0123为高电平(有效),为45678的时候为低(无效);CCRx设为8则0~7的时候为低否则为高。CCRx不能比ARR大否则不能产生PWM波形。

ARPE=0,有缓存,下个周期生效,计数到F5会有一个更新事件。ARPE=1,ARR立即生效。

二、PWM输出库函数

void TIM_OCxInit(TIM_TypeDef* TIMx,TIM_OCInitTypeDef* TIM_OCInitStruct);
typedef struct
{
  uint16_t TIM_OCMode;//PWM模式1或2
  uint16_t TIM_OutputState;//输出使能OR
  uint16_t TIM_OutputNState;
  uint16_t TIM_Pulse;//比较值,写CRRx
  uint16_t TIM_OCPolarity;//比较输出极性
  uint16_t TIM_OCNPolarity;
  uint16_t TIM_OCldleState;
  uint16_t TIM_OCNldleState;
}
  TIM_OCInitTypeDef;

  TIM_OCInitABC.TIM_OCMode=TIM_OCMode_PWM2;//PWM模式2
  TIM_OCInitABC.TIM_OutputState=TIM_OutputState_Enable;//比较输出使能
  TIM_OCInitABC.TIM_Pulse=100;
  TIM_OCInitABC.TIM_OCPolarity=TIM_OCPolarity_High;//输出极性:TIM输出比较极性高
  TIM_OC2Init(TIM3,&TIM_InitABC);//根据T指定的参数初始化外设TIM3 OC2

设置比较值函数:void TIM_SetCompareX(TIM_TypeDef* TIMx,uint16_t Comparex);

使能输出比较预装载:

void TIMx_OCxPreloadComfig(TIM_TypeDef* TIMx,uint16_t TIMOCPreload);

使能自动重装载的预装载寄存器允许位:

void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx,FunctionalState NewState);

三、写一个PWM输出实验

要求:使用定时器14的PWM功能,输出频率可变的PWM波,用来驱动LED灯,从而达到LED【PF9】亮度由暗变亮,又从亮变暗的过程,并循环。

PWM输出配置步骤:

1、使能定时器14和相关IO口时钟。

      使能定时器14时钟:RCC_APB1PeriphClockCmd();

      使能GPIOF时钟:RCC_AHB1PeriphClockCmd();

2、初始化IO口为复用功能输出函数:

GPIO_Init();   GPIO_InitABC.GPIO_Mode=GPIO_Mode_AF;//复用功能

3、GPIOF9复用映射到定时器14

GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14);

4、初始化定时器:ARR、PSC等:TIM_TimeBaseInit();

5、初始化输出比较参数:TIM_OC1Init();

6、使能预装载寄存器:TIM_OC1PreloadConfig(TIM14,TIM_OCPreload_Enable);

TIM_ARRPreloadConfig(TIM14,ENABLE);

7、使能定时器。

8、不断改变比较值CCRx,达到不同的占空比效果:TIM_SetCompare1();

#include "pwm.h"
void TIM14_PWM_Init(u32 arr,u32 psc)
{
	GPIO_InitTypeDef GPIO_InitABC;//结构体
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitABC;
	TIM_OCInitTypeDef TIM_OCInitABC;
	
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE);//使能TIM14时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);
  
	GPIO_InitABC.GPIO_Mode=GPIO_Mode_AF;//复用
	GPIO_InitABC.GPIO_OType=GPIO_OType_PP;//推挽复用输出
	GPIO_InitABC.GPIO_Pin=GPIO_Pin_9;//GPIOF9
	GPIO_InitABC.GPIO_PuPd=GPIO_PuPd_UP;//上拉
	GPIO_InitABC.GPIO_Speed=GPIO_Speed_100MHz;//速度100Hz
	GPIO_Init(GPIOF,&GPIO_InitABC);//初始化PF9
	
	GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14);
  
	TIM_TimeBaseInitABC.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaseInitABC.TIM_CounterMode=TIM_CounterMode_Up;//向上计数模式
	TIM_TimeBaseInitABC.TIM_Period=arr;//自动重装载值
	TIM_TimeBaseInitABC.TIM_Prescaler=psc;//定时器分频
	
	TIM_TimeBaseInit(TIM14,&TIM_TimeBaseInitABC);//初始化定时器TIM14
	
	TIM_OCInitABC.TIM_OCMode=TIM_OCMode_PWM1;//PWM模式1
	TIM_OCInitABC.TIM_OCPolarity=TIM_OCPolarity_Low;//有效电平为低电平
	TIM_OCInitABC.TIM_OutputState=TIM_OutputState_Enable;
	
	TIM_OC1Init(TIM14,&TIM_OCInitABC);
	
	TIM_OC1PreloadConfig(TIM14,TIM_OCPreload_Enable);
	TIM_ARRPreloadConfig(TIM14,ENABLE);
	
	TIM_Cmd(TIM14,ENABLE);//
	
}
int main(void)
{ 
  u16 led0=0;
  u8 dir=1;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
	delay_init(168);//初始化延时函数
	uart_init(115200);//初始化串口波特率为115200
	TIM14_PWM_Init(500-1,84-1);
//84M/84=1Mhz的计数频率,重装载值500,所以PWM频率为1M/500=2Khz
	while(1)
	{
	delay_ms(100);
	if(dir) led0++;//递增
	else led0--;//递减
	if(led0>300) dir=0;//到达300后,方向为递减
	if(led0==0) dir=1;//递减到0后,方向改为递增
	
	TIM_SetCompare1(TIM14,led0);//修改比较值,修改占空比
	}
}

PWM实验

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值