STM32——高级定时器输出指定个数PWM波原理及实战

1.高级定时器简介(TIM8、TIM1)

相比于通用定时器特性:
1)重复计数器
2)死区时间带可编程的互补输出
3)断路输入,用于将定时器的输出信号置于用户可选的安全配置中

2.高级定时器框图

在这里插入图片描述

3.重复计数器特性及输出指定个数PWM波实战

在这里插入图片描述

4.高级定时器输出指定个数PWM波原理

在这里插入图片描述

5.高级定时器输出指定个数PWM实验配置步骤

1,配置定时器基础工作参数 HAL_TIM_PWM_Init()
2,定时器PWM输出MSP初始化 HAL_TIM_PWM_MspInit() 配置NVIC、CLOCK、GPIO等
3,配置PWM模式/比较值等 HAL_TIM_PWM_ConfigChannel()
4,设置优先级,使能中断 HAL_NVIC_SetPriority()、 HAL_NVIC_EnableIRQ()
5,使能定时器更新中断 __HAL_TIM_ENABLE_IT()
6,使能输出、主输出、计数器 HAL_TIM_PWM_Start()
7,编写中断服务函数 TIMx_IRQHandler()等  HAL_TIM_IRQHandler()
8,编写更新中断回调函数 HAL_TIM_PeriodElapsedCallback()
在这里插入图片描述

6.高级定时器输出指定个数PWM实战

1.通过定时器8通道1实现指定个数PWM输出,用于控制LED1的亮灭
2,配置输出比较模式为:PWM模式1
通道输出极性为:高电平有效
占空比:50%
代码:

6.1 atim.c

