STM32G474之TIM1输出PWM信号支持互补输出,死区时间和刹车

news2024/12/24 9:56:43

STM32G474之TIM1输出PWM信号,互补输出,支持死区时间和刹车。PWM第1通道输出引脚配置:TIM1_CH1映射到PA8,TIM1_CH1N映射到PA7,TIM1_BKIN映射到PA6,用作刹车输入信号。当刹车时,停止PWM波形输出。在使用“比较输出通道2”时,需要将PA11引脚复用为TIM1_BKIN2,用作刹车输入。

1、测试程序

void Timer1_Init(void)
{
   TIM_HandleTypeDef htim1;
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};
  TIM_OC_InitTypeDef sConfigOC = {0};
  TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};

    __HAL_RCC_TIM1_CLK_ENABLE();  //使能“定时器1”的时钟,Enable TIM1 clock
    __HAL_RCC_GPIOA_CLK_ENABLE(); //GPIOA时钟使能

    GPIO_InitStruct.Pin = GPIO_PIN_8;
    //选择引脚编号8
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; //复用功能推挽模式
    GPIO_InitStruct.Pull = GPIO_PULLUP;     //设置上拉
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;//引脚的输出速度为120MHz
    GPIO_InitStruct.Alternate = GPIO_AF6_TIM1;
    //将PA8引脚复用为TIM1_CH1
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    //根据GPIO_InitStruct结构变量指定的参数初始化GPIOA的外设寄存器

    GPIO_InitStruct.Pin = GPIO_PIN_7;
    //选择引脚编号7
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;//复用功能推挽模式
    GPIO_InitStruct.Pull = GPIO_PULLUP;    //设置上拉
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    //引脚的输出速度为120MHz
    GPIO_InitStruct.Alternate = GPIO_AF6_TIM1;
    //将PA7引脚复用为TIM1_CH1N
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    //根据GPIO_InitStruct结构变量指定的参数初始化GPIOA的外设寄存器

    GPIO_InitStruct.Pin = GPIO_PIN_6;
    //选择引脚编号6
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;//复用功能推挽模式
    GPIO_InitStruct.Pull = GPIO_PULLUP;    //设置上拉
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    //引脚的输出速度为120MHz
    GPIO_InitStruct.Alternate = GPIO_AF6_TIM1;
    //将PA6引脚复用为TIM1_BKIN,用作刹车输入
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    //根据GPIO_InitStruct结构变量指定的参数初始化GPIOA的外设寄存器

//    GPIO_InitStruct.Pin = GPIO_PIN_11;
//    //选择引脚编号7
//    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;//复用功能推挽模式
//    GPIO_InitStruct.Pull = GPIO_PULLUP;    //设置上拉
//    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
//    //引脚的输出速度为120MHz
//    GPIO_InitStruct.Alternate = GPIO_AF12_TIM1_COMP2;
//    //在使用“比较输出通道2”时,需要将PA11引脚复用为TIM1_BKIN2,用作刹车
//    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
//    //根据GPIO_InitStruct结构变量指定的参数初始化GPIOA的外设寄存器

  htim1.Instance = TIM1;
    htim1.Init.Period = PERIOD_VALUE;  //周期值99
  htim1.Init.Prescaler = (17-1);          //16表示设置TIM1预分频器为17
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    //设置时钟分频系数,TIM1_CR1中的CKD[9:8]=00b,tDTS=Ttim_ker_ck;
    //tim_ker_ck位定时器内核时钟,也就是定时器的计数器输入时钟
    //溢出时间为(99+1)*1*17/170000000/1=10us
    //最大误差为17/170000000=0.1us

  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim1.Init.RepetitionCounter = 0;//重复计数(1-0)次,产生1次中断,比较重要
  htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  HAL_TIM_PWM_Init(&htim1);//将TIM1初始化为PWM

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;//TIMx_EGR.UG位用作产生TIM1_TRGO触发信号
  sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET;//TIMx_EGR.UG位用作产生TIM1_TRGO2触发信号
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;//Master/slave mode is selected
  HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig);
    //Configures the TIM in master mode.

  sConfigOC.OCMode = TIM_OCMODE_PWM1;              //设置为PWM1模式
  sConfigOC.Pulse = PULSE_WIDTH_VALUE1;            //比较值1,用来设置输出脉宽
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;      //“OC输出极性”非空闲状态时,为高电平有效
  sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;    //“OCN输出极性”非空闲状态时,为高电平有效
  sConfigOC.OCFastMode = TIM_OCFAST_ENABLE;
    //定时器输出快速状态:“输出比较快速”使能,因为PWM输出频率高,还是用快速比较
  sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;   //“OC的空闲状态”为低电平
  sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; //“OCN的空闲状态”为低电平
  HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);
    //初始化“比较输出1通道”

  sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_ENABLE;//TIM_OSSR_DISABLE;
    //运行模式下的OFF状态:
    //TIMx_BDTR寄存器bit11(OSSR),OSSR=0,当处于“不活动”状态时,OC/OCN输出不使能,被定时器释放,强制进入Hi-Z状态。
    //TIMx_BDTR寄存器bit11(OSSR),OSSR=1,当不活动时,OC/OCN输出会启用其非活动电平。

  sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_ENABLE;//TIM_OSSI_DISABLE;
    //空闲模式下的OFF状态:
    //TIMx_BDTR寄存器bit10(OSSI),OSSI=0,当不活动时,OC/OCN输出不使能,被定时器释放,强制进入Hi-Z状态。
    //TIMx_BDTR寄存器bit10(OSSI),OSSI=1,当不活动时,OC/OCN输出强制使用其空闲状态的电平

  sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
    //TIMx_BDTR寄存器bit9:8(LOCK[1:0])
    //
