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中你不知道的gzip高级用法分享

《Python中你不知道的gzip高级用法分享》在当今大数据时代,数据存储和传输成本已成为每个开发者必须考虑的问题,Python内置的gzip模块提供了一种简单高效的解决方案,下面小编就来和大家详细讲... 目录前言:为什么数据压缩如此重要1. gzip 模块基础介绍2. 基本压缩与解压缩操作2.1 压缩文

Java中的for循环高级用法

《Java中的for循环高级用法》本文系统解析Java中传统、增强型for循环、StreamAPI及并行流的实现原理与性能差异,并通过大量代码示例展示实际开发中的最佳实践,感兴趣的朋友一起看看吧... 目录前言一、基础篇:传统for循环1.1 标准语法结构1.2 典型应用场景二、进阶篇:增强型for循环2.

Spring如何使用注解@DependsOn控制Bean加载顺序

《Spring如何使用注解@DependsOn控制Bean加载顺序》:本文主要介绍Spring如何使用注解@DependsOn控制Bean加载顺序,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录1.javascript 前言2. 代码实现总结1. 前言默认情况下,Spring加载Bean的顺

使用Python进行GRPC和Dubbo协议的高级测试

《使用Python进行GRPC和Dubbo协议的高级测试》GRPC(GoogleRemoteProcedureCall)是一种高性能、开源的远程过程调用(RPC)框架,Dubbo是一种高性能的分布式服... 目录01 GRPC测试安装gRPC编写.proto文件实现服务02 Dubbo测试1. 安装Dubb

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

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