#include "./BSP/TIMER/atim.h"
#include "./BSP/LED/led.h"
//1.声明定时器句柄
TIM_HandleTypeDef  g_timx_npwm_chy_handler;
static uint32_t g_npwm_remain = 0;
/*** @brief       高级定时器TIMX 通道Y PWM输出指定个数PWM 初始化函数(使用PWM模式1)* @note*              高级定时器的时钟来自APB2,而PCLK =168Mhz,我们设置PPRE2不分频*              高级定时器的时钟 = 168Mhz*              定时器溢出时间计算方法: Tout = ((arr + 1) * (psc + 1)) / Ft us.*              Ft = 定时器工作频率,单位:Mhz** @param       arr: 自动重装值* @param       psc: 预分频系数* @retval      无*/
//2.配置通用定时器基本工作参数,PWM输出初始化
void atim_timx_npwm_chy_init(uint16_t arr, uint16_t psc)    /* 通用定时器 PWM初始化函数 */  
{//4.1定时器输出比较定时器结构体初始化TIM_OC_InitTypeDef tim_oc_npwm_chy = {0};//2.1通用定时器PWM输出初始化g_timx_npwm_chy_handler.Instance = ATIM_TIMX_NPWM;                  //定时器xg_timx_npwm_chy_handler.Init.Period = arr;g_timx_npwm_chy_handler.Init.Prescaler = psc;g_timx_npwm_chy_handler.Init.CounterMode = TIM_COUNTERMODE_UP;g_timx_npwm_chy_handler.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; /* 使能TIMx_ARR进行缓冲 */g_timx_npwm_chy_handler.Init.RepetitionCounter = 0;                  /* 重复计数器初始值 */HAL_TIM_PWM_Init(&g_timx_npwm_chy_handler);//5.输出比较配置包,括PWM模式和比较值tim_oc_npwm_chy.OCMode = TIM_OCMODE_PWM1;          //输出比较模式 PWM1tim_oc_npwm_chy.Pulse = arr/2;                     //设置比较值为自动加载值的一般,则占空比为50%tim_oc_npwm_chy.OCPolarity = TIM_OCPOLARITY_HIGH;   //设置输出比较的极性为高HAL_TIM_PWM_ConfigChannel(&g_timx_npwm_chy_handler,&tim_oc_npwm_chy,ATIM_TIMX_NPWM_CHY);//6,使能定时器更新中断__HAL_TIM_ENABLE_IT(&g_timx_npwm_chy_handler,TIM_IT_UPDATE);//7,开启对应PWM通道使能输出并启动计时器HAL_TIM_PWM_Start(&g_timx_npwm_chy_handler,ATIM_TIMX_NPWM_CHY);}
//3.定时器PWM输出底层初始化,定时器时钟、引脚时钟使能,引脚复用配置
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef * htm)
{//3.1判断是否是TIM14if(htm->Instance ==  ATIM_TIMX_NPWM){GPIO_InitTypeDef gpio_init_struct;//3.3使能PF引脚口时钟ATIM_TIMX_NPWM_CHY_GPIO_CLK_ENABLE();//3.4使能定时器时钟ATIM_TIMX_NPWM_CHY_CLK_ENABLE();//3.2通道y的GPIO初始化gpio_init_struct.Pin = ATIM_TIMX_NPWM_CHY_GPIO_PIN;      /* 通道Y GPIO口 */gpio_init_struct.Mode = GPIO_MODE_AF_PP;                /* 复用推挽输出 */gpio_init_struct.Pull = GPIO_PULLUP;                    /* 上拉 */gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;          /* 高速 */ gpio_init_struct.Alternate =ATIM_TIMX_NPWM_CHY_GPIO_AF; /* 端口复用到TIM8 */ HAL_GPIO_Init(ATIM_TIMX_NPWM_CHY_GPIO_PORT, &gpio_init_struct);  //4 设置优先级、使能中断HAL_NVIC_SetPriority(ATIM_TIMX_NPWM_IRQn,1,3); HAL_NVIC_EnableIRQ(ATIM_TIMX_NPWM_IRQn);}
}/* 定时器8中断服务函数 */
void ATIM_TIMX_NPWM_IRQHandler(void)
{HAL_TIM_IRQHandler(&g_timx_npwm_chy_handler);
}/* 定时器更新中断回调函数 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance == ATIM_TIMX_NPWM)  //如果是TIM8{if(g_npwm_remain)//如果重复计数值大于0,则需要发送PWM波{///* 设置重复计数寄存器值为npwm-1, 即npwm个脉冲 */ATIM_TIMX_NPWM->RCR = g_npwm_remain - 1;//通过软件更新事件,将RCR值缓冲到影子寄存器里面HAL_TIM_GenerateEvent(&g_timx_npwm_chy_handler, TIM_EVENTSOURCE_UPDATE);//使能计数器__HAL_TIM_ENABLE(&g_timx_npwm_chy_handler);//清零g_npwm_remain = 0;}else{//关闭计数器ATIM_TIMX_NPWM->CR1 &= ~(1 << 0);  /* 关闭定时器TIMX,使用HAL Disable会清除PWM通道信息,此处不用 */}}
}
/*** @brief       高级定时器TIMX NPWM设置PWM个数* @param       rcr: PWM的个数, 1~2^32次方个* @retval      无*/
void atim_timx_npwm_chy_set(uint32_t npwm)
{if(npwm == 0) return ;g_npwm_remain = npwm;//通过软件更新事件,将RCR值缓冲到影子寄存器里面HAL_TIM_GenerateEvent(&g_timx_npwm_chy_handler, TIM_EVENTSOURCE_UPDATE);//使能计数器__HAL_TIM_ENABLE(&g_timx_npwm_chy_handler);}

6.2 atim.h

#ifndef __ATIM_H
#define __ATIM_H#include "./SYSTEM/sys/sys.h"/******************************************************************************************/
/* 高级定时器 定义 *//* TIMX 输出指定个数PWM 定义 * 这里输出的PWM通过PC6(TIM8_CH1)输出, 我们用杜邦线连接PC6和PF10, 然后在程序里面将PF10设置成浮空输入* 就可以 看到TIM8_CH1控制LED1(GREEN)的亮灭, 亮灭一次表示一个PWM波* 默认使用的是TIM8_CH1.* 注意: 通过修改这几个宏定义, 可以支持TIM1/TIM8定时器, 任意一个IO口输出指定个数的PWM*/
#define ATIM_TIMX_NPWM_CHY_GPIO_PORT            GPIOC
#define ATIM_TIMX_NPWM_CHY_GPIO_PIN             GPIO_PIN_6
#define ATIM_TIMX_NPWM_CHY_GPIO_CLK_ENABLE()    do{ __HAL_RCC_GPIOC_CLK_ENABLE(); }while(0) /* PC口时钟使能 */
#define ATIM_TIMX_NPWM_CHY_GPIO_AF              GPIO_AF3_TIM8#define ATIM_TIMX_NPWM                          TIM8
#define ATIM_TIMX_NPWM_IRQn                     TIM8_UP_TIM13_IRQn
#define ATIM_TIMX_NPWM_IRQHandler               TIM8_UP_TIM13_IRQHandler
#define ATIM_TIMX_NPWM_CHY                      TIM_CHANNEL_1                               /* 通道Y,  1<= Y <=4 */
#define ATIM_TIMX_NPWM_CHY_CCRX                 TIM8->CCR1                                  /* 通道Y的输出比较寄存器 */
#define ATIM_TIMX_NPWM_CHY_CLK_ENABLE()         do{ __HAL_RCC_TIM8_CLK_ENABLE(); }while(0)  /* TIM8 时钟使能 */void atim_timx_npwm_chy_init(uint16_t arr, uint16_t psc);   /* 高级定时器 输出指定个数PWM初始化函数 */
void atim_timx_npwm_chy_set(uint32_t npwm);                 /* 高级定时器 设置输出PWM的个数 */#endif

6.3 main.c

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/KEY/key.h"
#include "./BSP/TIMER/atim.h"int main(void)
{uint8_t key = 0;uint8_t t = 0;GPIO_InitTypeDef gpio_init_struct;HAL_Init();                                 /* 初始化HAL库 */sys_stm32_clock_init(336, 8, 2, 7);         /* 设置时钟,168Mhz */delay_init(168);                            /* 延时初始化 */usart_init(115200);                         /* 串口初始化为115200 */led_init();                                 /* 初始化LED */key_init();                                 /* 初始化按键 *//* 将 LED1 引脚设置为输入模式, 避免和PC6冲突 */gpio_init_struct.Pin = LED1_GPIO_PIN;                   /* LED1引脚 */gpio_init_struct.Mode = GPIO_MODE_INPUT;                /* 设置为输入 */gpio_init_struct.Pull = GPIO_PULLUP;                    /* 上拉 */gpio_init_struct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;     /* 高速模式 */HAL_GPIO_Init(LED1_GPIO_PORT, &gpio_init_struct);       /* 初始化LED1引脚 */atim_timx_npwm_chy_init(10000 - 1, 8400 - 1);           /* 20Khz的计数频率,2Hz的PWM频率. */ATIM_TIMX_NPWM_CHY_CCRX = 5000; /* 设置PWM占空比,50%,这样可以控制每一个PWM周期,LED1(GREEN)* 有一半时间是亮的,一半时间是灭的,LED1亮灭一次,表示一个PWM波*/atim_timx_npwm_chy_set(5);      /* 输出5个PWM波(控制LED1(GREEN)闪烁5次) */while (1){key = key_scan(0);if (key == KEY0_PRES)           /* KEY0按下 */{atim_timx_npwm_chy_set(5);  /* 输出5个PWM波(控制TIM8_CH1, 即PC6输出5个脉冲) */}t++;delay_ms(10);if (t > 50)                     /* 控制LED0闪烁, 提示程序运行状态 */{t = 0;LED0_TOGGLE();}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/618398.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Sectigo增强型多域名SSL证书买一年送一月

Sectigo EV增强型多域名SSL证书是一种高安全性的数字证书。相比于DV基础型的多域名SSL证书和OV企业型的多域名SSL证书&#xff0c;EV增强型多域名SSL证书功能更多、安全等级更高&#xff0c;但是相应的&#xff0c;这款SSL证书的审核也比较严格。今天就随SSL盾小编了解Sectigo旗…

Oracle篇—实例中和name相关参数的区别和作用

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux&#xff0c;也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&#xff0c;并且也会默默的点赞收藏加关注❣…

基于JAVA开发的数字化智慧工地管理平台源码,可私有化部署、带可视化大屏

智能工地应用价值 智慧工地现场构建了基于物联网的智能化数据传感器通用的管理平台。利用计算机、人工智能、无线通信&#xff0c;全天候现场监视、施工检查、质量管理、服务&#xff0c;提高数字化管理、安全、绿色、施工等现场管理能力&#xff0c;标志着现场管理进入信息化时…

20240106----重返学习-在VMware里给centos7设置静态IP地址

在VMware里给centos7设置静态IP地址 场景 学习nginx中&#xff0c;想要设置静态IP地址&#xff0c;以便让win10主环境中的Xshell里能够连接到VMware中的CentOS7上&#xff0c;进而可以在Xshell里进行操作。可以做到如复制粘贴之类的&#xff0c;而不是在虚拟机中的默认终端上…

css如何让两个元素在同一水平线上(文字和svg图片)

一开始写发现这两者不在同一水平线 起初用margin-top margin-bottom来协调 发现效果并不好 1&#xff1a;写法僵硬 2&#xff1a;margin会把div撑破&#xff0c;达不到预期效果&#xff08;padding也是&#xff09; 3. 加了flex布局 之后, 因为我这个是在表格里面,无法居中…

实录分享 | 央企大数据平台架构发展趋势与应用场景的介绍

分享嘉宾&#xff1a; 孟子涵-中国华能集团信息中心平台架构师 2021年华能就与Alluxio建立了合作&#xff0c;共同写了整个华能统一纳管的架构方案。这个方案我认为是现在我们在央企里边比较核心的一套体系&#xff0c;能让全集团所有我们认为重要的数字化资源实现真正的统一集…

【K8s学习】

k8s的简单执行流程&#xff1a; Kubernetes Master&#xff08;API Server、Scheduler等组件&#xff09;负责调度Pod到合适的Node上。 当Pod被调度到某个Node时&#xff0c;该Node上的kubelet代理会收到指令并开始执行Pod的生命周期管理任务&#xff0c;包括创建、监控和终止P…

第8章-第4节-Java中字节流的缓冲流

1、缓冲流&#xff1a;属于高级IO流&#xff0c;并不能直接读写数据&#xff0c;需要依赖于基础流。缓冲流的目的是为了提高文件的读写效率&#xff1f;那么是如何提高文件的读写效率的呢&#xff1f; 在内存中设置一个缓冲区&#xff0c;缓冲区的默认大小是8192字节&#xff…

第 3 章 Keepalived 双机热备

技能展示&#xff1a; 会构建双机热备系统 会构建 LVSHA 高可用群集 在这个高度信息化的 IT 时代&#xff0c;企业的生产系统、业务运营、销售和支持&#xff0c;以及日常管理等环节越来越依赖于计算机信息和服务&#xff0c;对高可用&#xff08;HA&#xff09;技术的应用需求…

前端安全专题

xss (Cross Site Scripting) 跨站脚本攻击 原理 通常指黑客通过"HTML注入"篡改了网页&#xff0c;插入了恶意的脚本&#xff0c;从而在用户浏览网页时&#xff0c;控制用户浏览器的一种攻击。 常见攻击类型 存储型XSS 攻击者将恶意的 JavaScript 脚本存储在网站…

【分布式微服务专题】SpringSecurity OAuth2快速入门

目录 前言阅读对象阅读导航前置知识笔记正文一、OAuth2 介绍1.1 使用场景*1.2 基本概念&#xff08;角色&#xff09;1.3 优缺点 二、OAuth2的设计思路2.1 客户端授权模式2.1.0 基本参数说明2.1.1 授权码模式2.1.2 简化&#xff08;隐式&#xff09;模式2.1.3 密码模式2.1.4 客…

如何使用人工智能优化 DevOps?

DevOps 和人工智能密不可分&#xff0c;影响着各种业务。DevOps 可以加快产品开发速度并简化现有部署的维护&#xff0c;而 AI 则可以改变整个系统的功能。DevOps团队可以依靠人工智能和机器学习来进行数据集成、测试、评估和发布系统。更重要的是&#xff0c;人工智能和机器学…

轻松掌握构建工具:Webpack、Gulp、Grunt 和 Rollup 的使用技巧(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

【大厂算法面试冲刺班】day0:数据范围反推时间复杂度

常见算法的时间复杂度 规定n是数组的长度/树或图的节点数 二分查找&#xff1a;O(logn) 双指针/滑动窗口&#xff1a;O(n) DFS/BFS&#xff1a;O(n) 构建前缀和&#xff1a;O(n) 查找前缀和&#xff1a;O(1) 一维动态规划&#xff1a;O(n) 二维动态规划&#xff1a;O(n^2) 回溯…

【深度学习每日小知识】Logistic Loss 逻辑回归

逻辑回归的损失函数 线性回归的损失函数是平方损失。逻辑回归的损失函数是对数损失&#xff0c;定义如下&#xff1a; L o g L o s s ∑ ( x , y ) ∈ D − y log ⁡ ( y ′ ) − ( 1 − y ) log ⁡ ( 1 − y ′ ) LogLoss\sum_{(x,y)\in D}-y\log(y)-(1-y)\log(1-y) LogLoss…

卡尔曼滤波:理论与代码

卡尔曼滤波&#xff1a;理论与代码 引言 卡尔曼滤波是一种用于估计系统状态的优化技术&#xff0c;特别适用于含有噪声的测量数据和系统动态变化的情况。本文将简单探讨卡尔曼滤波的理论基础、数学公式的推导&#xff0c;并通过Python代码示例演示其在实际应用中的效果。 一…

基于SSM+vue的篮球场预约管理系统(Java毕业设计)

大家好&#xff0c;我是DeBug&#xff0c;很高兴你能来阅读&#xff01;作为一名热爱编程的程序员&#xff0c;我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里&#xff0c;我将会结合实际项目经验&#xff0c;分享编程技巧、最佳实践以及解决问题的方法。无论你是…

Python 最新版本 3.12.1 环境配置(windows)

文章目录 python 3.12.1环境安装3.12.1 网盘下载3.12.1 官网下载 python 安装完成测试第一个 python 程序Hello Python python 3.12.1环境安装 3.12.1 网盘下载 python 3.12.1 百度网盘地址&#xff1a;https://pan.baidu.com/s/1SAcH_uH0T3DiERn6AZeQlg?pwd4242 提取码&a…

不同activity项目创建时的区别

在 Android Studio 中创建项目时&#xff0c;可以选择创建不同类型的 Activity 作为应用程序的入口点。其中&#xff0c;包括 Empty Activity、Basic Activity、Empty Compose Activity 和 Basic Compose Activity 四种类型。 Empty Activity&#xff1a;这是最简单的 Activity…

最新靠谱可用的-Mac-环境下-FFmpeg-环境搭建

最近在尝试搭建 FFmpeg 开发环境时遇到一个蛋疼的事&#xff0c;Google 了 N 篇文章竟然没有一篇是可以跑起来的&#xff01; 少部分教程是给出了自我矛盾的配置&#xff08;是的&#xff0c;按照贴出来的代码和配置&#xff0c;他自己都跑不起来&#xff09;&#xff0c;大部…