STM32-PWM的生成及驱动-1LED呼吸灯

涉及知识点:

输出比较

定时器,计数器

PWM波形

正文:

输出比较(Output Compare)简称OC,输出比较计数器CNT和CCR寄存器的值,来对输出电平进行操作,主要是电平翻转的功能,可用于输出一定频率和占空比的波形。

高级定时器的死区生成和互补输出主要服务于互补推挽输出模式控制三相无刷电机。

 输出比较模式的工作原理和比较模式如上图所示,一般我们使用PWM模式1。

PWM脉冲宽度调制,主要是应用在一些具有惯性的系统,比如led灯(视觉暂留),电机等,通过调节脉冲的宽度和占空比即可调节其变化速度。

可以看到,当占空比趋于1时,脉冲趋近于高电平达到最大亮度或速度(对应上述提到的器件),当占空比趋于0时,脉冲就趋近于低电平,处于停止工作的状态。

 

对于PWM波形参数的计算

黄线对应的是ARR自动重装值,红线对应的是CCR,蓝线对应的是CNT

以PWM模式1为例,在一个周期内,起始状态CNT小于CNR输出高电平,当CNT大于CNR后输出低电平。得到对应公式

 

对于本实验涉及到的模块有:

开启时钟,配置GPIO口,开启时基单元完成计数功能,输出比较模块,驱动电路。

代码部分:主要为PWM初始化模块

首先开启时钟,选择TIM2,选择通道1,TIM2通道1的输出引脚为PA0,所以配置GPIOA的PA0,

这里选择复用推挽输出即GPIO_Mode_AF_PP。对于常规的开漏输出,输出引脚的信号来自于输出数据寄存器,如果想要用定时器控制引脚输出,就需要复用推挽输出,此时输出数据寄存器断开,控制权交给定时器。

然后配置时基单元

接着配置输出比较模块,为了方便调节占空比,使用库函数SetCompare(),就可以灵活改变CCR的值。

#include "stm32f10x.h"                  // Device header

void PWM_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP ;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz ;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	TIM_InternalClockConfig(TIM2);
	
	TIM_TimeBaseInitTypeDef TIM_InitStructure;
	TIM_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;  //时钟分频,主要控制滤波系数
	TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数
	TIM_InitStructure.TIM_Period = 100-1;  //ARR
  TIM_InitStructure.TIM_Prescaler = 720-1;  //PSC预分频值
  TIM_InitStructure.TIM_RepetitionCounter =0x00;	
	TIM_TimeBaseInit(TIM2,&TIM_InitStructure);
	
	TIM_OCInitTypeDef TIM_OCInitStucture;  //配置输出比较模块
	TIM_OCStructInit(&TIM_OCInitStucture);
	TIM_OCInitStucture.TIM_OCMode= TIM_OCMode_PWM1;  //输出模式
	TIM_OCInitStucture.TIM_OCPolarity = TIM_OCPolarity_High;  //极性选择
	TIM_OCInitStucture.TIM_OutputState = TIM_OutputState_Enable;  //使能
	TIM_OCInitStucture.TIM_Pulse =0 ;  //配置CCR
	TIM_OC1Init(TIM2,&TIM_OCInitStucture);
	
	TIM_Cmd(TIM2,ENABLE);
}

void PWM_SetCompare1(uint16_t Compare)  //用于在运行钟调节CCR,compare为比较值
{
   TIM_SetCompare1(TIM2,Compare);
}

主函数部分:

使用循环变量i作为CCR的预定值,预定值不断改变,led亮度发生变化

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.h"
#include "Key.h"
#include "OLED.h"
#include "PWM.h"

uint8_t i;

int main()
{
	OLED_Init();
  PWM_Init();
	while(1)
		{
			for(i=0;i<=100;i++)
			{
				PWM_SetCompare1(i);
				Delay_ms(10);
			}
			for(i=100;i>0;i--)
			{
				PWM_SetCompare1(i);
				Delay_ms(10);
			}
			
		}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值