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

相关文章

MySQL高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

前端高级CSS用法示例详解

《前端高级CSS用法示例详解》在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交互和动态效果的关键技术之一,随着前端技术的不断发展,CSS的用法也日益丰富和高级,本文将深... 前端高级css用法在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

使用DrissionPage控制360浏览器的完美解决方案

《使用DrissionPage控制360浏览器的完美解决方案》在网页自动化领域,经常遇到需要保持登录状态、保留Cookie等场景,今天要分享的方案可以完美解决这个问题:使用DrissionPage直接... 目录完整代码引言为什么要使用已有用户数据?核心代码实现1. 导入必要模块2. 关键配置(重点!)3.

Springboot如何配置Scheduler定时器

《Springboot如何配置Scheduler定时器》:本文主要介绍Springboot如何配置Scheduler定时器问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Springboot配置Scheduler定时器1.在启动类上添加 @EnableSchedulin

SpringSecurity 认证、注销、权限控制功能(注销、记住密码、自定义登入页)

《SpringSecurity认证、注销、权限控制功能(注销、记住密码、自定义登入页)》SpringSecurity是一个强大的Java框架,用于保护应用程序的安全性,它提供了一套全面的安全解决方案... 目录简介认识Spring Security“认证”(Authentication)“授权” (Auth

python之流程控制语句match-case详解

《python之流程控制语句match-case详解》:本文主要介绍python之流程控制语句match-case使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录match-case 语法详解与实战一、基础值匹配(类似 switch-case)二、数据结构解构匹

python多种数据类型输出为Excel文件

《python多种数据类型输出为Excel文件》本文主要介绍了将Python中的列表、元组、字典和集合等数据类型输出到Excel文件中,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一.列表List二.字典dict三.集合set四.元组tuplepython中的列表、元组、字典

kotlin中的行为组件及高级用法

《kotlin中的行为组件及高级用法》Jetpack中的四大行为组件:WorkManager、DataBinding、Coroutines和Lifecycle,分别解决了后台任务调度、数据驱动UI、异... 目录WorkManager工作原理最佳实践Data Binding工作原理进阶技巧Coroutine