STM32F103VET6呼吸灯之寄存器操作PWM

1. 简介

本程序是基于stm32f103vet6单片机驱动led灯,使用pwm达到呼吸效果

1.1 选用引脚

PA2 TIM2 CH1

1.2 灯泡

用的是野火的指南者STM32F103VET6,这个灯泡引脚是PB5,笔者将PB5与PA2接通(PB5对应的是TIM3,CH2,笔者一开始没有配置成功PB5的PWM,后来用PA2测试的,PB5需要把AFIO的部分映像功能打开就可以了 AFIO->MAPR = AFIO_MAPR_TIM3_REMAP_1; //部分映像
在这里插入图片描述

2. PWM

PWM:Pulse Width Modulation 脉冲宽度调剂,是一种对模拟信号电平进行数字编码的方法。
随着电子技术的发展,出现了多种脉冲宽度调制(Pulse width modulation,PWM)技术,其中包括:相电压控制PWM、脉宽PWM法、随机PWM、SPWM法、线电压控制PWM等,而在镍氢电池智能充电器中采用的脉宽PWM法,它是把每一脉冲宽度均相等的脉冲列作为PWM波形,通过改变脉冲列的周期可以调频,改变脉冲的宽度或占空比可以调压,采用适当控制方法即可使电压与频率协调变化。可以通过调整PWM的周期、PWM的占空比而达到控制充电电流的目的。
模拟信号的值可以连续变化,其时间和幅度的分辨率都没有限制。9V电池就是一种模拟器件,因为它的输出电压并不精确地等于9V,而是随时间发生变化,并可取任何实数值。与此类似,从电池吸收的电流也不限定在一组可能的取值范围之内。模拟信号与数字信号的区别在于后者的取值通常只能属于预先确定的可能取值集合之内,例如在{0V,5V}这一集合中取值。
模拟电压和电流可直接用来进行控制,如对汽车收音机的音量进行控制。在简单的模拟收音机中,音量旋钮被连接到一个可变电阻。拧动旋钮时,电阻值变大或变小;流经这个电阻的电流也随之增加或减少,从而改变了驱动扬声器的电流值,使音量相应变大或变小。与收音机一样,模拟电路的输出与输入成线性比例。
尽管模拟控制看起来可能直观而简单,但它并不总是非常经济或可行的。其中一点就是,模拟电路容易随时间漂移,因而难以调节。能够解决这个问题的精密模拟电路可能非常庞大、笨重(如老式的家庭立体声设备)和昂贵。模拟电路还有可能严重发热,其功耗相对于工作元件两端电压与电流的乘积成正比。模拟电路还可能对噪声很敏感,任何扰动或噪声都肯定会改变电流值的大小。
通过以数字方式控制模拟电路,可以大幅度降低系统的成本和功耗。此外,许多微控制器和DSP已经在芯片上包含了PWM控制器,这使数字控制的实现变得更加容易了。
详见:baidu
在这里插入图片描述

3. 配置PWM

说白了就是把频率配置好然后不断改变CCR3的值,就是在改变占空比。

3.1 用到的寄存器

操作 代码
TIM3_PSC 预分频器
TIM3_ARR 自动重装载寄存器
TIM3_RCR 周期计数寄存器
TIM3_CCR3 捕获/比较寄存器
TIM3_BDTR 刹车和死区寄存器
TIM3_CR1 控制寄存器
TIM3_CCMR2 捕获/比较模式寄存器2
TIM3_EGR 事件产生寄存器
TIM3_CCER 捕获/比较使能寄存器

3.2 配置PWM

这里我配置的是pwm 模式1:如果是向上计数,当TIMX_CNT<TIMX_CCRX时通道X为有效电平,否则为无效电平。
模式一:如下图所示将OCxM设置为6.

在这里插入图片描述
配置的向上计数:如下图为低电平就是向上计数

在这里插入图片描述

启动相应的预装载寄存器:将OCxPE置一

在这里插入图片描述
事件产生寄存器:将UG位置1

在这里插入图片描述
使能捕获/比较寄存器:CCERx置1(太重要了!!!)
在这里插入图片描述

4 相应代码

4.1 初始化引脚

初始化 打开GPIOA PA2和TIM2

int main(void)
{
	RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
	GPIOA->CRL |= (GPIOA->CRL & 0XFFFFF0FF) | 0XB00;
	TIM2_Configuration();
	while(1)
	{
		int i; 
		for(i = 0; i < 60; i++)
		{
			delay_ms(10);
			TIM2->CCR3 = i*5;
		}
		for(i = 60; i> 0; i--)
		{
			delay_ms(10);
			TIM2->CCR3 = i*5;
		}
	}	
	return 0;
)

4.2 配置代码

pwm配置

void TIM2_Configuration( void)
{
	RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; //使能
	TIM2->ARR  = 250;//最大计数值
	TIM2->PSC = 999;//
	TIM2->CR1 &=~TIM_CR1_DIR; 
	TIM2->CCMR2 |= TIM_CCMR2_OC3M_1|TIM_CCMR2_OC3M_2  | TIM_CCMR2_OC3PE ;
	TIM2->CR1 |= TIM_CR1_ARPE;
	TIM2->CCR3 = 50;
	TIM2->CCER |= TIM_CCER_CC3P |TIM_CCER_CC3E ;
	TIM2->EGR |= TIM_EGR_UG;
	TIM2->RCR = 1;
	TIM2->CR1 = TIM_CR1_CEN;
	TIM2->BDTR |= TIM_BDTR_MOE;
	
}

5. 结果

测试PA2的电压,会发现电压在变化,但其实电压是不会变化的,变化的原因是一会高电平一会低电平,在我们看来电压是变化的,所以led灯泡给我的感觉是在呼吸,如果用示波器测量,电压值就是稳定的。

6. 原工程获取

1.关注微信公众号MeiXiangDao2020 (这里有笔者的其他资源欢迎关注)回复:LedPwm
2.私信笔者邮箱或在文章下面评论区留下邮箱
3.csdn工程地址:点击下载

猜你喜欢

转载自blog.csdn.net/sf9090/article/details/107309919