通用定时器PWM波输出原理

1通用PWM波输出原理

在这里插入图片描述
总结:PWM波周期或频率由ARR决定,PWM波占空比由CCRx决定

1通用PWM模式

1.1PWM模式1

在这里插入图片描述PWM模式1:
递增:CNT < CCRx,输出有效电平1
CNT >= CCRx,输出无效电平0
递减:CNT > CCRx, 输出无效电平0
CNT <= CCRx,输出有效电频1

1.2PWM模式2在这里插入图片描述

PWM模式2:
递增:CNT < CCRx,输出无效电平
CNT >= CCRx,输出有效电平
递减:CNT > CCRx,输出有效电平
CNT <= CCRx,输出无效电平
注意:
有/无效状态由TIMx_CCER决定
CCxP=0:OCx高电平有效
CCxP=1:Ocx低电平有效

2 定时器PWM输出比较结构体

typedef struct
{
uint32_t OCMode; /* 输出比较模式选择 /
uint32_t Pulse; /
设置比较值 /
uint32_t OCPolarity; /
设置输出比较极性 /
uint32_t OCNPolarity; /
设置互补输出比较极性 /
uint32_t OCFastMode; /
使能或失能输出比较快速模式 /
uint32_t OCIdleState; /
空闲状态下OC1输出 /
uint32_t OCNIdleState; /
空闲状态下OC1N输出 */
} TIM_OC_InitTypeDef;

2 PWM波周期与频率计算

在这里插入图片描述

3 通用定时器PWM波输出实验配置步骤

1,配置定时器基础工作参数 HAL_TIM_PWM_Init()
2,定时器PWM输出MSP初始化 HAL_TIM_PWM_MspInit() 配置NVIC、CLOCK、GPIO等
3,配置PWM模式/比较值等 HAL_TIM_PWM_ConfigChannel()
4,使能输出并启动计数器 HAL_TIM_PWM_Start()
5,修改比较值控制占空比(可选) __HAL_TIM_SET_COMPARE()
6,使能通道预装载(可选) __HAL_TIM_ENABLE_OCxPRELOAD()

4 通用定时器PWM波输出编程实战

目的:输出PWM波占空比为50%

4 .1gtim.c

#include "./BSP/TIMER/gtim.h"
#include "./BSP/LED/led.h"

//1.声明定时器句柄
TIM_HandleTypeDef  g_timx_pwm_handler;
/**
 * @brief       通用定时器TIMX 通道Y PWM输出 初始化函数(使用PWM模式1)
 * @note
 *              通用定时器的时钟来自APB1,当PPRE1 ≥ 2分频的时候
 *              通用定时器的时钟为APB1时钟的2倍, 而APB1为42M, 所以定时器时钟 = 84Mhz
 *              定时器溢出时间计算方法: Tout = ((arr + 1) * (psc + 1)) / Ft us.
 *              Ft = 定时器工作频率,单位:Mhz
 *
 * @param       arr: 自动重装值
 * @param       psc: 预分频系数
 * @retval      无
 */
//2.配置通用定时器基本工作参数,PWM输出初始化
void gtim_timx_pwm_chy_init(uint16_t arr, uint16_t psc)    /* 通用定时器 PWM初始化函数 */  
{
    //4.1定时器输出比较定时器结构体初始化
    TIM_OC_InitTypeDef tim_oc_pwm_chy = {0};
    
    //2.1通用定时器PWM输出初始化
    g_timx_pwm_handler.Instance = GTIM_TIMX_PWM;
    g_timx_pwm_handler.Init.Period = arr;
    g_timx_pwm_handler.Init.Prescaler = psc;
    g_timx_pwm_handler.Init.CounterMode = TIM_COUNTERMODE_UP;
    HAL_TIM_PWM_Init(&g_timx_pwm_handler);
    
    
    //4.配置PWM模式和比较值
    tim_oc_pwm_chy.OCMode = TIM_OCMODE_PWM1;          //输出比较模式 PWM1
    tim_oc_pwm_chy.Pulse = arr/2;                     //设置比较值为自动加载值的一般,则占空比为50%
    tim_oc_pwm_chy.OCPolarity = TIM_OCPOLARITY_LOW;   //设置输出比较的极性为低
    HAL_TIM_PWM_ConfigChannel(&g_timx_pwm_handler,&tim_oc_pwm_chy,GTIM_TIMX_PWM_CHY);
    
    //5,使能输出并启动计时器
    HAL_TIM_PWM_Start(&g_timx_pwm_handler,GTIM_TIMX_PWM_CHY);
 
    
}
//3.定时器PWM输出底层初始化,定时器时钟、引脚时钟使能,引脚复用配置
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef * htm)
{
    //3.1判断是否是TIM14
    if(htm->Instance ==  GTIM_TIMX_PWM)
    {
         GPIO_InitTypeDef gpio_init_struct;
        //3.3使能定时器时钟
        GTIM_TIMX_PWM_CHY_CLK_ENABLE();
        
        //3.4使能PF引脚口时钟
        GTIM_TIMX_PWM_CHY_GPIO_CLK_ENABLE();
       
       
      //3.2通道y的GPIO初始化
      gpio_init_struct.Pin = GTIM_TIMX_PWM_CHY_GPIO_PIN;      /* LED0引脚 */
      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 = GPIO_AF9_TIM14;            /* 端口复用到TIM14 */ 
      HAL_GPIO_Init(LED0_GPIO_PORT, &gpio_init_struct);       /* 初始化LED0引脚 */
    
    }
}

