STM32-高级定时器互补输出带死区控制实验

2023-11-24 18:50

本文主要是介绍STM32-高级定时器互补输出带死区控制实验,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

实验要求为通过定时器1通道1输出频率为1kHz,占空比为70%的PWM输出,输出模式设置为PWM1模式。

使能互补输出死区控制:设置DTG=100;使能刹车功能,刹车输入信号高电平有效,配置输出空闲状态。

以1kHz为例的话,Tout=1ms=(ARR+1)*(PSC+1)/Ft(Ft=72M),则可得PSC=71,ARR=999。

由下图可知,PE9为TIM1_CH1的引脚口,PE8为TIM1_CH1N(互补输出),PE15为TIM1的刹车控制。

 而对于定时器1的重映射,我们对重映射寄存器输入11,实现完全映射,如下图所示。

 接下来我们编写实验代码:

首先编写函数头文件atim.h:

#ifndef __ATIM_H
#define __ATIM_H#include "./SYSTEM/sys/sys.h"extern TIM_HandleTypeDef g_timx_cplm_pwm_handle;void atim_timx_cplm_pwm_init(uint16_t arr, uint16_t psc);
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim);
void atim_timx_cplm_pwm_set(uint16_t ccr, uint8_t dtg);#endif

接下来再编写函数文件atim.c:

#include "./BSP/GTIM/gtim.h"
#include "./BSP/LED/led.h"TIM_HandleTypeDef g_timx_cplm_pwm_handle = {0};
TIM_BreakDeadTimeConfigTypeDef g_sbreak_dead_time_config = {0}; void atim_timx_cplm_pwm_init(uint16_t arr, uint16_t psc){TIM_OC_InitTypeDef timx_oc_cplm_pwm = {0};g_timx_cplm_pwm_handle.Instance = TIM1;g_timx_cplm_pwm_handle.Init.Prescaler = psc;g_timx_cplm_pwm_handle.Init.Period = arr;g_timx_cplm_pwm_handle.Init.CounterMode = TIM_COUNTERMODE_UP;//向上计数模式HAL_TIM_PWM_Init(&g_timx_cplm_pwm_handle);timx_oc_cplm_pwm.OCMode = TIM_OCMODE_PWM1;//选择PWM1模式timx_oc_cplm_pwm.OCPolarity = TIM_OCPOLARITY_HIGH;//输出极性:高极性timx_oc_cplm_pwm.OCNPolarity = TIM_OCNPOLARITY_HIGH;//互补输出极性为高电平timx_oc_cplm_pwm.OCIdleState = TIM_OCIDLESTATE_RESET;//空闲状态0(以H桥为例,2个三极管都接收低电平,导致不工作)timx_oc_cplm_pwm.OCNIdleState = TIM_OCNIDLESTATE_RESET;//互补空闲状态0(以H桥为例,另外2个三极管都接收低电平,导致不工作)HAL_TIM_PWM_ConfigChannel(&g_timx_cplm_pwm_handle, &timx_oc_cplm_pwm, TIM_CHANNEL_1);//死区参数设置g_sbreak_dead_time_config.OffStateRunMode = TIM_OSSR_DISABLE;//运行模式的关闭输出状态g_sbreak_dead_time_config.OffStateIDLEMode = TIM_OSSI_DISABLE;//空闲模式的关闭输出状态g_sbreak_dead_time_config.LockLevel = TIM_LOCKLEVEL_OFF;//不使用寄存器锁功能g_sbreak_dead_time_config.BreakState = TIM_BREAK_ENABLE;//使能刹车输入g_sbreak_dead_time_config.BreakPolarity = TIM_BREAKPOLARITY_HIGH;//刹车输入高极性g_sbreak_dead_time_config.AutomaticOutput = TIM_AUTOMATICOUTPUT_ENABLE;//使能AOE位,允许刹车结束后自动回复输出HAL_TIMEx_ConfigChannel(&g_timx_cplm_pwm_handle, &g_sbreak_dead_time_config);HAL_TIM_PWM_Start(&g_timx_cplm_pwm_handle, TIM_CHANNEL_1);HAL_TIMx_PWMN_Start(&g_timx_cplm_pwm_handle, TIM_CHANNEL_1);//互补输出通道
}void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim){if(htim->Instance == TIM1){GPIO_InitTypeDef gpio_init_struct;__HAL_RCC_GPIOE_CLK_ENABLE();__HAL_RCC_TIM1_CLK_ENABLE();gpio_init_struct.Pin = GPIO_PIN_9;gpio_init_struct.Mode = GPIO_MODE_AF_PP;gpio_init_struct.Pull = GPIO_PULLDOWN;gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOE, &gpio_init_struct);gpio_init_struct.Pin = GPIO_PIN_8;HAL_GPIO_Init(GPIOE, &gpio_init_struct);gpio_init_struct.Pin = GPIO_PIN_15;HAL_GPIO_Init(GPIOE, &gpio_init_struct);__HAL_RCC_AFIO_CLK_ENABLE();__HAL_AFIO_REMAP_TIM1_ENABLE();HAL_NVIC_SetPriority(TIM1_UP_IRQn, 1, 3);HAL_NVIC_ENABLEIRQ(TIM1_UP_IRQn);}
}void atim_timx_cplm_pwm_set(uint16_t ccr, uint8_t dtg){g_sbreak_dead_time_config.DeadTime = dtg;__HAL_TIM_SET_COMPARE(&g_timx_cplm_pwm_handle, TIM_CHANNEL_1, ccr);
}

