文章目录
一、利用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呼吸灯实验让我收获了很多宝贵的经验。我相信这些经验将对我的未来学习和职业生涯产生积极的影响。同时,我也希望通过这次实验能够激发更多人对灯光与情感交融关系的思考和研究。