STM32学习——PWN概念

文章详细介绍了如何使用STM32F103C8T6微控制器通过PWM控制LED灯实现呼吸灯效果,包括PWM资源、输出模式、周期频率计算以及占空比的概念。通过设置定时器、配置工程和编写特定的代码段,调整PWM占空比来改变LED亮度,从而达到呼吸灯的渐明渐暗效果。

目录

STM32F103C8T6 PWM资源:

PWM输出模式:

PWM周期与频率:

PWM占空比:

PWM实验

 LED灯为什么可以越来越亮,越来越暗?

如何计算周期/频率?

LED1连接到哪个定时器的哪一路?

 实现:

1.设置时钟

2.设置定时器​编辑

3.配置工程

4.编写代码


STM32F103C8T6 PWM资源:

  • 高级定时器(TIM1):7
  • 通用定时器(TIM2~TIM4):各4

PWM输出模式:

  • PWM模式1:在向上计数时,一旦 CNT < CCRx 时输出为有效电平,否则为无效电平; 在向下计数时,一旦 CNT > CCRx 时输出为无效电平,否则为有效电平。
  • PWM模式2:在向上计数时,一旦 CNT < CCRx 时输出为无效电平,否则为有效电平; 在向 下计数时,一旦 CNT > CCRx 时输出为有效电平,否则为无效电平。

PWM周期与频率:

PWM占空比:

TIMx_CCRx寄存器决定。

PWM实验

需求:使用PWM点亮LED1实现呼吸灯效果。

 LED灯为什么可以越来越亮,越来越暗?

这是由不同的占空比决定的。

如何计算周期/频率?

假如频率为 2kHz ,则: PSC=71 ARR=499

LED1连接到哪个定时器的哪一路?

学会看产品手册:

 实现:

1.设置时钟

2.设置定时器

3.配置工程

4.编写代码

    uint16_t pwmVal = 0;//调整PWN占空比
	uint8_t dir = 1;    //设置改变方向,1:越来越亮;0:越来越暗
  
  MX_GPIO_Init();
  MX_TIM4_Init();
    //// 使能 Timer4 第3通道 PWM 输出
	HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_3);
	
 // while循环实现呼吸灯效果
  while (1)
  {
		HAL_Delay(1);
   
		if(dir)
			pwmVal++;
		else
			pwmVal--;
		
		if(pwmVal > 500)
			dir = 0;
		else if(pwmVal == 0)
			dir = 1;

		//修改比较值,来修改占空比
		__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, pwmVal);
  
  }

### STM32C8T6上的PWM输出实现 #### 实现PWM输出的关键配置 在STM32C8T6上实现PWM输出主要依赖定时器的功能。通过设置特定寄存器来控制PWM信号的频率和占空比。具体来说,`TIMx_CCMR` 寄存器中的 `OCxFE` 位用于快速使能或禁能输出[^2]。 对于PWM输出的具体实施,还需要关注以下几个方面: - **初始化定时器**:选择合适的预分频系数以及自动重装载值以决定PWM波形的基础频率。 - **通道配置**:指定要使用的比较单元(即PWM通道),并调整其对应的捕获/比较模式寄存器(`TIMx_CCR`) 来改变占空比。 - **启动PWM输出**:确保相应的中断和服务程序已准备好处理周期性的事件更新请求。 下面是一个简单的例子展示如何利用STM32CubeMX工具生成基础框架之后,在项目中加入自定义代码完成PWM输出功能。 ```c #include "stm32f1xx_hal.h" // 定义GPIO引脚和定时器资源 #define PWM_PIN GPIO_PIN_0 #define PWM_PORT GPIOA #define TIM_HANDLE htim2 // 假设使用TIM2作为PWM源 void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_TIM2_Init(void); int main(void){ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); // 初始化GPIO端口 MX_TIM2_Init(); // 配置定时器 __HAL_RCC_TIM2_CLK_ENABLE(); // 开启定时器时钟 HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1); // 启动PWM输出 while (1){} } /** * @brief 设置PWM占空比 */ void SetPWMDuty(uint16_t dutyCycle){ uint32_t periodValue; periodValue = __HAL_TIM_GET_AUTORELOAD(&TIM_HANDLE)-1; // 获取当前计数器的最大值 __HAL_TIM_SET_COMPARE(&TIM_HANDLE, TIM_CHANNEL_1, ((periodValue*dutyCycle)/100)); // 计算新的比较值 } ``` 此段代码展示了基于STM32F1系列MCU的一个简单PWM输出实例,其中包含了必要的硬件抽象层(HAL)库调用来简化操作过程。请注意实际应用可能需要根据所选器件型号的不同而有所变化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值