STM32F103输出PWM波形实现两个LED的呼吸灯效果

一、PWM脉冲宽度调制

1、使用脉冲占空比拟合不同波形的方式称为 PWM(脉冲宽度调制)控制技术——通过 对一系列脉冲的宽度进行调制,来等效地获得所需要波形(含形状和幅值)。PWM 控制 的基本原理为:冲量相等而开头不同的窄脉冲加在具有惯性的环节上时,其效果基本 相同。其中冲量指窄脉冲的面积;效果相同指环节输出响应波形基本相同。 例如:可以用一系列等幅不用一系列等幅不等宽的脉冲来代替一个正弦半波,见图
Alt
要改变等效输出正弦波幅值,按同一比例改变各脉冲宽度即可。 若把拟合的波形改成呼吸特性曲线,即可得到控制呼吸灯使用的 PWM 波形,要生成 拟合的 PWM波形,通常使用计算法和调制法,本文中使用计算法:根据拟合波形的频率、幅值和半周期脉冲数,准确计算 PWM 波各脉冲宽度和
间隔,据此控制开关器件的通断,就可得到所需 PWM 波形。在下边编程实现中会详细说明。
2、要改变PWM输出波形的宽度,就要改变比较寄存器 CCRx 的值,想要输出不通宽度来拟合正弦波,则需要CCRx的值呈现如下图的变化趋势,即要生成一张CCRx的数值表,按周期变化将表中元素的值赋给CCRx。

Alt

二、实验工具

1、芯片: STM32F103C8T6系统最小板
2、STM32CubeMx软件
3、IDE: MDK-Keil软件
4、STM32F1xx/STM32F4xxHAL库
5、烧录软件:FlyMcu

三、STM32CubeMX新建项目

1、RCC打开外部时钟

Alt

2、选择调试接口为串行

Alt

3、配置定时器3和定时器4,选择时钟源为内部时钟“internal clock”,通道2选择"PWM Generation CH2",对应的引脚是PB7 , PA7。

定时器3设置分频系数为71,计数周期为500,其他默认。
Alt

定时器4设置分频系数为71,计数周期为1000,其他默认。
Alt

4、时钟配置

Alt

5、生成工程文件

Alt

四、Keil修改代码

1、定义两个变量,用来分别存储两个定时器的占空比

uint16_t duty_num = 10;
uint16_t duty_num2 = 10;

2、开启定时器通道,输出PWM

HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_2);

3、在while循环中添加如下代码:

Alt

 while (1)
  {
    /* USER CODE END WHILE */
	  HAL_Delay(50);
		duty_num = duty_num + 10;
	  duty_num2 = duty_num2+10;
		if(duty_num > 500)
		{
			duty_num = 0;
		}
		__HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_2,duty_num);
		if(duty_num2 > 1000)
		{
			duty_num2 = 0;
		}
		__HAL_TIM_SetCompare(&htim4,TIM_CHANNEL_2,duty_num2);

    /* USER CODE BEGIN 3 */
  }

其中定时器3设置为每隔50ms,占空比加10.如果超过500(也就是PWM周期),自动变成0。定时器4PWM周期为1000,led灯亮按周期是定时器1的两倍。

五、实验效果图和总结

可以看到,外接的led与最小版上的led灯在周期性的逐渐变亮和变暗。

Alt
总的来说,这次实验学到了PWM输出控制LED实现流水灯,还是比较简单。需要控制PWM周期只需要改变时钟周期或者改变代码中输出的部分。

参考资料:https://blog.csdn.net/zmhDD/article/details/111942507

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32F103VB是一款基于ARM Cortex-M3内核的微控制器,它具有丰富的外设和强大的计算能力。PWM(Pulse Width Modulation)呼吸实现是一种常见的应用,可以通过调整LED的亮度来实现呼吸效果。 要实现PWM呼吸效果,可以按照以下步骤进行: 1. 配置定时器:选择一个合适的定时器,例如TIM2或TIM3,并配置为PWM模式。设置定时器的预分频值和周期值,以确定PWM信号的频率和占空比。 2. 配置GPIO:选择一个合适的IO口作为PWM输出引脚,并将其配置为复用功能。根据芯片手册,设置GPIO的复用模式和输出模式。 3. 配置PWM通道:选择一个合适的PWM通道,并设置占空比。通过修改定时器的比较寄存器CCR来调整占空比,从而控制LED的亮度。 4. 启动定时器:使能定时器和PWM输出,启动定时器开始生成PWM信号。 下面是一个简单的示例代码,演示了如何在STM32F103VB上实现PWM呼吸效果: ```c #include "stm32f10x.h" void PWM_Breath_Init(void) { // 配置定时器 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = 999; // 设置周期为1000 TIM_TimeBaseStructure.TIM_Prescaler = 71; // 设置预分频为72 TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // 配置PWM通道 TIM_OCInitTypeDef TIM_OCInitStructure; TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 0; // 初始占空比为0 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM2, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable); // 配置GPIO RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // 启动定时器 TIM_Cmd(TIM2, ENABLE); } int main(void) { PWM_Breath_Init(); while (1) { for (int i = 0; i <= 1000; i++) { TIM_SetCompare1(TIM2, i); // 调整占空比 for (int j = 0; j < 10000; j++); // 延时 } for (int i = 1000; i >= 0; i--) { TIM_SetCompare1(TIM2, i); // 调整占空比 for (int j = 0; j < 10000; j++); // 延时 } } } ``` 这段代码使用了TIM2定时器和GPIOA的第0引脚作为PWM输出引脚。通过循环调整占空比,实现呼吸效果

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值