【PWM】PWM实现呼吸灯与捕获



一、利用pwm定时器周期性点亮一个LED闪烁

1 什么是PWM

脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。

1.1 pwm的频率
是指1秒钟内信号从高电平到低电平再回到高电平的次数(一个周期);也就是说一秒钟PWM有多少个周期

单位: Hz
表示方式: 50Hz 100Hz

1.2 PWM分辨率
也就是占空比最小能达到多少,如8位的PWM,理论的分辨率就是1:255(单斜率),16位的的PWM理论就是1:65535(单斜率)。

1.3 占空比
是一个脉冲周期内,高电平保持的时间与该PWM的时钟周期的时间之比。

单位: % (0%-100%)
表示方式:20%

如,一个PWM的频率是1000Hz,那么它的时钟周期就是1ms,就是1000us,如果高电平出现的时间是200us,那么低电平的时间肯定是800us,那么占空比就是200:1000,也就是说PWM的占空比就是1:5。

在这里插入图片描述

上图中 脉宽时间占总周期时间的比例,就是占空比,比方说周期的时间是10ms,脉宽时间是8ms 那么低电平时间就是2ms 总的占空比 8/(8+2)= 80%,这就是占空比为80%的脉冲信号

而我们知道PWM就是脉冲宽度调制 通过调节占空比,就可以调节脉冲宽度(脉宽时间) 而频率 就是单位时间内脉冲信号的次数,频率越大

以20Hz 占空比为80% 举例 就是1秒钟之内输出了20次脉冲信号 每次的高电平时间为40ms

2 PWM原理
以单片机为例,单片机的IO口输出的是数字信号,IO口只能输出高电平和低电平。

假设高电平为5V 低电平则为0V 那么我们要输出不同的模拟电压,就要用到PWM,通过改变IO口输出的方波的占空比从而获得使用数字信号模拟成的模拟电压信号,电压是以一种连接1或断开0的重复脉冲序列被夹到模拟负载上去的(例如LED灯,直流电机等),连接即是直流供电输出,断开即是直流供电断开。通过对连接和断开时间的控制,理论上来讲,可以输出任意不大于最大电压值(即0~5V之间任意大小)的模拟电压。

比方说 占空比为50% 那就是高电平时间一半,低电平时间一半,在一定的频率下,就可以得到模拟的2.5V输出电压 那么75%的占空比 得到的电压就是3.75V

pwm的调节作用来源于对“占周期”的宽度控制,“占周期”变宽,输出的能量就会提高,通过阻容变换电路所得到的平均电压值也会上升,“占周期”变窄,输出的电压信号的电压平均值就会降低,通过阻容变换电路所得到的平均电压值也会下降,也就是,在一定的频率下,通过不同的占空比 即可得到不同的输出模拟电压。pwm就是通过这种原理实现D/A转换的。

2.新建工程

选择stm32f103c8芯片
在这里插入图片描述
配置RCC和SYS
在这里插入图片描述
在这里插入图片描述
配置定时器TIM2
在这里插入图片描述
选取通道2
在这里插入图片描述
下图时定时器对应引脚(这里为PA1)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
这里配置的时TIM2通道2
调节频率
在这里插入图片描述
利用公式
在这里插入图片描述

设置psc为7199
arr为19999
计算出time为2s
站空为1/2,设置为9999
在这里插入图片描述 在这里插入图片描述

生成文件

在这里插入图片描述
开启定时器

HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);

LED

二、采用定时器pwm模式,让 LED 以呼吸灯方式渐亮渐灭,周期为1~2秒

1.创建工程

使用TIM1通道1
在这里插入图片描述
PSC为71
ARR为499
在这里插入图片描述

配置时钟
在这里插入图片描述
生成文件:
在这里插入图片描述
开启时钟

HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
  uint16_t pwm=0;

在这里插入图片描述
在while里添加如下

while(pwm<500)
{
	pwm++;
	TIM1->CCR1=pwm;
	HAL_Delay(1);
}
while(pwm)
{
	pwm--;
	TIM1->CCR1=pwm;
	HAL_Delay(1);
}
HAL_Delay(200);

321

使用Keil虚拟示波器,观察 pwm输出波形。

在这里插入图片描述

编程采集上面的pwm输出信号,获得其周期和脉宽,并重定向输出到串口显示。

