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_BDTR的BKE位置1,刹车输入信号极性由BKP位设置
将TIMx_BKIN引脚复用为刹车功能,刹车信号经过极性选择后,来到或门。BI为刹车中断。
使能刹车功能后:由TIMx_BDTR的MOE、OSSI、OSSR位,TIMx_CR2的OISx、OISxN位,TIMx_CCER的CCxE、CCxNE位控制OCx和OCxN输出状态
无论何时,OCx和OCxN输出都不能同时处在有效电平,由硬件强制设置。
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);}
}
相关文章:

STM32的HAL库开发---高级定时器---互补输出带死区实验
一、互补输出简介 互补输出:OCx输出高电平,则互补通道OCxN输出低电平。OCx输出低电平,则互补通道OCxN输出高电平。 带死区控制的互补输出:OCx输出高电平时,则互补通道OCxN过一会再输出输出低电平。这个时间里输出的电…...

Vue07
一、Vuex 概述 目标:明确Vuex是什么,应用场景以及优势 1.是什么 Vuex 是一个 Vue 的 状态管理工具,状态就是数据。 大白话:Vuex 是一个插件,可以管理 Vue 通用的数据 (多组件共享的数据)。例如:购物车数…...

【CXX-Qt】2 CXX-Qt #[cxx_qt::bridge] 宏指南
#[cxx_qt::bridge] 宏是用于在 Rust 中创建一个模块,该模块能够桥接 Rust 和 Qt(通过 C)之间的交互。它允许你将 Rust 类型暴露给 Qt 作为 QObject、Q_SIGNAL、Q_PROPERTY 等,同时也能够将 Qt 的特性和类型绑定到 Rust 中…...

鸿蒙接入支付宝SDK后模拟器无法运行,报错error: install parse native so failed.
鸿蒙项目接入支付宝后,运行提示error: install parse native so failed. 该问题可能由于设备支持的 Abi 类型与 C 工程中的不匹配导致. 官网error: install parse native so failed.错误解决办法 根据官网提示在模块build-profile.json5中添加“x86_64”依然报错 问…...

局域网使用Ollama(Linux)
解决局域网无法连接Ollama服务的问题 在搭建和使用Ollama服务的过程中,可能会遇到局域网内无法连接的情况。经过排查发现,若开启了代理软件,尤其是Hiddify,会导致此问题。这一发现耗费了我数小时的排查时间,希望能给大…...

Deepseek系列从v3到R易背面经版
deepseek v3 base要点 MTP : Multi-Token Prediction 训练时: 1. 把前一个block中input tokens经过embedding layer和transformer block的输出,进入output head之前的内容记为h,与下一个block的input tokens经过embedding layer输出的内容都…...

Redis深入学习
目录 Redis是什么? Redis使用场景 Redis线程模型 Redis执行命令是单线程的为什么还这么快? Redis持久化 Redis 事务 Key 过期策略 Redis 和 mysql 如何保证数据一致? 缓存穿透 缓存击穿 缓存雪崩 Redis是什么? redis是一…...

《从入门到精通:蓝桥杯编程大赛知识点全攻略》(十一)-回文日期、移动距离、日期问题
前言 在这篇博客中,我们将通过模拟的方法来解决三道经典的算法题:回文日期、移动距离和日期问题。这些题目不仅考察了我们的基础编程能力,还挑战了我们对日期处理和数学推理的理解。通过模拟算法,我们能够深入探索每个问题的核心…...

在Uniapp中使用阿里云OSS插件实现文件上传
在开发小程序时,文件上传是一个常见的需求。阿里云OSS(Object Storage Service)是一个强大的云存储服务,可以帮助我们高效地存储和管理文件。本文将介绍如何在Uniapp小程序中使用阿里云OSS插件实现文件上传功能。 1. 准备工作 首…...

9 数据流图
9 数据流图 9.1数据平衡原则 子图缺少处理后的数据操作结果返回前端应用以及后端数据库返回操作结果到数据管理中间件。 9.2解题技巧 实件名 存储名 加工名 数据流...

IDEA查看项目依赖包及其版本
一.IDEA将现有项目转换为Maven项目 在IntelliJ IDEA中,将现有项目转换为Maven项目是一个常见的需求,可以通过几种不同的方法来实现。Maven是一个强大的构建工具,它可以帮助自动化项目的构建过程,管理依赖关系,以及其他许多方面。 添加Maven支持 如果你的项目还没有pom.xm…...

【数据结构】_栈与队列经典算法OJ:栈与队列的互相实现
目录 1. 用队列实现栈 1.1 题目链接及描述 1.2 解题思路 1.3 程序 2. 用栈实现队列 2.1 题目链接及描述 2.2 解题思路 2.3 程序 1. 用队列实现栈 1.1 题目链接及描述 1. 题目链接 : 225. 用队列实现栈 - 力扣(LeetCode) 2. 题目描…...

SAP-ABAP:ROLLBACK WORK使用详解
在SAP ABAP 中,ROLLBACK WORK 语句用于回滚当前事务(LUW,Logical Unit of Work),撤销自上次提交或回滚以来的所有数据库更改。它通常与 COMMIT WORK 配合使用,确保数据一致性。 关键点: 回滚作…...

DeepSeek R1 Distill Llama 70B(免费版)API使用详解
DeepSeek R1 Distill Llama 70B(免费版)API使用详解 在人工智能领域,随着技术的不断进步,各种新的模型和应用如雨后春笋般涌现。今天,我们要为大家介绍的是OpenRouter平台上提供的DeepSeek R1 Distill Llama 70B&…...