4 .2 gtim.c


#ifndef __GTIM_H
#define __GTIM_H

#include "./SYSTEM/sys/sys.h"


/* TIMX PWM输出定义 
 * 这里输出的PWM控制LED0(RED)的亮度
 * 默认是针对TIM2~TIM5
 * 注意: 通过修改这几个宏定义,可以支持TIM1~TIM8任意一个定时器,任意一个IO口输出PWM
 */
#define GTIM_TIMX_PWM_CHY_GPIO_PORT         GPIOF
#define GTIM_TIMX_PWM_CHY_GPIO_PIN          GPIO_PIN_9
#define GTIM_TIMX_PWM_CHY_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOF_CLK_ENABLE(); }while(0)  /* PF口时钟使能 */
#define GTIM_TIMX_PWM_CHY_GPIO_AF           GPIO_AF9_TIM14                               /* 端口复用到TIM14 */

/* TIMX REMAP设置
 * 因为我们LED0接在PF9上, 必须通过开启TIM14的部分重映射功能, 才能将TIM14_CH1输出到PF9上
 */

#define GTIM_TIMX_PWM                       TIM14                                        /* TIM14 */
#define GTIM_TIMX_PWM_CHY                   TIM_CHANNEL_1                                /* 通道Y,  1<= Y <=4 */
#define GTIM_TIMX_PWM_CHY_CCRX              TIM14->CCR1                                  /* 通道Y的输出比较寄存器 */
#define GTIM_TIMX_PWM_CHY_CLK_ENABLE()      do{ __HAL_RCC_TIM14_CLK_ENABLE(); }while(0)  /* TIM14 时钟使能 */

void gtim_timx_pwm_chy_init(uint16_t arr, uint16_t psc);    /* 通用定时器 PWM初始化函数 */

#endif

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python面向对象编程 —— 类和异常处理

​ &#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 &#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 1. 类 1.1 类的定义 1.2 类变量和实例变量 1.3 类的继承 2. 异常处理 2.1类型异常 2.…

fiddler菜单汉化补丁

【Fiddler汉化补丁下载地址】 一、手机应用市场下载“头条搜索极速版”app 二、头条搜索极速版中搜索“葫芦娃指南”获取 三、汉化过程完整过程 1、安装Fiddler英文版 2、比如我将Fiddler安装在&#xff1a;D:\Programs\Fiddler 3、将【fiddler汉化】文件夹中的FiddlerT…

2024年【茶艺师(初级)】考试技巧及茶艺师(初级)试题及解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 茶艺师&#xff08;初级&#xff09;考试技巧是安全生产模拟考试一点通生成的&#xff0c;茶艺师&#xff08;初级&#xff09;证模拟考试题库是根据茶艺师&#xff08;初级&#xff09;最新版教材汇编出茶艺师&#…

【基于VirtualBox及openEuler20.03 TLS SP1编译openGauss2.1.0源码】

【openEuler 20.03 TLS编译openGauss2.1.0源码】 一、安装环境二、安装步骤 一、安装环境 项目Value虚拟机virtualbox操作系统openEuler 20.03 TLSopenGauss2.1.0openGauss-third_party2.1.0 二、安装步骤 以下操作需要在root用户下执行 编辑/etc/selinux/config vim /etc/s…

分享一个学习Typescript最全的Github网站

一个专注研究Typescript的网站&#xff0c;&#x1f396;&#x1f396;&#x1f396;在这里你可以全面深入学习Typescript相关知识,通过动画方式讲解TS&#xff0c;还有很多常见问题解答。你还可以挑战相应的题目&#xff0c;快来学习吧 我就懒一点&#xff0c;直接原滋原味的…

跟踪SEO性能

他们说&#xff0c;如果你能衡量一些东西&#xff0c;你就可以改进它。 在SEO中&#xff0c;也不例外。专业的SEO跟踪从排名和转化到丢失链接等的所有内容&#xff0c;以帮助证明SEO的价值。衡量你的工作和持续改进的影响&#xff0c;对于你的SEO成功、客户保留和感知价值至关…

工智能基础知识总结--什么是CNN

