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

相关文章

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

顺序表之创建,判满,插入,输出

文章目录 🍊自我介绍🍊创建一个空的顺序表,为结构体在堆区分配空间🍊插入数据🍊输出数据🍊判断顺序表是否满了,满了返回值1,否则返回0🍊main函数 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~ 🍊自我介绍   Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾”

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出 在数字化时代,文本到语音(Text-to-Speech, TTS)技术已成为人机交互的关键桥梁,无论是为视障人士提供辅助阅读,还是为智能助手注入声音的灵魂,TTS 技术都扮演着至关重要的角色。从最初的拼接式方法到参数化技术,再到现今的深度学习解决方案,TTS 技术经历了一段长足的进步。这篇文章将带您穿越时

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

STM32内部闪存FLASH(内部ROM)、IAP

1 FLASH简介  1 利用程序存储器的剩余空间来保存掉电不丢失的用户数据 2 通过在程序中编程(IAP)实现程序的自我更新 (OTA) 3在线编程(ICP把整个程序都更新掉) 1 系统的Bootloader写死了,只能用串口下载到指定的位置,启动方式也不方便需要配置BOOT引脚触发启动  4 IAP(自己写的Bootloader,实现程序升级) 1 比如蓝牙转串口,

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

寻迹模块TCRT5000的应用原理和功能实现(基于STM32)

目录 概述 1 认识TCRT5000 1.1 模块介绍 1.2 电气特性 2 系统应用 2.1 系统架构 2.2 STM32Cube创建工程 3 功能实现 3.1 代码实现 3.2 源代码文件 4 功能测试 4.1 检测黑线状态 4.2 未检测黑线状态 概述 本文主要介绍TCRT5000模块的使用原理,包括该模块的硬件实现方式,电路实现原理,还使用STM32类

控制反转 的种类

之前对控制反转的定义和解释都不是很清晰。最近翻书发现在《Pro Spring 5》(免费电子版在文章最后)有一段非常不错的解释。记录一下,有道翻译贴出来方便查看。如有请直接跳过中文,看后面的原文。 控制反转的类型 控制反转的类型您可能想知道为什么有两种类型的IoC,以及为什么这些类型被进一步划分为不同的实现。这个问题似乎没有明确的答案;当然,不同的类型提供了一定程度的灵活性,但