STM32实现定时器和LED呼吸灯

目录

一、实现定时器

1.定时器的介绍

1.1定时器的概念及作用

1.2定时器的分类

 2.新建项目

2.1新建

2.2选择STM32F103C8T6芯片

2.3配置SYS

2.4配置RCC

2.5配置GPIO。LED配置PA5 

2.6设置定时器TIM2 

2.7配置NVIC 

2.8配置生成keil5工程文件

2.9打开keil

3.代码

3.1打开main.c,在main.c里面加入代码:

3.2编译生成hex文件

4.电路连接并烧录运行

4.1连接电路

4.2烧录

4.3运行结果 

 二、LED呼吸灯

1.PWM的介绍

1.1概述

1.2优点

1.3主要产生方法

1.4PWM电路图

​1.5PWM基本原理

2.新建项目

 2.1新建

2.2选择STM32F103C8T6芯片

2.3配置SYS

2.4配置RCC

2.5配置定时器(TIM3,TIM4)

 2.6配置led相应引脚

 2.7配置生成keil5工程文件

 2.8打开keil

 3.代码

 3.1在main.c中修改以下代码:

 3.2设置相关参数

 3.3编译生成hex文件

4.电路连接并烧录运行

4.1连接电路

4.2烧录

4.3运行结果

 5.波形观察

5.1设置

5.2波形结果

三、总结

四、参考资料

 


一、实现定时器

1.定时器的介绍

1.1定时器的概念及作用

    定时器的主要作用是产生一个时基,通俗的讲就是从某一时刻开始,经过一段指定的时间,触发一个中断或超时回调事件,可以在中断或者超时回调函数中处理数据。
    定时器在嵌入式系统中是个基础服务,比如RTOS就要依赖SysTick提供时钟节拍去实现线程延时、线程时间片轮询调度等,定时器可以分软件定时器和硬件定时器,我们还经常听到SysTick,RTC实时时钟等,定时器在生活中的应用也很常见,比如闹钟。

1.2定时器的分类

(1)硬件定时器

    顾名思义,芯片本身提供的定时功能。一般是由外部晶振提供给芯片输入时钟,芯片向软件模块提供一组配置寄存器,接受控制输入,到达设定时间值后芯片中断控制器产生时钟中断。硬件 定时器的精度一般很高,可以达到纳秒级别,并且是中断触发方式,简言之,硬件定时器需要硬件资源支持产生稳定的时间基准。

(2)软件定时器

软件定时器的功能与硬件定时器类似,但是实现方式不同,软件定时器是由操作系统提供的一类系统接口,它构建在硬件定时器基础之上,使系统能够提供不受数目限制的定时器服务,一般使用SysTick作为基础时钟。
    软件定时器是通过线程实现的而非中断实现,可能会被其它高优先级的线程打断,因此软件定时器只能用于对精度要求不高的场合,一般是毫秒级。

(3)系统滴答定时器(SysTick)

       SysTick需要硬件支持,可以理解为一种简单的硬件定时器,SysTick定时器一般用于延时或作为RTOS中的系统时钟(心跳),实时系统中最小的时间单位就是SysTick定时器的中断周期,也就是1个tick。

(4)实时时钟(RTC)

RTC需要硬件支持,是一个独立的BCD定时器/计数器,主要作用是提供日历功能,不同的MCU,RTC特性可能也略有差异。以下是参数特性:

 2.新建项目

2.1新建

2.2选择STM32F103C8T6芯片

2.3配置SYS

2.4配置RCC

2.5配置GPIO。LED配置PA5 

2.6设置定时器TIM2 

2.7配置NVIC 

2.8配置生成keil5工程文件

2.9打开keil

3.代码

3.1打开main.c,在main.c里面加入代码:

3.2编译生成hex文件

4.电路连接并烧录运行

4.1连接电路

3v3-3v3

GND-GND

A5-二极管正极;G-二极管负极

A9-RXD;A10-TXD

4.2烧录

4.3运行结果 

 

 

 二、LED呼吸灯

1.PWM的介绍

1.1概述

PWM是一种对模拟信号电平进行
数字编码的方法。通过高
分辨率计数器的使用,方波的占空比被调制用来对一个具体
模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。

1.2优点

PWM的一个优点是从处理器到被控系统
信号都是数字形式的,再进行数模转换。可将噪声影响降到最低(可以跟电脑一样)。噪声只有在强到足以将逻辑1改变为逻辑0或将逻辑0改变为逻辑1时,也才能对数字信号产生影响。

对噪声抵抗能力的增强是PWM相对于模拟控制的另外一个优点,而且这也是在某些时候将PWM用于通信的主要原因。从模拟信号转向PWM可以极大地延长通信距离。在接收端,通过适当的RC或LC网络可以滤除调制高频方波并将信号还原为模拟形式。

1.3主要产生方法

(1)SPWM法
SPWM(Sinusoidal PWM)法是一种比较成熟的,使用较广泛的PWM法。

