STM32的HAL库开发---高级定时器---互补输出带死区实验

一、互补输出简介

 互补输出:OCx输出高电平,则互补通道OCxN输出低电平。OCx输出低电平,则互补通道OCxN输出高电平。

带死区控制的互补输出:OCx输出高电平时,则互补通道OCxN过一会再输出输出低电平。这个时间里输出的电平为无效电平。

二、带死区控制的互补输出应用H桥

在H桥中间的是电动机, 电流从左边流向右边为正转,从右边流向左边为反转。正转的时候,Q1和Q4导通,反转的时候,Q2和Q3导通。4个三极管都是NPN型三极管,都需要高电平才能导通。

Q1和Q3连接的OC1,Q2和Q3连接的是互补通道OC1N。当OC1输出高电平时,Q1和Q4导通,电机正转,OC1N输出低电平,Q2和Q3都截止。当OC1N输出高电平时,Q2和Q3导通,电机反转,此时OC1输出低电平,Q1和Q4截止。

如果输出通道OC1和互补输出通道OC1N都为有效电平,在这个图里边有效电平为高电平,都为有效电平则短路。

由于元器件是有延迟特性,所以需要加上死区时间控制。这个电路图的无效电平为低电平。

三、捕获/比较通道的输出部分(通道1至3)

1、OC1RE为输出参考信号,高电平有效。

2、TIMx_CCMR1的OC1M设置输出比较模式,在F1系列有8种比较模式。

3、 ETRF信号,设置了OC1CE为,则ETRF信号来的时候,OC1REF会被强制清0。

4、配置TIMx_CCER寄存器的CC1E和CC1NE位,来设置输出通道使能和输出互补通道使能。当使能输出通道,关闭互补输出通道,则直接走死区发生器上面那个线,经过输出极性选择器,从OC1输出。当关闭输出通道,使能互补输出通道,则经过互补输出极性选择器,从OC1N输出。

死区输出:同时使能输出通道和互补输出通带,OC1REF信号经过死区发生器,然后分别经过各自的极性选择器,来到OC1和OC1N。

MOE位:高级定时器的主输出控制,想输出。必须置1,否则两个通道都无法输出。

补充:

高级定时的刹车功能寄存器BDTR里边有一个OSSR位,对用在运行状态(MOE = 1)时,可以控制输出和互补输出通道电平。

手册种给出如下表格

重点看红色部分,当OSSR位设置为1时,如果只使能了输出通道或者互补输出通道中的任意一个,那个另一个通道会输出无效电平。当OSSR位设置为0的时候,另一个通道都是输出0。这个对于学习电机控制的时候有用,如果程序不设置这位,对于想使用一个定时器的互补输出通道控制电机,是不行的,因为另一个通道一直输出0。

 sBreakDeadTimeConfig.OffStateRunMode=TIM_OSSR_ENABLE;

如果设置了这位,另一个通道会根据你设置的有效电平,来输出无效电平。

    sConfig.OCNPolarity = TIM_OCNPOLARITY_LOW;
    sConfig.OCPolarity = TIM_OCPOLARITY_LOW;

下面这俩是控制在刹车输入时,MOE位会被自动清零,然后输出通道和互补输出通道根据空闲状态输出电平,但是要注意,如果你两个通道都设置的是低电平有效,那下面这个设置就是无效的,因为硬件不允许两个通道同时输出有效电平,他会同时输出高电平。但是你设置的是高电平有效,下面这个设置会使两个通道都输出低电平,也就是同时输出无效电平。

    sConfig.OCIdleState = TIM_OCIDLESTATE_RESET;
    sConfig.OCNIdleState = TIM_OCNIDLESTATE_RESET;

四、死区时间计算

1、确定tDTS的值:

 其中CKD位在TIMx_CR1寄存器里边设置,Ft为定时器时钟频率,F1系列就是72Mhz。

2、判断DTG[7:5],选择计算公式,在TIMx_BDTR寄存器设置。

3、带入选择的公式计算。

 五、刹车(断路)功能

1、使能刹车功能:将TIMx_BDTRBKE位置1,刹车输入信号极性由BKP位设置

将TIMx_BKIN引脚复用为刹车功能,刹车信号经过极性选择后,来到或门。BI为刹车中断。

使能刹车功能后:由TIMx_BDTRMOEOSSIOSSR位,TIMx_CR2的OISxOISxN位,TIMx_CCERCCxECCxNE位控制OCxOCxN输出状态

无论何时,OCxOCxN输出都不能同时处在有效电平,由硬件强制设置。