配置RCC和SYS
在这里插入图片描述
在这里插入图片描述
配置TIM1来捕获
在这里插入图片描述
参数
在这里插入图片描述
配置TIM2来产生信号
在这里插入图片描述
配置串口
在这里插入图片描述
配置晶振
生成文件
宏定义参数在这里插入图片描述

int fputc(int ch, FILE *f)
{
        /* 发送一个字节数据到串口DEBUG_USART */
        HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 1000);        
        
        return (ch);
}
#define cnt_clk 72000000/(71+1)//计数器频率
#define arr 65535//自定重装载值   
uint32_t CCR1,CCR2,end_flag;
float duty_cycle,frequency,Cycle;

开启PWM
在这里插入图片描述

HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);//开启PWM输出,不需要中断
HAL_TIM_IC_Start_IT(&htim1,TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim1,TIM_CHANNEL_2);

在这里插入图片描述

while (1)
  {
    /* USER CODE END WHILE */
		 if(end_flag==1)
          {
             printf("\r\n周期=%.3fs,占空比=%.2f%%\r\n",Cycle,duty_cycle);
             end_flag=0;
       }
            HAL_Delay(1000);
	}

中断回调函数
在这里插入图片描述

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
 
            CCR1=HAL_TIM_ReadCapturedValue(&htim1, TIM_CHANNEL_1);
             if(CCR1!=0)
               {
                   CCR2=HAL_TIM_ReadCapturedValue(&htim1, TIM_CHANNEL_2);
                   frequency=(float)cnt_clk/(CCR1+1);
								   Cycle=1/frequency;
                   duty_cycle=(float)(CCR2+1)*100/(CCR1+1);        
                   end_flag=1;
                }
                  else
                {
                   frequency=0;
                   duty_cycle=0;
                }
}

硬件搭配用杜邦线将PA0与
串口调试

在这里插入图片描述

总结

