STM32使用TIME3和TIME4分别输出一个PWM波形,实现2个 LED呼吸灯

前言

本次实验是使用TIM3和TIM4,分别输出一个PWM波形,PWM的占空比随时间变化,去驱动你外接的一个LED以及最小开发板上已焊接的LED(固定接在 PC13 GPIO端口),实现2个 LED呼吸灯的效果。

一、PWM简介

1、含义

PWM(Pulse Width Modulation)即脉冲宽度调制,简称脉宽调制。它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术;它是一种模拟控制方式,根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳压电源输出的改变。

2、基本原理

PWM就是对逆变电路开关器件的通断进行控制,使输出端得到一系列幅值相等的脉冲,用这些脉冲来代替正弦波或所需要的波形。也可以这样理解,PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。只要带宽足够,任何模拟值都可以使用 PWM 进行编码。

二、创建项目

1、用STM32CubeMx新建工程

点击ACCESS TO MCU SELECTOR,在Part Number里选择我们的核心板(STM32F103C8)
在这里插入图片描述
在这里插入图片描述

2、配置RCC和SYS

在目录System Core下选择RCC,将HSE改成Crystal/Ceramic Reasonator.
在这里插入图片描述
点击SYS,然后将Debug改成Serial Wire
在这里插入图片描述

3、配置定时器TIME3

1、勾选Internal Clock(内部时钟)
2、通道1选择:PWM Generation CH1(PWM输出通道1)
3、Prtscaler (定时器分频系数) : 71
4、Counter Mode(计数模式):Up(向上计数模式)
5、Counter Period(自动重装载值) : 500
6、CKD(时钟分频因子) :No Division (不分频 )
在这里插入图片描述

4、配置定时器TIM4

配置与上面一样
在这里插入图片描述

5、配置时钟

点击CLOCK CONFIGURATION,然后将HCLK改为72Mhz,记得点击回车保存
在这里插入图片描述

6、生成项目

点击Project Manager,填写项目名称,并将IDE改为MDK-ARM
在这里插入图片描述
点击Code Generator,进行如下勾选,然后点击GENERATE CODE
在这里插入图片描述

三、Keil编写代码

1、定义变量

在main.c中定义一个全局变量

uint16_t pwm=0;   //占空比

在这里插入图片描述

2、打开PWM通道

在主函数中添加两行代码:

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

在这里插入图片描述

3、在while循环中写入调用代码

while (pwm< 500)
	  {
		  pwm++;
		  __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwm);  
    __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_1, pwm);  			
		  HAL_Delay(1);
	  }
	  while (pwm)
	  {
		  pwm--;
		  __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwm);    
       __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_1, pwm);  
			
		  HAL_Delay(1);
	  }
	  HAL_Delay(200);

在这里插入图片描述

四、硬件连接

USB转TTL
3V3 —> 3V3
GND —> GND
RXD —> A9
TXD —> A10
LED灯连接
LED灯短脚 —> A6
LED灯长脚 —> 3V3
PB6 —> PC13
在这里插入图片描述

五、烧录

在这里插入图片描述

六、结果

七、总结

通过本次实验,我了解了PWM的基本原理,对其有了初步理解,并运用他去驱动的外接的一个LED以及最小开发板上已焊接的LED(固定接在 PC13 GPIO端口),实现了2个 LED呼吸灯的效果。
参考:
https://blog.csdn.net/qq_45237293/article/details/111997424

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个使用stm32f10 PA4实现PWM呼吸灯的示例代码: ```c #include "stm32f10x.h" void delay(uint32_t nCount) { for (uint32_t i=0; i<nCount;i++); } int main() { // 确定定时器使用的时钟频率 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 配置GPIO为推挽输出 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置TIM2为PWM模式 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = 99; // 周期为100个计数器时钟周期 TIM_TimeBaseStructure.TIM_Prescaler = 719; // 分频系数为720,得到1ms时钟周期 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 不分频 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 计数器向上计数 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_OCInitTypeDef TIM_OCInitStructure; TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // PWM 模式 1 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 0; // 初始占空比为 0% TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; // 极性为高电平有效 TIM_OC4Init(TIM2, &TIM_OCInitStructure); // 配置TIM2通道4 TIM_Cmd(TIM2, ENABLE); // 使能TIM2 uint8_t i = 0; while(1) { for (i=0; i<=99; i++) // 增加占空比 { TIM_SetCompare4(TIM2, i); delay(1000); } for (i=99; i>0; i--) // 递减占空比 { TIM_SetCompare4(TIM2, i); delay(1000); } } } ``` 这段代码的实现思路是使用TIM2的通道4作为PWM输出使用for循环逐渐增加和递减占空比以实现呼吸灯效果。使用delay函数实现‘呼吸’的时间间隔,在每次循环中通过TIM_SetCompare4函数改变TIM2通道4的占空比,来控制PWM输出波形。需要注意的是,在调用TIM_SetCompare4函数时,占空比值应该为0-99范围内的整数值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值