2、发生刹车后,会怎么样?

  • MOE位被清零,OCx和OCxN为无效、空闲或复位状态(OSSI位选择),MOE为0,被称为空闲模式,为1被称为运行模式。
  • OCx和OCxN的状态:由相关控制位状态决定,当使用互补输出时:根据情况自动控制输出电平,参考参考手册使用刹车(断路)功能小节
  • BIF位置1,如果使能了BIE位,还会产生刹车中断;如果使能了TDE位,会产生DMA请求
  • 如果AOE位置 1,在下一个 更新事件UEV时,MOE位被自动置 1

从图中可以看出,当刹车信号来时,MOE位会被置0,同时输出通道电平由OIS1位决定,OIS1为1,则输出高电平,OIS1为0,则输出低电平。

 1、设置输出通道极性为高电平有效,当OCxREF下降沿来的时候,没有延迟,当上升沿来的时候,需要加死区延迟。当刹车信号来的时候,OISx为0,输出低电平,低电平不是有效输出电平,所以没有延迟。

设置互补输出通道为高电平有效,在OCxREF下降沿来的时候,OCxN需要加死区延迟,在OCxREF上升沿来的时候,OCxN变为低电平,不需要加死区延迟。刹车信号来的时候,设置的OCSxN为1,为有效电平,需要加死区延迟。

2、设置输出通道极性为高电平有效,当OCxREF下降沿来的时候,不需要死区延迟,当上升沿来的时候,需要加死区延迟。当刹车信号来的时候,OISx为1,输出高电平,高电平是有效输出电平,需要加死区延迟。

设置互补输出通道为低电平有效,在OCxREF下降沿来的时候,OCxN需要加死区延迟,在OCxREF上升沿来的时候,OCxN变为高电平,不需要加死区延迟。刹车信号来的时候,设置的OCSxN为1,为无效电平,不需要加死区延迟。

3、互补输出没有开启,设置输出通道为高电平有效,输出与OCxREF一样,刹车信号来的时候,OCSx为0,为无效电平,不需要死区延迟。

互补输出通道没有开启,设置的设置互补输出通道为高电平有效,同时OCSxN为1,高电平是有效输出电平,需要加死区延迟。

4、互补输出没有开启,设置输出通道为高电平有效,输出与OCxREF一样,刹车信号来的时候,OCSx为1,为有效电平,需要死区延迟。

互补输出通道没有开启,设置的设置互补输出通道为高电平有效,同时OCSxN为0,低电平不是有效输出电平,不需要加死区延迟。

4、互补输出没有开启,设置输出通道为高电平有效,输出与OCxREF一样,刹车信号来的时候,OCSx为1,为有效电平,需要死区延迟。

互补输出通道没有开启,设置的设置互补输出通道为高电平有效,同时OCSxN为0,低电平不是有效输出电平,不需要加死区延迟。

 六、高级定时器互补输出带死区控制实验配置步骤

1、HAL_TIM_PWM_Init()函数,配置定时器基础工作参数。这个函数与HAL_TIM_Base_init()函数功能是一样的。

2、HAL_TIM_PWM_MspInit(),配置NVIC、CLOCK、GPIO等。

3、HAL_TIM_PWM _Configchannel()函数,配置PWM模式/比较值。

4、HAL_TIMEx_ConfigBreakDeadTime()函数,配置刹车功能、死区时间等。

5、HAL_TIM_PWM _Start()函数,使能输出、主输出、计数器。

6、HAL_TIM_PWMN _Start()函数,使能互补输出、主输出、计数器。

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

1、寄存器版本

