【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 小时前
ASP4644芯片低功耗设计思路解析
网络·单片机·嵌入式硬件·安全
充哥单片机设计3 小时前
【STM32项目开源】基于STM32的智能厨房火灾燃气监控
stm32·单片机·嵌入式硬件
CiLerLinux11 小时前
第四十九章 ESP32S3 WiFi 路由实验
网络·人工智能·单片机·嵌入式硬件
时光の尘11 小时前
【PCB电路设计】常见元器件简介(电阻、电容、电感、二极管、三极管以及场效应管)
单片机·嵌入式硬件·pcb·二极管·电感·三极管·场效应管
Lu Zelin11 小时前
单片机为什么不能跑Linux
linux·单片机·嵌入式硬件
宁静致远202112 小时前
stm32 freertos下基于hal库的模拟I2C驱动实现
stm32·嵌入式硬件·freertos
Wave84516 小时前
STM32--智能小车
stm32·单片机·嵌入式硬件
wdfk_prog19 小时前
[Linux]学习笔记系列 -- lib/timerqueue.c Timer Queue Management 高精度定时器的有序数据结构
linux·c语言·数据结构·笔记·单片机·学习·安全
helesheng21 小时前
用低成本FPGA实现FSMC接口的多串口(UART)控制器
stm32·fsmc·fpga·uart控制器
充哥单片机设计1 天前
【STM32项目开源】基于STM32的智能家居环境(空气质量)检测系统
stm32·单片机·嵌入式硬件