LOCK[1:0]=00b,无写保护
    //LOCK[1:0]=01b,TIMx_BDTR寄存器中的“DTG[7:0],BKBID,BKE,BKP,AOE”,TIMx_CR2寄存器中的“OISx和OISxN”,写保护;
    //锁定位在CPU复位后只能写入一次。TIMx_BDTR寄存器一旦被写入,则它们的内容会被冻结,直到下一次CPU复位时才能改写。

  sBreakDeadTimeConfig.DeadTime = 85;
    //死区时间:当时钟分频系数htim1.Init.ClockDivision=0时,死区时间DT=85*(1/170000000)=0.5us
    //TIMx_BDTR寄存器bit7:0(DTG[7:0])
    //只要锁定级别1、2或3已经被编程(TIMx_BDTR寄存器中的锁定位LOCK[1:0]),就不能修改死区时间
  //DTG[7:5]=0xx,死区时间DT=DTG[7:0] * tdtg,tdtg=tDTS.
  //DTG[7:5]=10x,死区时间DT=(64+DTG[5:0]) * tdtg,Tdtg=2*tDTS
  //DTG[7:5]=110,死区时间DT=(32+DTG[4:0]) * tdtg,Tdtg=8*tDTS
  //DTG[7:5]=111,死区时间DT=(32+DTG[4:0]) * tdtg,Tdtg=16*tDTS
    //时钟分频系数htim1.Init.ClockDivision
    //TIMx_CR1寄存器bit9:8(CKD[1:0]),通常CKD[1:0]=00b,tDTS=ttim_ker_ck;
    //CKD[1:0]=01b,tDTS=2*ttim_ker_ck;CKD[1:0]=10b,tDTS=4*ttim_ker_ck;CKD[1:0]=11b,保留

  sBreakDeadTimeConfig.BreakState = TIM_BREAK_ENABLE;
    //使能TIM1_BKIN引脚检测
    //TIMx_BDTR寄存器bit12(BKE),BKE=1b,“刹车功能”使能

  sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_LOW;
    //TIM1_BKIN引脚低电平有效
    //TIMx_BDTR寄存器bit13(BKP),BKP=0b,“tim_brk刹车输入信号”低电平停止PWM波形输出

  sBreakDeadTimeConfig.BreakFilter = 0;
    //指定TIM1_BKIN引脚的“输入过滤器”
    //TIMx_BDTR寄存器bit19:16(BKF[3:0]),BKF[3:0]=0000b,tim_brk可以异步操作刹车

  sBreakDeadTimeConfig.BreakAFMode = TIM_BREAK_AFMODE_INPUT;  //指定TIM1_BKIN引脚的“复用功能”

  sBreakDeadTimeConfig.Break2State = TIM_BREAK2_DISABLE;         //关闭TIM1_BKIN2引脚检测,因为这里用不到"TIM1_BKIN2"
  sBreakDeadTimeConfig.Break2Polarity = TIM_BREAK2POLARITY_HIGH; //TIM1_BKIN2引脚高电平有效
  sBreakDeadTimeConfig.Break2Filter = 0;                         //指定TIM1_BKIN2引脚的“输入过滤器”
  sBreakDeadTimeConfig.Break2AFMode = TIM_BREAK_AFMODE_INPUT;    //指定TIM1_BKIN2引脚的“复用功能”

  sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_ENABLE;
    //刹车撤销后能自动恢复输出波形