#include "./BSP/TIMER/atim.h"//配置定时器1的通道1 和 通道1互补输出  PE8 PE9
void Advanced_TIM_Init(void)
{//开启定时器1时钟RCC->APB2ENR |= (1 << 11);//设置CKD分频系数为4TIM1->CR1 |= (1 << 9);TIM1->CR1 &= ~(1 << 8);//设置ARR寄存器缓冲功能TIM1->CR1 |= (1 << 7);//注意硬件不允许同时输出有效电平 有效电平在CCxP和CCxNP设置//设置OIS1 输出空闲状态//TIM1->CR2 |= (1 << 8);TIM1->CR2 &= ~(1 << 8);//设置OIS1N 互补输出空闲状态TIM1->CR2 |= (1 << 9);//设置CC1S模式为输出 00 TIM1->CCMR1 &= ~(0X03 << 0);//OC1M 设置为PWM1模式 110 TIM1->CCMR1 |= (0X03 << 5);TIM1->CCMR1 &= ~(1 << 4);//CC1NP 互补输出高电平有效TIM1->CCER &= ~(1 << 3);//CC1NE 开启互补输出比较使能TIM1->CCER |= (1 << 2);//CC1P 输出高电平有效TIM1->CCER &= ~(1 << 1);//CC1E开启输出比较使能TIM1->CCER |= (1 << 0);//设置预分频系数为71TIM1->PSC = 71;//设置预装载值为999 TIM1->ARR = 999;//设置CCR1输出比较值 控制占空比TIM1->CCR1 = 0.3 * (TIM1->ARR + 1) - 1;//MOE 开启主输出TIM1->BDTR |= (1 << 15);//AOE 开启刹车失效之后MOE自动恢复TIM1->BDTR |= (1 << 14);//刹车极性高电平有效TIM1->BDTR |= (1 << 13);//开启刹车使能TIM1->BDTR |= (1 << 12);//CKD分频系数设置为4 72M/4 取倒数为Tdts时间 //然后用100 成这个时间为死区延迟时间 5.56us//设置DTG死区延时为100 TIM1->BDTR |= 100;TIM1->EGR |= (1 << 0);//开启GPIOE1时钟RCC->APB2ENR |= (1 << 6);//设置PE8为复用推挽输出GPIOE->CRH |= (0X03 << 0);GPIOE->CRH |= (1 << 3);GPIOE->CRH &= ~(1 << 2);//设置PE9为复用推挽输出GPIOE->CRH |= (0X03 << 4);GPIOE->CRH |= (1 << 7);GPIOE->CRH &= ~(1 << 6);//设置PE15为复用推挽输出GPIOE->CRH |= (0X03 << 28);GPIOE->CRH |= (1 << 31);GPIOE->CRH &= ~(1 << 30);//使能AFIO时钟RCC->APB2ENR |= (1 << 0);//设置TIM1完全重映射 将CH1映射到PE9 CH1N映射到PE8 BKIN映射到PE15上AFIO->MAPR |= (0x03 << 6);//使能计数器TIM1->CR1 |= (1 << 0);
}

注意:配置过程中发现刹车输入使能位和刹车极性位设置无效,但是debug的时候通过断点设置便可以,全速运行就不可以  问题还没有找到,有思路的小伙伴可以私信我。

2、库函数版本

atim.h头文件 

#ifndef __ATIM_H
#define __ATIM_H#include "stm32f1xx.h"
void Advanced_TIM_Init(void);
#endif

 atim.c源文件