最后编写我们的主函数文件main.c:

#include "./SYSTEM/delay/delay.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/LED/led.h"
#include "./BSP/ATIM/atim.h"int main(void){uint8_t t = 0;HAL_Init();sys_stm32_clock_init(RCC_PLL_MUL9);delay_init(72);led_init();key_init();usart_init(115200);atim_timx_cplm_pwm_init(1000 - 1, 72 - 1);atim_timx_cplm_pwm_set(700 - 1, 100);while(1){delay_ms(10);t++;if(t >= 20){LED0_TOGGLE();t = 0;}}
}

如此我们的实验函数代码就编写完成了。

这篇关于STM32-高级定时器互补输出带死区控制实验的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/422399

相关文章

Python远程控制MySQL的完整指南

《Python远程控制MySQL的完整指南》MySQL是最流行的关系型数据库之一,Python通过多种方式可以与MySQL进行交互,下面小编就为大家详细介绍一下Python操作MySQL的常用方法和最... 目录1. 准备工作2. 连接mysql数据库使用mysql-connector使用PyMySQL3.

如何搭建并配置HTTPD文件服务及访问权限控制

《如何搭建并配置HTTPD文件服务及访问权限控制》:本文主要介绍如何搭建并配置HTTPD文件服务及访问权限控制的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、安装HTTPD服务二、HTTPD服务目录结构三、配置修改四、服务启动五、基于用户访问权限控制六、

Apache 高级配置实战之从连接保持到日志分析的完整指南

《Apache高级配置实战之从连接保持到日志分析的完整指南》本文带你从连接保持优化开始,一路走到访问控制和日志管理,最后用AWStats来分析网站数据,对Apache配置日志分析相关知识感兴趣的朋友... 目录Apache 高级配置实战:从连接保持到日志分析的完整指南前言 一、Apache 连接保持 - 性

mysql中的group by高级用法详解

《mysql中的groupby高级用法详解》MySQL中的GROUPBY是数据聚合分析的核心功能,主要用于将结果集按指定列分组,并结合聚合函数进行统计计算,本文给大家介绍mysql中的groupby... 目录一、基本语法与核心功能二、基础用法示例1. 单列分组统计2. 多列组合分组3. 与WHERE结合使

使用Java将实体类转换为JSON并输出到控制台的完整过程

《使用Java将实体类转换为JSON并输出到控制台的完整过程》在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用JSON格式,用Java将实体类转换为J... 在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用j

PyTorch高级特性与性能优化方式

《PyTorch高级特性与性能优化方式》:本文主要介绍PyTorch高级特性与性能优化方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、自动化机制1.自动微分机制2.动态计算图二、性能优化1.内存管理2.GPU加速3.多GPU训练三、分布式训练1.分布式数据

MySQL精准控制Binlog日志数量的三种方案

《MySQL精准控制Binlog日志数量的三种方案》作为数据库管理员,你是否经常为服务器磁盘爆满而抓狂?Binlog就像数据库的“黑匣子”,默默记录着每一次数据变动,但若放任不管,几天内这些日志文件就... 目录 一招修改配置文件:永久生效的控制术1.定位my.cnf文件2.添加核心参数不重启热更新:高手应

Spring Boot集成SLF4j从基础到高级实践(最新推荐)

《SpringBoot集成SLF4j从基础到高级实践(最新推荐)》SLF4j(SimpleLoggingFacadeforJava)是一个日志门面(Facade),不是具体的日志实现,这篇文章主要介... 目录一、日志框架概述与SLF4j简介1.1 为什么需要日志框架1.2 主流日志框架对比1.3 SLF4

Spring Boot集成Logback终极指南之从基础到高级配置实战指南

《SpringBoot集成Logback终极指南之从基础到高级配置实战指南》Logback是一个可靠、通用且快速的Java日志框架,作为Log4j的继承者,由Log4j创始人设计,:本文主要介绍... 目录一、Logback简介与Spring Boot集成基础1.1 Logback是什么?1.2 Sprin

MySQL复合查询从基础到多表关联与高级技巧全解析

《MySQL复合查询从基础到多表关联与高级技巧全解析》本文主要讲解了在MySQL中的复合查询,下面是关于本文章所需要数据的建表语句,感兴趣的朋友跟随小编一起看看吧... 目录前言:1.基本查询回顾:1.1.查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J1.2.按照部门