//  sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
//刹车撤销后不会自动恢复输出波形

  HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig);
    //配置BKIN刹车引脚和死区时间

  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
    //启动PWM信号发生器:启动OC通道1
    //Start PWM signals generation:Start channel 1

    HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1);//开启互补通道1输出到TIM1_CH1N
}

Timer1.h程序如下:

#ifndef __Timer1_H__
#define __Timer1_H__

#include "stm32g4xx_hal.h"
#include "main.h"

#define PERIOD_VALUE        (uint32_t)(100 - 1)  //周期值

#define PULSE_WIDTH_VALUE1  (uint32_t)(100*0.5)   //比较值1,用来设置输出脉宽

extern void  Timer1_Init(void);
extern void Print_TIM1_input_frequency(void);
#endif

2、输出波形

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

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

相关文章

海上8km远距离无线通信模组,无人船MESH组网,飞睿WiFi助力海洋船只通信无障碍

在蔚蓝无垠的海洋世界里,每一次科技的进步都如同海上的灯塔,为我们照亮了前行的道路。今天,我要为大家介绍的,就是一款能够打破传统通信界限的模块——飞睿智能8km远距离无线通信模组。它不仅在陆地通信中展现出强大的实力&#x…

4. 第一个3D案例—创建3D场景

入门Three.js的第一步,就是认识场景Scene、相机Camera、渲染器Renderer三个基本概念,接下来,咱们通过三小节课,大家演示“第一个3D案例”完成实现过程。 学习建议:只要你能把第一个3D案例搞明白,后面学习就…

幼儿园数字化探索:从入园适应到全面启智

金秋九月,全国各地幼儿园迎来开学季。幼儿园门口,一幅幅温情与成长的画面交织在一起。针对小班幼儿普遍存在的分离焦虑问题,幼儿园教师团队展现出了高度的专业性和人文关怀。据上海市普陀区汇丽幼儿园叶老师介绍,为有效缓解这一挑…

【技术分享】顶尖 GIS 技术

谈到 GIS,就不能不提到现代地理智能。是指基于 GIS、遥感和卫星定位技术的地理空间可视化、分析、决策、设计和控制的技术总称。地理智能是 GIS 区别于其他信息技术最重要的价值之一。它由地理可视化、地理决策、地理设计、地理控制四个层次组成。它们形成了一个地理…

wordpress发送邮件的方法?怎么配置功能?

wordpress发送邮件设置教程?WordPress如何配置发信? WordPress作为最受欢迎的内容管理系统之一,被广泛用于创建和管理网站。AokSend将详细介绍WordPress发送邮件的方法,并指导您如何配置这一功能,确保您的邮件发送既高…

跑步用耳机哪款好?这五款运动骨传导耳机健身人士都说好!

在无线耳机市场持续繁荣的今天,入耳式耳机以其卓越的音质体验赢得了众多用户的青睐。然而,随着健康意识的提升,长时间佩戴入耳式耳机所带来的健康隐患日益受到关注。正是在这样的背景下,骨传导耳机凭借其独特的非入耳式设计&#…

iMeta: 南医大余光创组ggtree最新文章-系统发育树存储与可视化的数据结构

Ggtree:用于系统发育树及相关数据存储与可视化的数据结构 https://onlinelibrary.wiley.com/doi/10.1002/imt2.56 SHORT COMMUNICATION ● 2022年9月28日,南方医科大学基础医学院余光创团队在iMeta在线发表了题为“Ggtree: a serialized data object f…

UOS系统下Java执行权限问题

在程序部署中,出现 /bin/java 权限不足 问题,这个问题是由于java文件无运行权限导致,通过 sudo chmod ax bin/java 项目中需要展示系统当前所有运行程序窗口界面截图功能,这个功能在实现时通过 import 截图可获取界面图片&…

