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

一、pwm简介

1、什么是pwm

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

2、stm32上的pwm

STM32的定时器除了TIM6和7,其他的定时器都可以用来产生PWM输出。其中高级定时器TIM1和TIM8可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4路的 PWM 输出,这样,STM32 最多可以同时产生 30 路 PWM 输出。脉冲宽度调制模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的信号。通用定时器产生PWM 的定时器框图如下:
在这里插入图片描述

二、项目配置

1、创建项目

stm32CubeMX创建项目,选择芯片stm32f103c8t6。

2、配置环境

(1)、配置rcc

在这里插入图片描述

(2)、配置sys

在这里插入图片描述

(3)、配置TIM3

在这里插入图片描述

(4)、配置TIM4

在这里插入图片描述

(5)、配置时钟

在这里插入图片描述

3、生成项目

在这里插入图片描述
在这里插入图片描述

三、keil配置代码及运行

在main.c中添加以下代码

uint16_t pwm=0;   //占空比

在这里插入图片描述
打开pwm通道
在主函数中添加以下代码

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

在这里插入图片描述
在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);

在这里插入图片描述
线路连接
LED灯短脚 —> A6
LED灯长脚 —> 3V3
PB6 —> PC13
在这里插入图片描述
在这里插入图片描述
运行结果

在这里插入图片描述

四、总结

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用STM32的定时器来实现两路PWM波形输出。具体步骤如下: 1. 配置定时器的时钟源和分频系数,确定定时器的计数周期。 2. 配置定时器的输出通道,选择PWM模式和输出极性,并设置占空比。 3. 通过改变定时器的计数值和占空比的设置来控制PWM波形的频率和占空比。 4. 可以使用定时器的中断来实现占空比的动态调整。 以下是一个简单的代码示例,实现了两路PWM波形输出占空比可调: ``` #include "stm32f10x.h" void TIM3_PWM_Init(void) { // 配置GPIO口为复用推挽输出 GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); // 配置TIM3定时器 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); TIM_TimeBaseStructure.TIM_Period = 7199; // 计数周期为7200 TIM_TimeBaseStructure.TIM_Prescaler = 0; // 不分频 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); // 配置TIM3PWM输出通道 TIM_OCInitTypeDef TIM_OCInitStructure; TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 3600; // 初始占空比为50% TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM3, &TIM_OCInitStructure); TIM_OC2Init(TIM3, &TIM_OCInitStructure); // 使能TIM3定时器 TIM_Cmd(TIM3, ENABLE); } int main(void) { TIM3_PWM_Init(); // 占空比调整 while (1) { TIM3->CCR1 = 3600; // 设置通道1占空比为50% TIM3->CCR2 = 720; // 设置通道2占空比为10% delay_ms(1000); // 延时1s } } ``` 在上面的代码中,我们使用TIM3定时器,配置了两个PWM输出通道,分别对应GPIOB的0、1两个引脚。在主函数中,我们使用一个死循环来动态改变占空比的值,从而实现PWM波形的动态调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值