#include "./BSP/TIMER/atim.h"TIM_HandleTypeDef htim;void Advanced_TIM_Init(void)
{htim.Instance = TIM1;htim.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV4;htim.Init.CounterMode = TIM_COUNTERMODE_UP;htim.Init.Period = 999;htim.Init.Prescaler = 71;//配置PWM输出HAL_TIM_PWM_Init(&htim);TIM_OC_InitTypeDef sConfig = {0};sConfig.OCIdleState = TIM_OCIDLESTATE_SET;sConfig.OCMode = TIM_OCMODE_PWM1;sConfig.OCNIdleState = TIM_OCNIDLESTATE_RESET;sConfig.OCNPolarity = TIM_OCNPOLARITY_HIGH;sConfig.OCPolarity = TIM_OCPOLARITY_HIGH;sConfig.Pulse = 499;HAL_TIM_PWM_ConfigChannel(&htim,&sConfig,TIM_CHANNEL_1);TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_ENABLE;sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;sBreakDeadTimeConfig.BreakState = TIM_BREAK_ENABLE;sBreakDeadTimeConfig.DeadTime = 100;sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;sBreakDeadTimeConfig.OffStateRunMode=TIM_OSSR_DISABLE;//刹车输入及死区时间配置HAL_TIMEx_ConfigBreakDeadTime(&htim,&sBreakDeadTimeConfig);HAL_TIM_PWM_Start(&htim,TIM_CHANNEL_1);HAL_TIMEx_PWMN_Start(&htim,TIM_CHANNEL_1);
}void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{//开启定时器1时钟__HAL_RCC_TIM1_CLK_ENABLE();//开启GPIOE时钟__HAL_RCC_GPIOE_CLK_ENABLE();GPIO_InitTypeDef GPIO_Init = {0};GPIO_Init.Mode = GPIO_MODE_AF_PP;GPIO_Init.Pin  = GPIO_PIN_8;GPIO_Init.Speed = GPIO_SPEED_FREQ_HIGH;//初始化PE8为复用推挽输出HAL_GPIO_Init(GPIOE, &GPIO_Init);//初始化PE9为复用推挽输出GPIO_Init.Pin  = GPIO_PIN_9;HAL_GPIO_Init(GPIOE, &GPIO_Init);GPIO_Init.Mode = GPIO_MODE_INPUT;GPIO_Init.Pull = GPIO_PULLDOWN;GPIO_Init.Pin  = GPIO_PIN_15;HAL_GPIO_Init(GPIOE, &GPIO_Init);//开启AFIO时钟__HAL_RCC_AFIO_CLK_ENABLE();//开启TIM1完全重映射__HAL_AFIO_REMAP_TIM1_ENABLE();
}

 main.c源文件 

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/TIMER/atim.h"int main(void)
{HAL_Init();                         /* 初始化HAL库 */sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */delay_init(72);                     /* 延时初始化 */led_Init();                         /* LED初始化 */Advanced_TIM_Init();while(1){ LED0(1);LED1(0);delay_ms(500);LED0(0);LED1(1);delay_ms(500);}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

京东广告生成式召回基于 NVIDIA TensorRT-LLM 的推理加速实践

0000 生成式推荐系统优势介绍 推荐系统的主要任务是根据用户的历史行为预测其兴趣点&#xff0c;并向其推荐相应的商品。传统的推荐系统在处理用户请求时&#xff0c;会触发多个召回模块&#xff08;包括热门商品召回、个性化召回、深度召回等&#xff09;&#xff0c;以召回大…

3.React 组件化开发

react&#xff1a;版本 18.2.0node&#xff1a; 版本18.19.1脚手架&#xff1a;版本 5.0.1 一、类组件 (一) 一个干净的脚手架 【1】使用已经被废弃的 CRA (create-react-app) create-react-app 已经被废弃&#xff0c;且目前使用会报错&#xff0c;官方已经不推荐使用&…

51单片机(国信长天)矩阵键盘的基本操作

在CT107D单片机综合训练平台上&#xff0c;首先将J5处的跳帽接到1~2引脚&#xff0c;使按键S4~S19按键组成4X4的矩阵键盘。在扫描按键的过程中&#xff0c;发现有按键触发信号后(不做去抖动)&#xff0c;待按键松开后&#xff0c;在数码管的第一位显示相应的数字:从左至右&…

【AI赋能】蓝耘智算平台实战指南:3步构建企业级DeepSeek智能助手

蓝耘智算平台实战指南&#xff1a;3步构建企业级DeepSeek智能助手 引言&#xff1a;AI大模型时代的算力革命 在2025年全球AI技术峰会上&#xff0c;DeepSeek-R1凭借其开源架构与实时推理能力&#xff0c;成为首个通过图灵测试的中文大模型。该模型在语言理解、跨模态交互等维…

机器学习 - 词袋模型(Bag of Words)实现文本情感分类的详细示例

为了简单直观的理解模型训练&#xff0c;我这里搜集了两个简单的实现文本情感分类的例子&#xff0c;第一个例子基于朴素贝叶斯分类器&#xff0c;第二个例子基于逻辑回归&#xff0c;通过这两个例子&#xff0c;掌握词袋模型&#xff08;Bag of Words&#xff09;实现文本情感…

没有服务器和显卡电脑如何本地化使用deepseek|如何通过API使用满血版deepseek

目录 一、前言二、使用siliconflow硅基流动 API密钥1、注册硅基流动2、创建API密钥3、下载AI客户端4、使用API密钥5、效果演示 三、使用deepseek官方API密钥1、创建API密钥2、使用API密钥3、效果演示 四、总结 一、前言 上篇文章我介绍了如何通过云服务器或者显卡电脑来本地化…

算法学习笔记之贪心算法

导引&#xff08;硕鼠的交易&#xff09; 硕鼠准备了M磅猫粮与看守仓库的猫交易奶酪。 仓库有N个房间&#xff0c;第i个房间有 J[i] 磅奶酪并需要 F[i] 磅猫粮交换&#xff0c;硕鼠可以按比例来交换&#xff0c;不必交换所有的奶酪 计算硕鼠最多能得到多少磅奶酪。 输入M和…

oracle执行grant授权sql被阻塞问题处理

一 问题描述 执行普通的grant授权sql(grant select,update on 表名 to 用户名)好几分钟都没反应&#xff0c;跟被阻塞了似的。 二 问题排查 #排查是否有阻塞 用OEM可以看到阻塞信息&#xff1a; 点‘性能’-‘阻塞会话’&#xff1a; 下面那个会话2958是我执行grant sql的…

SSM仓库物品管理系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码1.用户登录代码&#xff1a;2.保存物品信息代码&#xff1a;3.删除仓库信息代码&#xff1a; 一、项目演示 项目演示地址&#xff1a; 视频地址 二、项目介绍 项目描述&#xff1a;这是一个基于SSM框架开发的仓库…

Deepseek 接入Word处理对话框(隐藏密钥)

硅基流动邀请码&#xff1a;1zNe93Cp 邀请链接&#xff1a;网页链接 亲测deepseek接入word&#xff0c;自由调用对话&#xff0c;看截图有兴趣的复用代码&#xff08;当然也可以自己向deepseek提问&#xff0c;帮助你完成接入&#xff0c;但是提问逻辑不一样给出的答案是千差万…

Docker Compose介绍及安装使用MongoDB数据库详解

在现代容器化应用部署中&#xff0c;Docker Compose是一种非常实用的工具&#xff0c;它允许我们通过一个docker-compose.yml文件来定义和运行多容器应用程序。然而&#xff0c;除了Docker之外&#xff0c;Podman也提供了类似的工具——Podman Compose&#xff0c;它允许我们在…

IntelliJ IDEA Console控制台输出成json的配置方式

【IntelliJ IDEA Console控制台输出成json的配置方式】 1.帮助->查找操作 2.搜索注册表 3.ctrlf 搜索pty 控制台右键 结果

基础入门-HTTP数据包红蓝队研判自定义构造请求方法请求头修改状态码判断

知识点&#xff1a; 1、请求头&返回包-方法&头修改&状态码等 2、数据包分析-红队攻击工具&蓝队流量研判 3、数据包构造-Reqable自定义添加修改请求 一、演示案例-请求头&返回包-方法&头修改&状态码等 数据包 客户端请求Request 请求方法 …

react redux用法学习

参考资料&#xff1a; https://www.bilibili.com/video/BV1ZB4y1Z7o8 https://cn.redux.js.org/tutorials/essentials/part-5-async-logic AI工具&#xff1a;deepseek&#xff0c;通义灵码 第一天 安装相关依赖&#xff1a; 使用redux的中间件&#xff1a; npm i react-redu…

机器学习 - 线性回归(最大后验估计)

最大似然估计的一个缺点是当训练数据比较少时会发生过拟合&#xff0c;估计的参数可能不准确.为了避免过拟合&#xff0c;我们可以给参数加上一些先验知识. 一、先从最大似然估计的一个缺点入手 最大似然估计&#xff08;MLE&#xff09;在处理小样本数据时&#xff0c;容易发…

2025.2.8——二、Confusion1 SSTI模板注入|Jinja2模板

题目来源&#xff1a;攻防世界 Confusion1 目录 一、打开靶机&#xff0c;整理信息 二、解题思路 step 1&#xff1a;查看网页源码信息 step 2&#xff1a;模板注入 step 3&#xff1a;构造payload&#xff0c;验证漏洞 step 4&#xff1a;已确认为SSTI漏洞中的Jinjia2…

Moretl 增量文件采集工具

永久免费: <下载> <使用说明> 用途 定时全量或增量采集工控机,电脑文件或日志. 优势 开箱即用: 解压直接运行.不需额外下载.管理设备: 后台统一管理客户端.无人值守: 客户端自启动,自更新.稳定安全: 架构简单,兼容性好,通过授权控制访问. 架构 技术架构: Asp…

基于STM32的ADS1230驱动例程

自己在练手项目中用到了ADS1230&#xff0c;根据芯片手册自写的驱动代码&#xff0c;已测可用&#xff0c;希望对将要用到ADS1230芯片的人有所帮助。 芯片&#xff1a;STM32系列任意芯片、ADS1230 环境&#xff1a;使用STM32CubeMX配置引脚、KEIL 部分电路&#xff1a; 代码…

HarmonyOS 5.0应用开发——NodeContainer自定义占位节点

【高心星出品】 文章目录 NodeContainer自定义占位节点案例开发步骤全部代码 NodeContainer自定义占位节点 NodeContainer是用来占位的系统组件&#xff0c;主要用于自定义节点以及自定义节点树的显示&#xff0c;支持组件的通用属性&#xff0c;对通用属性的处理请参考默认左…

26~31.ppt

目录 26.北京主要的景点 题目 解析 27.创新产品展示及说明会 题目​ 解析 28.《小企业会计准则》 题目​ 解析 29.学习型社会的学习理念 题目​ 解析 30.小王-产品展示信息 题目​ 解析 31.小王-办公理念-信息工作者的每一天 题目​ 解析 26.北京主要的景点…