“每一次的感应,都是对环境的温柔拥抱。”#STM32项目二 《感应开关盖垃圾桶》【上】
- 前言
- 预备知识
- 1.定时器介绍1
- 1.1软件延时的优缺点
- 1.2定时器工作原理
- 1.3定时器的分类
- 1.4 STM32F103C8T6定时器资源
- 1.5通用定时器介绍
- 2.定时器介绍2
- 2.1定时器计数模式
- 2.2定时器时钟源
- 2.3定时器溢出计算公式:
- 3.使用定时器中断点亮LED灯
- 3.1实验需求
- 3.2配置工程
- 3.3编程实现实验需求
- 4.PWM概述
- 4.1 STM32F103C8T6 PWM资源
- 4.2 PWM输出模式
- 4.3 PWM周期与频率
- 4.4 PWM占空比
- 5. PWM实现呼吸灯效果
- 5.1实验需求
- 5.2实验原理
- 5.3配置工程
- 5.4编程实现实验需求
- 结束语
前言
本篇博文介绍的是基于STM32F103C8T6单片机第二个项目《感应开关盖垃圾桶》,包含定时器介绍1,定时器介绍2,使用定时器中断点亮LED灯,PWM概述,PWM实现呼吸灯效果。看到这篇博文的朋友,可以先赞再看吗?
预备知识
一、基本电路标识识别和接线,例如VCC,GND。
二、电脑基本操作复制粘贴
三、分文件编程
四、C变量
五、基本输入输出
六、流程控制
七、函数
八、指针
如果以上知识不清楚,请自行学习后再来浏览。如果我有没例出的,请在评论区写一下。谢谢啦!
1.定时器介绍1
1.1软件延时的优缺点
- 优点:
简单易实现:软件延时通常只需要编写一小段代码,通过循环或者延时函数即可实现,不需要额外的硬件资源。
对硬件要求低:软件延时不需要专门的硬件支持,只需要有基本的CPU运算能力即可。
灵活性高:软件延时可以根据需要进行调整,可以很容易地改变延时的时间长度。
节省成本:由于不需要额外的硬件资源,软件延时可以在很大程度上节省硬件成本。
- 优点:
占用CPU资源:在软件延时期间,CPU需要一直执行延时代码,无法执行其他任务,这会导致CPU资源的浪费。
影响系统性能:如果大量使用软件延时,会导致系统实时性变差,因为CPU在等待延时期间无法处理其他任务。
精度受限:软件延时的精度可能受到操作系统调度、中断等因素的影响,不如硬件延时精确。
void Delay500ms() //@11.0592MHz
{unsigned char i, j, k;_nop_();i = 4;j = 129;k = 119;do{do{while (--k);} while (--j);} while (--i);
}
1.2定时器工作原理
- 时基的定义:
**时基是一个时间显示的基本单位,也可以理解为时间基准。
**它在不同的领域有不同的应用。
在电子线路中,时基主要用来表示数字电路中的基准时钟,例如在示波器中,时基表示示波器上横轴一大格波形所占据的时间。时基决定了示波器相对采样率的大小,也在一定程度上决定了示波器显示波形与原波形的相符合程度。
在计算机系统中,时基是用来衡量时间的基准,用于同步和计时以实现各种功能。时基的类型有多种,如硬件时钟、系统时钟等,它们各自在计算机系统中扮演不同的角色。时基的准确性对计算机系统的稳定性和准确性至关重要,它可以用来实现操作系统对不同进程的调度、对外部事件的响应等,同时在信息传输、网络通信等方面也发挥重要作用。
此外,时基也可以指时间词中的“年、月、日、天”等语素,这些语素标明了计时的基准。
- 定时器工作原理:
使用精准的时基,通过硬件的方式,实现定时器功能。定时器核心就是计数器。
1.3定时器的分类
- 基本定时器(
TIM6
~TIM7
),STM32单片机内部数量少
,也用得少
。 - 通用定时器(
TIM2
~TIM5
),STM32单片机内部数量多
,用得也多
。 - 高级定时器(
TIM1
和TIM8
),STM32单片机内部数量少
,也用得少。
1.4 STM32F103C8T6定时器资源
1.5通用定时器介绍
- 16 位向上、向下、向上/向下自动装载
计数器
(TIMx_CNT
)。 - 16 位可编程(可以实时修改)
预分频器
(TIMx_PSC)
,计数器时钟频率的分频系数为1~65535
之间的
任意数值。 4 个独立通道
(TIMx_CH1~4
),这些通道可以用来作为:
A.输入捕获
B.输出比较
C.PWM 生成
(边缘或中间对齐模式)
D.单脉冲模式输出
- 可使用
外部信号
(TIMx_ETR
)控制定时器
和定时器互连
(可以用1 个定时器控制另外一个定时器
)
的同步电路。 - 如下事件发生时产生
中断/DMA:
A.更新:
计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
B.触发事件
(计数器启动、停止
、初始化
或者由内部/外部
触发计数)
C.输入捕获
D.输出比较
E.支持针对定位的增量(正交)编码器
和霍尔传感器电路
F.触发输入
作为外部时钟
或者按周期的电流管理
2.定时器介绍2
2.1定时器计数模式
计数模式 | 计数溢出值 | 计数重装值 |
---|---|---|
向上计数 | CNT = ARR | CNT = 0 |
向下计数 | CNT = 0 | CNT = ARR |
中心对齐计数 | CNT = ARR - 1 | CNT = ARR |
CNT = 1 | CNT = 0 |
2.2定时器时钟源
2.3定时器溢出计算公式:
例如,要定时500ms,则:PSC=7199,ARR=4999,Tclk=72M
3.使用定时器中断点亮LED灯
3.1实验需求
使用定时器中断方法,每500ms翻转一次LED1和LED2的状态
3.2配置工程
- 配置RCC,如下步骤
- 配置时序框图,如下图步骤。
- 配置GPIO口,如下图步骤。
- 将配置PB8默认输出高电平,PB9默认输出低电平。实现LED1默认关闭,LED2默认打开。
- 定时器介绍,如下图。
- 配置定时器2,如下图步骤。
- 定时器溢出参数介绍。
- 配置定时器溢出参数,如下图步骤。
- 打开定时器中断,如下图步骤。
- 配置工程基本信息,如下图步骤。
- 配置生成工程必要文件,如下图步骤。
- 生成工程,如下图步骤。
3.3编程实现实验需求
- 找到MX_TIM2_Init();函数体,确认htim2中什么元素接收定时器模式。
- 找到定时器中断服务函数,实现每隔0.5秒亮灭LED灯
- 修改定时器中断服务函数,实现每隔0.5秒亮灭LED灯。
- 修改思路看代码注释
- 定时器中断服务函数代码
//发生定时器中断,立马进入定时器中断服务函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
//一根定时器中断线上有很多中断源//检测定时器2中断源if(htim->Instance == TIM2){//检测到定时器2中断源后进行LED1和LED2状态的翻转HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);}
}
- 在主函数中调用启动定时器函数
HAL_TIM_Base_Start_IT(&htim2);
4.PWM概述
4.1 STM32F103C8T6 PWM资源
- 高级定时器(TIM1):7路
- 通用定时器(TIM2~TIM4);各4路
4.2 PWM输出模式
- PWM模式1:
在向上计数时,一旦 CNT < CCRx 时输出为有效电平,否则为无效电平
; 在向下计数时,一旦 CNT > CCRx 时输出为无效电平,否则为有效电平。 - PWM模式2:
在向上计数时,一旦 CNT < CCRx 时输出为无效电平,否则为有效电平
; 在向下计数时,一旦 CNT > CCRx 时输出为有效电平,否则为无效电平。
4.3 PWM周期与频率
4.4 PWM占空比
由TIMx_CCRx寄存器决定。
5. PWM实现呼吸灯效果
5.1实验需求
使用PWM点亮LED1和LED2实现交叉呼吸灯效果
5.2实验原理
- LED灯越来越亮和越来越暗的原理是:
由不同的占空比决定
。 - 使用公式计算周期和频率:
例如2KHz,则:PSC=71,ARR=499
LED1连接到定时器4的3通道,LED2连接到定时器4的4通道
。参考手册内容
5.3配置工程
- 配置SYS,如下图步骤。
- 配置RCC,如下图步骤。
- 配置时序框图,如下图步骤。
- 配置LED1相应引脚输出PWM波,如下图步骤。
- 配置LED2相应引脚输出PWM波,如下图步骤。
- 根据公式,配置定时器溢出值,使产生2000Hz的PWM波。如下图步骤。
- PWM输出参数理解
- 设置LED1和LED2相应引脚PWM输出参数有效电平为低电平,如下图步骤。
- 配置工程基础信息,如下图步骤。
- 配置生成工程必要文件,如下图步骤。
- 生成工程,如下图步骤。
5.4编程实现实验需求
- 定义LED1和LED2的占空比变量,定义PWM方向变量。
uint16_t pwmVal1 = 0; //调整 LED1 PWM 占空比
uint16_t pwmVal2 = 500; //调整 LED2 PWM 占空比
uint8_t dir = 1; //设置改变方向。1:占空比变大;0:占空比变小
- 在定时器初始化函数后面打开定时器4通道3(LED1)和通道4(LED2)的PWM
//打开定时器4通道3和通道4的PWM
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_3);
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_4);
- 循环实现呼吸灯效果思路请看代码注释。
while (1){/* USER CODE END WHILE *///延时1毫秒,防止灯一直灭HAL_Delay(1);//检测占空比变大方向if(dir) {pwmVal1++; //LED1逐渐变亮pwmVal2--; //LED2逐渐变暗}else //占空比变小方向{pwmVal1--; //LED1逐渐变暗pwmVal2++; //LED2逐渐变亮}if(pwmVal1 > 500) //当LED1达到最亮,就让LED1逐渐变暗;当LED2达到最暗,就让LED1逐渐变亮{dir = 0;}else if(pwmVal1 == 0) //当LED1达到最暗,就让LED1逐渐变亮;当LED2达到最亮,就让LED1逐渐变暗{dir = 1;}//修改占空比的值,修改比较值,实现LED灯的呼吸效果__HAL_TIM_SetCompare(&htim4,TIM_CHANNEL_3,pwmVal1);__HAL_TIM_SetCompare(&htim4,TIM_CHANNEL_4,pwmVal2);/* USER CODE BEGIN 3 */}
结束语
很高兴您能看到这里,点个赞再走呗。谢谢您啦!!!