前面提到的采样控制理论中的一个重要结论:冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同。SPWM法就是以该结论为理论基础,用脉冲宽度按正弦规律变化而和正弦波等效的PWM波形即SPWM波形控制逆变电路中开关器件的通断,使其输出的脉冲电压的面积与所希望输出的正弦波在相应区间内的面积相等,通过改变调制波的频率和幅值则可调节逆变电路输出电压的频率和幅值。该方法的实现有以下几种方案。

(2)等面积法
该方案实际上就是SPWM法原理的直接阐释,用同样数量的等幅而不等宽的矩形脉冲序列代替正弦波,然后计算各脉冲的宽度和间隔,并把这些数据存于微机中,通过查表的方式生成PWM信号控制开关器件的通断,以达到预期的目的。由于此方法是以SPWM控制的基本原理为出发点,可以准确地计算出各开关器件的通断时刻,其所得的的波形很接近正弦波,但其存在计算繁琐,数据占用内存大,不能实时控制的缺点。

(3)硬件调制法
硬件调制法是为解决等面积法计算繁琐的缺点而提出的,其原理就是把所希望的波形作为调制信号,把接受调制的信号作为载波,通过对载波的调制得到所期望的PWM波形。通常采用等腰三角波作为载波,当调制信号波为正弦波时,所得到的就是SPWM波形.其实现方法简单,可以用模拟电路构成三角波载波和正弦调制波发生电路,用比较器来确定它们的交点,在交点时刻对开关器件的通断进行控制,就可以生成SPWM波。但是,这种模拟电路结构复杂,难以实现精确的控制。

(4)软件生成法
由于微机技术的发展使得用软件生成SPWM波形变得比较容易,因此,软件生成法也就应运而生.软件生成法其实就是用软件来实现调制的方法,其有两种基本算法,即自然采样法和规则采样法。

1.4PWM电路图


 1.5PWM基本原理

(1)什么是PWM:PWM简称脉冲宽度调制,即在一个周期内存在不同极性的电平状态。

(2)PWM频率:是指一秒钟内从高电平时间在到低电平时间,再从低电平跳到高电平的瞬间次数,也就是一秒钟内有多少个PWM的周期。f = T / 1(HZ)。

(3)PWM周期:是指一秒钟内从高电平时间在到低电平时间,T = f / 1(s)。

(4) PWM占空比:是指一个周期内高电平时间和总时间的比值。
 

2.新建项目

 2.1新建

2.2选择STM32F103C8T6芯片

2.3配置SYS

2.4配置RCC

2.5配置定时器(TIM3,TIM4)

 2.6配置led相应引脚

 2.7配置生成keil5工程文件

 2.8打开keil

 

 3.代码

 3.1在main.c中修改以下代码:

 

 3.2设置相关参数

 3.3编译生成hex文件

4.电路连接并烧录运行

4.1连接电路

3v3-3v3

GND-GND

A9-RXD;A10-TXD

A6-LED正极(LED呼吸灯);C13-LED正极(PC13小灯呼吸灯)(两者无法同时显示)

4.2烧录

4.3运行结果

 5.波形观察

5.1设置

5.2波形结果

三、总结

         通过这次作业,对于定时器和呼吸灯我都有了一点的了解,对HAL库更加熟悉,同时对各种软件的运用也更加熟练。本次作业和前面的作业不太一样,前面的作业是通过循环、delay、Hal_delay函数等实现的,而这次是通过Timer定时器方式实现的,相比于前面的这次控制更加精准,更加方便。

四、参考资料

 STM32CUBEMX_定时器控制LED闪烁 | MCU起航

STM32CUBEMX_基于PWM的呼吸灯 | MCU起航

stm32f103呼吸灯(PWM脉冲宽度调制)_火车在响沙湾的博客-CSDN博客_stm32f103呼吸灯

使用STM32输出PWM波形_不#曾&轻听的博客-CSDN博客_stm32输出pwm波形

 

  • 4
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用Keil5编写的STM32 PWM呼吸灯的代码示例: ```c #include "stm32f1xx_hal.h" TIM_HandleTypeDef htim2; 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(); MX_TIM2_Init(); HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2); uint16_t brightness = 0; uint8_t direction = 1; while (1) { __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, brightness); if (brightness == 0) direction = 1; else if (brightness == 1000) direction = 0; if (direction) brightness++; else brightness--; HAL_Delay(1); } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) { Error_Handler(); } } static void MX_TIM2_Init(void) { TIM_ClockConfigTypeDef sClockSourceConfig; TIM_MasterConfigTypeDef sMasterConfig; TIM_OC_InitTypeDef sConfigOC; htim2.Instance = TIM2; htim2.Init.Prescaler = 0; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 1000; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; if (HAL_TIM_PWM_Init(&htim2) != HAL_OK) { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK) { Error_Handler(); } if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2) != HAL_OK) { Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 0; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) { Error_Handler(); } } static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_1; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } void Error_Handler(void) { while (1) { } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值