什么是CNN 卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习(deep learning)的代表算法之一。CNN最常用于CV领域,但是在NLP等其他领域也有应用,如用于文本分类的TextCNN。 …

搞知识竞赛活动要做哪些准备工作

举办知识竞赛&#xff0c;大量的精力和时间投入是在筹划准备阶段。诸如竞赛的策划布置、题库的设计建立、参赛人员的复习准备、竞赛器具的购置、赛场的布置安装、对各环节的督促检验等一系列工作&#xff0c;都是在此期间进行和完成的。无论哪一环节出现疏漏偏差&#xff0c;都…

如何通过易舟云财务软件,查看账簿的总账?

如何通过易舟云财务软件&#xff0c;查看账簿的总账&#xff1f; 前言财务软件操作步骤 前言 总账是会计中的一个重要概念&#xff0c;是指记录一个企业在一定时期内所有经济业务活动的账簿。总账记录了企业的资产、负债、所有者权益、收入和费用等各项会计科目的变动情况。 …

MySQL多表查询的方法(含例子)

我们查两张及以上表的时候&#xff0c;普通的查询语法(select * from 表名&#xff09;不能发挥作用。下面我演示两张表和三张表的查询方法。 前提&#xff1a; 如图存在三张表a&#xff0c;b&#xff0c;c&#xff1a;a表是学生基础信息&#xff0c;b表是教师学科信息&#…

【Python特征工程系列】教你利用XGBoost模型分析特征重要性(源码)

这是Python特征工程系列原创文章&#xff0c;我的第186篇原创文章。 一、问题 应用背景介绍&#xff1a; 如果有一个包含数十个甚至数百个特征的数据集&#xff0c;每个特征都可能对你的机器学习模型的性能有所贡献。但是并不是所有的特征都是一样的。有些可能是冗余的…

LDO线性稳压器与开关电源的原理

线性稳压器LDO典型代表&#xff1a;LM7805 ,AMS1117&#xff0c;还有一下性能比较好的LDO&#xff1a; 开关稳压器典型代表&#xff1a;LM2596&#xff0c;MP1584,TPS5430&#xff0c;MP2315S LDO靠发热分散能量&#xff0c;纹波较小一般在30mv以下&#xff1b;DCDC通过开关开断…

HikvisionCamera开发-萤石云RTMP协议获取视频流

RTMP/RTSP&#xff08;实时流传输协议&#xff09;是一种网络协议&#xff0c;旨在用于传输音频和视频数据。本文将介绍如何在HikvisionCamera二次开发中如何通过RTMP协议获得实时视频流&#xff0c;使用到的摄像头为POE供电的海康威视-臻全彩款&#xff0c;以及套餐内配套录像…

机器学习系列--R语言随机森林进行生存分析(1)

随机森林&#xff08;Breiman 2001a&#xff09;&#xff08;RF&#xff09;是一种非参数统计方法&#xff0c;需要没有关于响应的协变关系的分布假设。RF是一种强大的、非线性的技术&#xff0c;通过拟合一组树来稳定预测精度模型估计。随机生存森林&#xff08;RSF&#xff0…

游戏任务系统实现思路

文章目录 一、需求介绍二、数据库设计3、代码部分实现 一、需求介绍 1、首先任务的类型不同&#xff0c;可以分为&#xff1a;日常任务、成长任务、活动任务等等。 2、当达到任务目标时&#xff0c;自动发放任务奖励。 3、任务需要后台可配置&#xff0c;例如&#xff1a;任务…

深度学习框架Pytorch学习笔记

由于工作原因&#xff0c;需要使用到深度学习pytorch框架&#xff0c;所以&#xff0c;跟随视频学习了深度学习框架的使用方法 1、安装pytorch 在windows下使用pytorch&#xff0c;首先找到anaconda官网&#xff0c;安装64位windows版本&#xff0c;然后使用清华的源替换掉an…

FileZilla的使用及主动模式与被动模式[FileZilla]

目录 一.FileZilla的简介 二.FileZilla的安装及准备工作 三.FileZilla使用 四.主动模式与被动模式 主动模式&#xff08;Active Mode&#xff09;&#xff1a; 被动模式&#xff08;Passive Mode&#xff09;&#xff1a; 如何在FileZilla中选择模式&#xff1a; 今天的到…

C++初阶(类中的默认成员函数)

呀哈喽&#xff0c;我是结衣 今天给大家带来的是类里面的默认成员函数&#xff0c;一共有六个默认的成员函数哦&#xff0c;包括构造函数&#xff0c;析构函数&#xff0c;拷贝构造函数&#xff0c;运算符重载函数&#xff0c;const成员函数&#xff0c;那么正篇开始。 文章目…

Qt QAction添加图片

QAction用的时候&#xff0c;时常需要添加图片&#xff0c;如上图所示&#xff0c;代码如下所示&#xff1a; 测试的图片格式包含png,jpg,bmp,svg&#xff0c;其他未测试