【STM32】定时器与PWM的LED控制

目录

一、定时器控制LED周期性亮灭

(一)定时器

1.STM32F103定时器分类及区别

STM32F103一共有8个定时器TIM1~TIM8。STM32的定时器分为基本定时器、通用定时器和高等定时器。

TIM6TIM7(基本定时器):基本定时器是只能向上计数的16位定时器,基本定时器只能有定时的功能,没有外部IO口,所以没有捕获和比较通道。

TIM2TIM3TIM4TIM5(通用定时器):通用定时器是可以向上计数,也可以向下计数的16位定时器。通用定时器可以定时、输出比较、输入捕捉,每个通用定时器具有4个外部IO口。

TIM1TIM8(高级定时器):高级定时器是是可以向上计数,也可以向下计数的16位定时器。高等定时器可以定时、输出比较、输入捕捉、还可以输出三相电机互补信号,每个高等定时器有8个外部IO口。

此次主要使用通用定时器,故后续了解以通用定时器为主

2.通用定时器主要功能

通用TIMx (TIM2、TIM3、TIM4和TIM5)定时器功能包括:

● 16位向上、向下、向上/向下自动装载计数器

● 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536之间的任意数值

● 4个独立通道:

─ 输入捕获

─ 输出比较

─ PWM生成(边缘或中间对齐模式)

─ 单脉冲模式输出

● 使用外部信号控制定时器和定时器互连的同步电路

● 如下事件发生时产生中断/DMA:

─ 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)

─ 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)

─ 输入捕获

─ 输出比较

● 支持针对定位的增量(正交)编码器和霍尔传感器电路

通用定时器计数模式:①向上计数 ②向下计数 ③中心对齐

3.通用定时器工作过程

从时钟源产生框可以看到

定时器时钟有四种来源:

● 内部时钟(CK_INT)

● 外部时钟模式1:外部输入脚(TIx) (输入捕获的引脚)

● 外部时钟模式2:外部触发输入(ETR)

● 内部触发输入(ITRx):(定时器级联)使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。

产生CK_PSC时钟,然后在从模式控制器内设置好计数模式(向上向下),再经过预分频器产生CK_CNT,若为CNT计数器向下计数,则当其计数到0时,自动重装载寄存器会重新为CNT计数器装载新值重新递减计数,并产生一个更新事件。

时基单元:

● 计数器寄存器(TIMx_CNT)

● 预分频器寄存器 (TIMx_PSC)

● 自动装载寄存器 (TIMx_ARR)

输入捕获:信号通过捕获通道进入,经滤波,经分频,到捕获比较寄存器。(经输入捕获与输出比较的四个通道其实是一个)

(二)STM32CubeMX创建工程





这里我们 arr=4999 psc=6399 Tclk=16Mhz Tout = (5000*6400)/16 us = 2s

(三)代码实现

cpp 复制代码
HAL_TIM_Base_Start_IT(&htim2);
cpp 复制代码
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	static unsigned char ledState = 0;
	if (htim == (&htim2))
	{
		if (ledState == 0)
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);
		else
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);
	ledState = !ledState;
	}
}

(四)实验结果

二、PWM模式控制LED呼吸灯

(一)PWM工作原理

脉冲宽度调制 (Pulse width modulation,PWM)是一种对模拟信号电平进行数字编码的方法。

STM32的每个通用定时器都有独立的4个通道可以用来作为:输入捕获、输出比较、PWM输出、单脉冲模式输出等。

STM32的定时器除了TIM6和TIM7(基本定时器)之外,其他的定时器都可以产生PWM输出。其中,高级定时器TIM1、TIM8可以同时产生7路PWM输出。

1.PWM一个周期

  • 定时器从0开始向上计数
  • 当0-t1段,定时器计数器TIMx_CNT值小于CCRx值,输出低电平
  • t1-t2段,定时器计数器TIMx_CNT值大于CCRx值,输出高电平
  • 当TIMx_CNT值达到ARR时,定时器溢出,重新向上计数...循环此过程
  • 至此一个PWM周期完成

每个定时器有四个通道,每一个通道都有一个捕获比较寄存器。

将寄存器值和计数器值比较,通过比较结果输出高低电平,便 可以实现脉冲宽度调制模式(PWM信号)。

向上计数:

假定定时器工作在向上计数 PWM模式:

当 CNT<CCRx 时,输出 0

当 CNT>=CCRx 时输出 1

当 CNT 达到 ARR 值的时候,重新归零,然后重新向上计数,依次循环。

改变 CCRx 的值,就可以改变 PWM 输出的占空比,改变 ARR 的值,就可以改变 PWM 输出的频率。

2.PWM输出模式区别

PWM模式1 :在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)
PWM模式2 :在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平
注意:PWM的模式只是区别什么时候是有效电平,但并没有确定是高电平有效还是低电平有效。这需要结合CCER寄存器的CCxP位的值来确定

3.PWM的计数模式

向上计数模式

下面是一个PWM模式1的例子。当TIMx_CNT<TIMx_CCRx时PWM信号参考OCxREF为高,否则为低。如果TIMx_CCRx中的比较值大于自动重装载值(TIMx_ARR),则OCxREF保持为'1'。如果比较值为0,则OCxREF保持为'0':

向下计数模式

在PWM模式1,当TIMx_CNT>TIMx_CCRx时参考信号OCxREF为低,否则为高。如果TIMx_CCRx中的比较值大于TIMx_ARR中的自动重装载值,则OCxREF保持为'1'。该模式下不能产生0%的PWM波形

中央对齐模式

TIMx_CR1寄存器中的CMS位不为'00'时,为中央对齐模式(所有其他的配置对OCxREF/OCx信号都有相同的作用)。根据不同的CMS位设置,比较标志可以在计数器向上计数时被置'1'、在计数器向下计数时被置'1'、或在计数器向上和向下计数时被置'1'。TIMx_CR1寄存器中的计数方向位(DIR)由硬件更新,不要用软件修改它。

(二)STM32CubeMX创建工程








(三)代码实现

cpp 复制代码
/* USER CODE BEGIN 1 */
uint16_t pwmVal=0; //PWM占空比
uint8_t dir=1;
/* USER CODE END 1 */
cpp 复制代码
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
/* USER CODE END 2 */
cpp 复制代码
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
	while (pwmVal< 500)
	{
		pwmVal++;
		__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwmVal); //修改比较值,修改占空比
		// TIM3->CCR1 = pwmVal; 与上方相同
		HAL_Delay(1);
	}
	while (pwmVal)
	{
		pwmVal--;
		__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwmVal); //修改比较值,修改占空比
		// TIM3->CCR1 = pwmVal; 与上方相同
		HAL_Delay(1);
	}
	HAL_Delay(200);
}
/* USER CODE END 3 */

(四)实验结果


参考链接

定时器&PWM应用编程
STM32CubeMX & Keil------STM32F103C8T6:PWM控制LED灯

相关推荐
水饺编程3 小时前
【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,1-2
linux·嵌入式硬件·fpga开发
电子科技圈3 小时前
IAR全面支持国科环宇AS32X系列RISC-V车规MCU
人工智能·嵌入式硬件·mcu·编辑器
SZPU领跑4 小时前
第十二届蓝桥杯嵌入式省赛程序设计题解析(基于HAL库)(第一套)
stm32·单片机·算法·职场和发展·蓝桥杯
逢生博客4 小时前
Rust 语言开发 ESP32C3 并在 Wokwi 电子模拟器上运行(esp-hal 非标准库、LCD1602、I2C)
开发语言·后端·嵌入式硬件·rust
Tlog嵌入式7 小时前
蓝桥杯【物联网】零基础到国奖之路:十六. 扩展模块之矩阵按键
arm开发·stm32·单片机·mcu·物联网·蓝桥杯·iot
打地基的小白7 小时前
UART通信—基于江科大源码基础进行的改进和解析
单片机·嵌入式硬件·uart通信·代码详解
黄小美3218 小时前
STM32(五)GPIO输入硬件电路及C语言知识复习
stm32·单片机·嵌入式硬件
py.鸽鸽8 小时前
STM32
stm32·单片机·嵌入式硬件
朴人8 小时前
【从零开始实现stm32无刷电机FOC】【实践】【7.1/7 硬件设计】
stm32·单片机·嵌入式硬件
国科安芯9 小时前
IAR全面支持国科环宇AS32X系列RISC-V车规MCU
人工智能·单片机·mcu·risc-v