在这次PWM呼吸灯实验中,我的目标是通过改变灯光亮度来模拟情感的变化,以此展示出灯光与情感之间的交融关系。我选择使用PWM (脉宽调制)技术来控制LED的亮度,以此实现呼吸灯的效果。
在实现PWM呼吸灯的过程中,我首先需要了解PWM的工作原理。PWM是通过调节方波的占空比来改变输出电压的平均值,从而实现调节亮度的效果。通过调节PWM信号的占空比,可以从0%到100%改变LED的亮度,实现呼吸灯的效果。在实现PWM呼吸灯的过程中,我使用了Arduino开发板和LED灯。首先,我在Arduino开发板上编写了程序,通过调节PWM信号的占空比来控制LED的亮度。然后,我将LED灯连接到开发板的数字引脚上,并将引脚设置为输出模式。通过在程序中设置不同的占空比,LED的亮度会随之改变,从而实现呼吸灯的效果。在实现PWM呼吸灯的过程中,我遇到了很多困难。例如,当PWM信号的占空比调节到100%时,LED灯的亮度并不高,甚至有些暗淡。经过调试和查阅资料,我发现这是因为Arduino开发板的输出电压较低,无法满足LED灯的最大亮度需求。为了解决这个问题,我尝试使用串联电阻来提高LED灯的电压,从而实现了最大亮度的效果。
通过这次PWM呼吸灯实验,我深刻认识到了灯光与情感之间的交融关系。通过调节灯光亮度,可以表达出不同的情感,如平静、兴奋、悲伤等。同时,我也意识到了实现PWM呼吸灯并不容易,需要考虑到很多因素,如电压、电流、PWM信号的占空比等。
总之,这次PWM呼吸灯实验让我收获了很多宝贵的经验。我相信这些经验将对我的未来学习和职业生涯产生积极的影响。同时,我也希望通过这次实验能够激发更多人对灯光与情感交融关系的思考和研究。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Msp430f5529是一种常用的微控制器,可以使用其中的PWM功能来实现呼吸灯效果。 首先,我们需要了解PWM(脉宽调制)技术。PWM是一种调节信号的方法,通过控制信号的高电平时间和低电平时间的比例来调节输出电压的大小。通过调节PWM的占空比,可以实现不同亮度的灯光效果。 接下来,我们可以通过Msp430f5529的PWM模块来实现呼吸灯效果。首先,我们需要初始化PWM模块,设置频率和占空比。 首先,我们需要声明一个全局变量,用于表示呼吸灯亮度的变化范围。 ```C int brightness = 0; // 呼吸灯亮度变化范围 ``` 然后,我们需要初始化PWM模块,设置频率和占空比。 ```C // 初始化PWM模块 TA0CTL = TASSEL_2 + MC_1 + ID_2; // 选择SMCLK作为PWM时钟源,选择Up模式,选择8分频 TA0CCR0 = 255; // 定时器计数上限,决定PWM频率 TA0CCR1 = 0; // 脉冲宽度初始值,决定PWM占空比 TA0CCTL1 = OUTMOD_7; // TACCTL1的输出模式选择PWM输出模式 ``` 接下来,我们可以使用一个循环来控制呼吸灯效果的变化。 ```C while(1) { for (brightness = 0; brightness <= 255; brightness++) { TA0CCR1 = brightness; // 更新脉冲宽度 __delay_cycles(5000); // 稍微延时一下,使呼吸灯效果更加明显 } for (brightness = 255; brightness >= 0; brightness--) { TA0CCR1 = brightness; // 更新脉冲宽度 __delay_cycles(5000); // 稍微延时一下,使呼吸灯效果更加明显 } } ``` 以上就是使用Msp430f5529的PWM模块实现呼吸灯效果的基本步骤。通过不断调整PWM信号的占空比,我们可以实现呼吸灯的灯光效果。 ### 回答2: MSP430F5529是德州仪器(TI)推出的低功耗微控制器系列中的一员,其提供了多种功能模块和引脚,可以实现各种应用。其中,PWM模块可以用于实现呼吸灯效果。 呼吸灯是一种通过改变灯光亮度的方法来营造渐变效果的灯光装饰。实现呼吸灯效果的关键是利用PWM控制灯光的亮度,使其由暗到亮再由亮到暗,形成渐变的感觉。 在MSP430F5529中,PWM模块可以通过配置计数器周期和占空比来实现对灯光亮度的控制。首先,我们需要初始化PWM模块的相关设置,包括选择PWM输出引脚、设定计数器周期和占空比等。然后,我们可以通过修改占空比的值来实现呼吸灯效果。 实现步骤如下: 1. 初始化PWM模块,选择合适的PWM输出引脚,如P1.2。 2. 设定计数器周期,可以根据需要设置合适的值,比如500。 3. 设置初始占空比为0。 4. 进入主循环,通过改变占空比的值来实现渐变效果。 5. 增加占空比的值,让灯光逐渐变亮。 6. 当占空比达到最大值时,递减占空比的值,让灯光逐渐变暗。 7. 当占空比递减到0时,重复从步骤5开始。 通过调整占空比的增减速度和计数器周期,可以控制呼吸灯的渐变速度和效果。 需要注意的是,在编程时需要合理设置延时,以确保呼吸灯效果的平滑过渡。另外,也可以在呼吸灯效果的基础上添加其他功能,比如通过按键来控制开关灯等。 通过MSP430F5529的PWM模块实现呼吸灯效果,可以使灯光更具有美观性和吸引力。这只是一个简单的示例,具体的实现方法可以根据具体需求进行调整和扩展。 ### 回答3: MSP430F5529是一款低功耗的微控制器,具有PWM(脉宽调制)功能,可以用来实现呼吸灯效果。 首先,我们需要设置MSP430F5529的定时器,来控制PWM的频率和占空比。定时器可以通过寄存器配置来实现,例如TA0CCR0用于设置PWM周期,TA0CCR1用于设置PWM占空比。通过改变TA0CCR1的值,我们可以实现呼吸灯效果。通过调整TA0CCR0的值,我们可以控制PWM的频率。 其次,我们需要在程序中轮流增加和减小TA0CCR1的值,以模拟呼吸灯效果。可以使用一个for循环或while循环来实现。当TA0CCR1的值增加到TA0CCR0时,即呼吸灯达到最亮的状态;当TA0CCR1的值减小到0时,即呼吸灯达到最暗的状态。这样循环之后,我们就实现呼吸灯效果。 最后,我们需要将MSP430F5529连接到一个LED,以显示呼吸灯效果。可以通过配置GPIO口的输出模式,将LED连接到MSP430F5529的某个引脚上。在程序的主循环中,通过改变引脚的输出电平,即可控制LED的亮灭,从而实现呼吸灯效果。 综上所述,通过配置定时器和GPIO口,以及使用循环控制PWM的占空比,我们可以实现MSP430F5529呼吸灯的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值