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

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、输出波形

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

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

相关文章

JAVAEE初阶第六节——网络编程套接字

系列文章目录 JAVAEE初阶第六节——网络编程套接字 文章目录 系列文章目录JAVAEE初阶第六节——网络编程套接字 一. 网络编程基础1. 为什么需要网络编程2. 什么是网络编程3.网络编程中的基本概念 3.1 发送端和接收端 3.2 请求和响应 3.3 客户端和服务端 4. 常见的客户端服务…

【2024数模国赛赛题思路公开】国赛C题第三套思路丨无偿自提

C题参考思路 C题是一道优化问题,目的是根据题目所给的种植限制条件以及附件数据建立目标条件优化模型,优化种植策略,有利于方便田间管理,提高生产效益,减少各种不确定因素可能造成的种植风险。整个题目最重要的问题在…

英语每日一段 195

Promising economic indicators won’t instantly reverse the lingering impact of hard times for millions of families, workplace culture expert Jessica Kriegel said. “Perception and reality are sometimes aligned and sometimes not,” Kriegel told Newsweek. “…

C语言中的预处理指令中的其中一对——#ifdef和#ifndef

目录 开头1.什么是#ifdef和#ifndef?2.#ifdef和#ifndef的实际应用判断ABCD这个宏是否被定义过判断HELLO这个宏是否没被定义过防止头文件重复定义 下一篇博客要说的东西 开头 大家好,我叫这是我58。今天,我们要学一下关于C语言中的预处理指令中的其中一对…

剖析Cookie的工作原理及其安全风险

Cookie的工作原理主要涉及到HTTP协议中的状态管理。HTTP协议本身是无状态的,这意味着每次请求都是独立的,服务器不会保留之前的请求信息。为了在无状态的HTTP协议上实现有状态的会话,引入了Cookie机制。 1. Cookie定义 Cookie,也…

多线程的实现和成员方法

所属专栏:Java学习 1. 多线程的概念 线程:线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程的实际运作单位 下面这些每一个能够运行的软件就是一个进程 进程在系统中是通过PCB这样的结构体来描述&am…

Datawhle X 李宏毅苹果书AI夏令营深度学习笔记之——卷积神经网络的前世今生

一、卷积神经网络简介 卷积神经网络(Convolutional Neural Network, CNN)是一种深度学习模型,尤其擅长处理图像和视频等高维度的数据。CNN 通过模仿人类视觉系统的工作方式,自动学习数据中的空间层次结构,使得它在计算…

传统CV算法——特征匹配算法

Brute-Force蛮力匹配 Brute-Force蛮力匹配是一种简单直接的模式识别方法,经常用于计算机视觉和数字图像处理领域中的特征匹配。该方法通过逐一比较目标图像中的所有特征点与源图像中的特征点来寻找最佳匹配。这种方法的主要步骤包括: 特征提取&#xff…

将Google Chrome或Microsoft Edge浏览器的地址栏隐藏的方法

将Google Chrome或Microsoft Edge浏览器的地址栏隐藏的方法 目标效果示范 我们以百度首页为例,普通模式启动的页面通常会显示地址栏,如下图所示: 而本文要实现的效果是隐去地址栏和书签栏(如果有的话),无…

[C#]国密SM2算法加解密字符串加密解密文件

【算法介绍】 国密SM2算法是一种由中国国家密码管理局发布的非对称加密算法,基于椭圆曲线密码学体系,具有较高的安全性和效率。该算法主要用于数字签名、密钥交换和公钥加密等场景,其安全性主要基于椭圆曲线离散对数问题的难解性。 SM2算法…

网络编程(三次握手四次挥手)

【1】三次握手四次挥手 1》三次握手 第一次握手都又客户端发起,在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。服务器必须准备好接收外来的链接,这通过调用socket、bind和listen函数来完成,称…

小阿轩yx-Kubernertes日志收集

小阿轩yx-Kubernertes日志收集 前言 在 Kubernetes 集群中如何通过不同的技术栈收集容器的日志,包括程序直接输出到控制台日志、自定义文件日志等 有哪些日志需要收集 日志收集与分析很重要,为了更加方便的处理异常 简单总结一些比较重要的需要收集…

https和harbor仓库跟k8s

目录 https 做证书 harbor仓库 https https是加密的http,它的端口是443,它的协议是tcp协议。建立连接和普通的tcp是一样的,都是三次握手和四次挥手,但是它三次握手之后有一个步骤:SSL或者TLS握手的过程&#xff0c…

kubernetes集群部署Confluence 7.2.0+mysql 5.7(自测有效)

背景介绍: Confluence是一个专业的企业知识管理与协同软件。使用简单,但它强大的编辑和站点管理特征能够帮助团队成员之间共享信息、文档协作、集体讨论,信息推送。 这里介绍的使用的是Confluence 7.2.0版本的。 一、在kubernetes集群部署 1…

【C++】手动实现nique_ptr智能指针

1、自己实现封装了一个智能指针&#xff0c;并且使用了模板 目录 代码实现&#xff1a; 输出结果如下&#xff1a; 代码实现&#xff1a; #include <iostream>using namespace std;template <typename T> class UniquePtr { private:T *ptr;public://默认构造函…

H5 响应式精品网站推荐导航源码

源码名称&#xff1a;响应式精品网站推荐导航源码 源码介绍&#xff1a;一款响应式精品网站推荐导航源码&#xff0c;可以自己修改代码替换图标图片和指向网址。背景图支持自动替换&#xff0c;背景图可以在img.php中修改 需求环境&#xff1a;H5 下载地址&#xff1a; http…

【MADRL】多智能体深度确定性策略梯度(MADDPG )算法

本篇文章是博主强化学习RL领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。文章分类在强化学习专栏&#xff1…

Java专栏介绍

专栏导读 在当今这个技术飞速发展的时代&#xff0c;Java作为一门成熟且广泛应用的编程语言&#xff0c;一直是软件开发领域的中坚力量。本“Java技术”专栏旨在帮助读者深入理解Java编程语言的精髓&#xff0c;掌握其核心概念与高级特性&#xff0c;并通过实战案例提升编程技…

MLM:多模态大型语言模型的简介、微调方法、发展历史及其代表性模型、案例应用之详细攻略

MLM&#xff1a;多模态大型语言模型的简介、微调方法、发展历史及其代表性模型、案例应用之详细攻略 目录 相关文章 AI之MLM&#xff1a;《MM-LLMs: Recent Advances in MultiModal Large Language Models多模态大语言模型的最新进展》翻译与解读 MLM之CLIP&#xff1a;CLIP…

012.Oracle-索引

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…