【Story】国际标准组织及其相关信息(全)

目录 1. ISO(International Organization for Standardization)2. IEC(International Electrotechnical Commission)3. ITU(International Telecommunication Union)4. ISO/IEC 合作标准5. IEEE&#xff08…

使用ChatGPT7小时完成高分论文写作,AI写作避坑全攻略指南

大家好,感谢关注。我是七哥,一个在高校里不务正业,折腾学术科研AI实操的学术人。关于使用ChatGPT等AI学术科研的相关问题可以和作者七哥(yida985)交流,多多交流,相互成就,共同进步,为大家带来最酷最有效的智能AI学术科研写作攻略。经过数月爆肝,终于完成学术AI使用教…

探索前沿的WebGIS开发技术:新中地教育限时福利课程免费分享

随着新学期的到来,新中地教育特别推出了限时免费领取课程合集活动,领取截止时间9月9日。为广大GIS学习者和爱好者提供一个宝贵的学习机会。此次活动旨在鼓励更多人加入到地理信息系统(GIS)技术的学习中来,掌握前沿的We…

NYNQ u-boot+kernel+rootfs.ext4的构造

其中u-boot位与NoFlash中内核和根文件系统位于emmc中 具体描述: 基于上表,在进行内存地址分配将会事半功倍。

嵌入式在线商城

一、主线功能 1、设计与实现在线商城系统涉及到前端展示、后台管理以及数据库进行查找,功能包含登录页面、商品搜素、商品详细信息查找。 二、页面设计 2.1、商品搜索设计 2.2、商品详细信息展示设计 2.3、TCP并发服务器设计 HTTP是基于Tcp服务器搭建起来的 第一…

【Hadoop|HDFS篇】HDFS的Shell操作

1. 基本语法 hadoop fs 具体命令或者hadoop dfs 具体命令。 两个是完全相同的。 2. 命令大全 hadoop fs&#xff1a; Usage: hadoop fs [generic options][-appendToFile <localsrc> ... <dst>][-cat [-ignoreCrc] <src> ...][-checksum <src> ..…

Robotics: computational motion planning 部分笔记—— week 1 graph-based

grassfire algorithm 四周扩散性&#xff1b;从终点开始按照相邻最小距离格子移动 Dijkstra’s Algorithm 标明从起点开始的所有点的最短距离&#xff08;从上一节点继承&#xff09;&#xff0c;直到终点 A* Algorithm 带有启发性的&#xff0c;给出距离估计&#xff0c…

大数据-117 - Flink DataStream Sink 案例:写出到MySQL、写出到Kafka

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

LLM常见问题(RAG部分)

1. 什么是 Graph RAG&#xff1f; Graph RAG 是由悦数图数据提出的概念&#xff0c;是一种基于知识图谱的检索增强技术&#xff0c;通过构建图模型的知识表达&#xff0c;将实体和关系之间的联系用图的形式进行展示&#xff0c;然后利用大语言模型 LLM进行检索增强。 通过图技…

鸿蒙Harmony--状态变量更改通知--@Watch装饰器详解

风雨飘摇中&#xff0c;我心起伏&#xff0c; 万丈雄心&#xff0c;却难以施展。 天高地远&#xff0c;路途迷茫&#xff0c; 理想如星&#xff0c;却遥不可及。 千百次跌倒&#xff0c;千百次爬起&#xff0c; 在命运的手掌中&#xff0c;挣扎前行。 谁知我心中的热血滚烫&…

什么是科学碳目标(SBTI认证)

科学碳目标&#xff08;SBTI认证&#xff09;&#xff0c;这一绿色发展的璀璨明珠&#xff0c;是企业迈向可持续未来的重要里程碑。它不仅是全球环境信息研究中心(CDP)、联合国全球契约组织(UNGC)、世界资源研究所(WRI)与世界自然基金会(WWF)共同铸就的智慧结晶&#xff0c;更是…

【C++模板初阶】

文章目录 一、泛型编程二、函数模板1.函数模板概念2.函数模板格式3.函数模板的原理4 函数模板的实例化1. 隐式实例化2. 显式实例化不同类型形参传参时的处理 5.模板参数的匹配原则 三、类模板1 类模板的定义格式2 类模板的实例化 一、泛型编程 首先大家先思考一个问题&#xff…