如何避免大语言模型中涉及丢番图方程的问题
希尔伯特第十问题是一个著名的数学问题,涉及不定方程(又称为丢番图方程)的可解答性。然而在大模型中,我们希望问题都是确定的可解的,或者说要尽可能的想办法避免不确定的不可解问题。由于丢番图方程问题是不可判定问题(即不存在一个有效的算法能够解决该类问题的所有实例…...

flutter 获取网络图片的尺寸
获取网络图片的尺寸 import dart:async;import package:flutter/widgets.dart;/// Image Util. class ImageUtil {late ImageStreamListener _listener;late ImageStream _imageStream;/// get image width height,load error throw exception.(unit px…...

MySQL主从同步+binlog
一、简介 MySQL内建的复制功能是构建大型,高性能应用程序的基础 通过将MySQL的某一台主机(master)的数据复制到其他主机(slaves)上,并重新执行一遍来执行 复制过程中一台服务器充当主服务器,而…...

实践深度学习:构建一个简单的图像分类器
引言 深度学习在图像识别领域取得了巨大的成功。本文将指导你如何使用深度学习框架来构建一个简单的图像分类器,我们将以Python和TensorFlow为例,展示从数据准备到模型训练的完整流程。 环境准备 在开始之前,请确保你的环境中安装了以下工…...

蔚来C++面试题及参考答案
栈了解吗? 栈在计算机科学中是一种重要的数据结构,在 C++ 编程里有不同层面的体现,分别是数据结构层面和内存管理层面。 从数据结构角度来看,栈遵循后进先出(LIFO)的原则。就像一摞盘子,最后放上去的盘子总是最先被拿走。在 C++ 标准模板库(STL)中,提供了std::stac…...

C# Winform怎么设计串口,客户端和相机控件界面显示
首先我们必须把这个类创建好 INIAPI using System; using System.Text; using System.Runtime.InteropServices;namespace Ini {public class IniAPI{#region INI文件操作/** 针对INI文件的API操作方法,其中的节点(Section)、键(KEY&#x…...

C++字符串相关内容
字符串 字符串,本质上是一个接一个字符的一组字符。字母、数字、符号等。 const char* 字符串名 字符后面会有一个空终止符,为0。 字符串从指针的内存地址开始,然后继续下去,直到它碰到0,然后意识到字符串终止了。 …...

利用二分法进行 SQL 时间盲注
什么是时间盲注? SQL 盲注(Blind SQL Injection)是一种常见的 Web 安全漏洞,其中时间盲注是基于查询延迟的 SQL 注入方式。当服务器不返回可见的错误信息时,我们可以利用 SLEEP() 函数来判断查询结果是否符合预期。 …...

数据库管理-第293期 奇怪的sys.user$授权+(20250210)
数据库管理293期 2025-02-10 数据库管理-第293期 奇怪的sys.user$授权(20250210)1 清空shared pool2 SR反馈总结 数据库管理-第293期 奇怪的sys.user$授权(20250210) 作者:胖头鱼的鱼缸(尹海文)…...

react实例与总结(一)
目录 一、简单认识 1.1、特点 1.2、JSX语法规则 1.3、函数组件和类式组件 1.4、类组件三大属性state、props、refs 1.4.1、state 1.4.2、props 1.4.3、refs 1.5、事件处理 1.6、收集表单数据—非受控组件和受控组件 1.7、高阶函数—函数柯里化 1.8、生命周期—新旧…...

电路研究9.3——合宙Air780EP中的AT开发指南(含TCP 示例)
根据合宙的AT研发推荐, AT指令基本上也简单看完了,这里开始转到AT的开发了。 AT 命令采用标准串口进行数据收发,将以前复杂的设备通讯方式转换成简单的串口编程, 大大简化了产品的硬件设计和软件开发成本,这使得几乎所…...

Qt 数据库SQLite 使用【01】基本功能
1.开发背景 Qt 开发过程中难免需要存储数据,可以选择保存到本地文件,但是查找比较麻烦,所以就有了数据库,主要是方便查找数据,增删改查等操作,而 SqLite 属于数据库中轻量级的存在,适合本地数据…...

stm32小白成长为高手的学习步骤和方法
我们假定大家已经对STM32的书籍或者文档有一定的理解。如不理解,请立即阅读STM32的文档,以获取最基本的知识点。STM32单片机自学教程 这篇博文也是一篇不错的入门教程,初学者可以看看,讲的真心不错。 英文好的同学…...

大模型产品Deepseek(五)、本地安装部署(Docker方式)
DeepSeek 本地部署指南 DeepSeek是一款高效的智能搜索与推荐引擎,除了通过云端API提供服务外,它还支持本地部署,让开发者可以完全控制数据和计算资源。通过本地部署,您可以将DeepSeek集成到内部系统中,在私有环境下运行模型,减少对外部API的依赖,同时提升数据隐私性与响…...

Kafka 的消费offset原来是使用ZK管理,现在新版本是怎么管理的?
目录 基于 ZooKeeper 管理消费 offset 原理 缺点 新版本基于内部主题管理消费 offset 原理 优点 示例代码(Java) 在 Kafka 早期版本中,消费者的消费偏移量(offset)是存储在 ZooKeeper 中的,但由于 ZooKeeper 并不适合高频读写操作,从 Kafka 0.9 版本开始,消费偏…...

基于改进型灰狼优化算法(GWO)的无人机路径规划
内容: 基于改进型灰狼优化算法的无人机轨迹规划 GWO是一种群体智能优化算法,模仿灰狼的社会等级和狩猎行为。原始的GWO有一些局限性,比如容易陷入局部最优,收敛速度慢等,所以改进型的GWO可能通过不同的策略来优化这些…...