定时器&PWM应用编程

定时器

定时器是一种硬件模块,通常用于生成各种精确的时间延迟和周期性信号,如PWM信号和脉冲信号。它们是由STM32系列微控制器内部提供的,可用于处理各种计时和计数任务,可以通过程序控制其功能和参数。
STM32通用定时器(General Purpose Timer)是STM32系列微控制器中重要的外设之一,主要用于产生定时、脉冲、PWM等功能,可用于各种应用场合,如时钟、测量、控制等。

STM32通用定时器有4个,分别为TIM1、TIM2、TIM3、TIM4,它们的主要功能和特点如下:

  1. TIM1:具有更高级别的功能,可以用作高级控制,比如PWM控制、编码器接口、中断控制等;

  2. TIM2、TIM3、TIM4:用于基本的计时和PWM输出控制,功能相似,但区别在于它们的时钟源不同,TIM2的时钟源是APB1总线时钟的2倍,而TIM3和TIM4的时钟源是APB1总线时钟。

通用定时器的主要寄存器包括:

1.计数器寄存器(CNT):用于存放计数器的值;

2.自动重载寄存器(ARR):用于设置计数器溢出的值;

3.预分频器寄存器(PSC):用于设置计数器时钟的分频系数;

4.控制寄存器(CR1、CR2、CR3):用于控制定时器的各种功能,如启用定时器、使能定时器中断、设置定时器的计数模式等;

5.事件寄存器(EGR):用于产生各种事件,如软件触发更新事件、触发捕获/比较事件等。

通用定时器的操作步骤如下:

1.设置预分频器和自动重载寄存器,以确定定时器的计数周期;

2.使能计数器和定时器中断(可选);

3.启动定时器;

4.根据需要,处理定时器中断和事件。

在应用中,通用定时器可以用来控制LED的闪烁、驱动蜂鸣器发出声音、产生PWM控制电机转速等功能。

PWM

定时器PWM模式是基于定时器的脉冲宽度调制技术,它利用定时器生成一定频率的周期性信号,并通过调整脉冲宽度来控制输出电平的占空比。在此模式下,定时器通过一系列的寄存器配置,可以实现不同的PWM输出特性,如占空比、周期、极性等等。定时器PWM模式广泛应用于模拟变量频率控制、电机控制、LED调光等领域。

串口通信与点灯

创建新项目请添加图片描述

选择合适的芯片,配置rcc
请添加图片描述
配置sys
请添加图片描述
配置io口输出
请添加图片描述
配置定时器2
请添加图片描述
意思72分频后得到1MHZ的时钟。1MHZ的时钟,计数5000次,得到时间5000/1000000=0.005秒。也就是每隔0.005秒定时器2会产生一次定时中断。

配置定时器3

请添加图片描述
开启定时器中断
请添加图片描述
生成定时器2和定时器3中断优先级配置代码。
请添加图片描述
配置USART1
请添加图片描述
配置时钟
请添加图片描述
配置项目

请添加图片描述
生成项目
请添加图片描述
定义上位机发送的

uint8_t hello[20]="hello windows!\r\n";

在main函数添加

		HAL_TIM_Base_Start_IT(&htim2);
	HAL_TIM_Base_Start_IT(&htim3);

请添加图片描述
定时器中断回调函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	static uint32_t time_cnt =0;
	static uint32_t time_cnt3 =0;
	if(htim->Instance == TIM2)
	{
		if(++time_cnt >= 400)
		{
			time_cnt =0;
			HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_1);
		}
	}
	if(htim->Instance == TIM3)
	{
		if(++time_cnt3 >= 1000)
		{
			time_cnt3 =0;
    HAL_UART_Transmit(&huart1,hello,20,100000);
		}
			
	}
}

请添加图片描述
烧录实现
在这里插入图片描述

1a94

STM32配置PWM输出

创建新项目
在这里插入图片描述
选好芯片后进行配置
配置rcc
在这里插入图片描述

配置sys
在这里插入图片描述
配置定时器3和定时器4两个定时器
请添加图片描述
请添加图片描述
时钟配置
请添加图片描述
配置文件
请添加图片描述
请添加图片描述
定义定时器3和4的占空比初始值

uint16_t duty_num3 = 10;
uint16_t duty_num4 = 10;

请添加图片描述
开启定时器3和4并输出PWM
请添加图片描述
开启定时器并输出
请添加图片描述
在while函数中设置每隔50毫秒,占空比加10,如果超过500(也就是PWM周期),自动变成0。(即灯会从亮倒暗,逐渐变化)定时中断回调函数。
请添加图片描述
编译烧录

1a94


波形如下(查看过程不再赘述) 请添加图片描述

请添加图片描述

定时器pwm完成呼吸灯和对于pwm输出信号的采集与捕获

跟上述建立工程一样
RCC和SYS配置不变
选择端口
请添加图片描述
USART1配置
在这里插入图片描述
定时器配置
请添加图片描述
请添加图片描述
PWM波形捕获
请添加图片描述
请添加图片描述
请添加图片描述
其他端口一样配置
main函数如下

#include "main.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"
 
uint8_t i = 0;
 
float Duty = 0;
float Frequency = 0;
uint16_t Cap_val1 = 0;
uint16_t Cap_val2 = 0;
 
int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_TIM1_Init();
    MX_TIM3_Init();
    MX_USART1_UART_Init();
    MX_TIM2_Init();
    /* USER CODE BEGIN WHILE */
 
    printf("串口通信测试\r\n");
    HAL_TIM_Base_Start_IT(&htim2); // 使能定时器及其更新中断
    HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); // 使能定时器及其PWM输出
    HAL_TIM_IC_Start_IT(&htim1, TIM_CHANNEL_1);       // 使能定时器及其输入捕获
    HAL_TIM_IC_Start_IT(&htim1, TIM_CHANNEL_2);       // 使能定时器及其输入捕获
    __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 10); // 设置一个PWM波形进行测量
 
    while (1)
    {
        // 串口发送 频率 占空比
        printf("Cap_val1 is :%d ,  Cap_val2 is : %d \r\n", Cap_val1, Cap_val2);
        printf("Duty is :%0.2f%% Frequency is : %0.2f ms\r\n", Duty, Frequency);
        HAL_Delay(1000);
    }
}
 
 
// 定时TIM2 定时亮灯的中断函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *tim)
{
    if (tim == &htim2)
    {
        HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
    }
}
 
// 定时输入捕获回调函数 计算占空比和频率
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == TIM1)
    {
        if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
        {
            Cap_val1 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
        }
        if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
        {
            Cap_val2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);
            Duty = 100 - (float)Cap_val2 / (float)Cap_val1 * 100;
            Frequency = 0.001 * Cap_val1;
        }
    }
}

串口显示

ccc1

总结

这次试验是定时器&PWM应用编程,旨在让我们了解定时器的原理和PWM的工作模式,定时器的基础是寄存器和计数器,pwm是通过改变占空比来控制电路运作,在本次实验中使用STM32F103的 Tim2~Tim5其一定时器的某一个通道pin,连接一个LED,用定时器计数方式,控制LED以2s的频率周期性地亮-灭,总的来说这次试验让我更深的了解stm32定时器原理和pwm生成方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值