艾思控AQMD6008BLS-TE无刷电机驱动使用笔记(配合STM32)

一、介绍

本驱动器使用的电机电流精确检测技术、有感无刷电机自测速、有感无刷电机转动位置检测、再生电流恒电流制动(或称刹车)技术和强大的PID调节技术可地控制电机平稳正反转、换向及制动,输出电流实时调控防止过流,精准控制电机转速和转动位置,电机响应时间短且反冲力小。

二、使用方法

该款无刷电机驱动有多种使用方法,就stm32而言,可以通过输出PWM信号对电机进行调速,也可通过485通讯或CAN通讯与电机驱动进行通讯(电机驱动内部应该也是另外一块32)。项目使用过程中,经导师建议,优先采用485通讯方式。在使用此种通讯方式时,注意设备地址和通讯参数(波特率、奇偶校验等)的设置。

在通过速度控制寄存器进行速度控制时,可以通过0x0042寄存器设定占空比,也可通过0x0043寄存器设定换向频率。另外,在正确配置电机极个数和减速比之后,可以通过0x0034寄存器读取电机的转速。

三、代码

在编写代码的过程中,有参考硬件家园刘工的工程代码,在此表示感谢。

Motor.h

#ifndef __MOTOR_H__
#define __MOTOR_H__#include "MyApplication.h"//定义枚举类型
typedef enum
{M1 = (uint8_t)0x01,M2 = (uint8_t)0x02,
}Motor_Num_t;//定义结构体类型
typedef struct
{uint8_t M1_Addr;uint8_t M2_Addr;FlagStatus_t Motor_Move_State;uint16_t M1_Read_Value;uint16_t M2_Read_Value;void (*Motor_Set_PWM)(uint8_t, float, UART_t*); void (*Motor_Read_Value)(uint8_t, UART_t*);void (*Protocol_Read_Speed)(uint8_t, UART_t*);void (*Motor_PWM_Acc_Buffer)(uint8_t, float, UART_t*);void (*Motor_PWM_Rv_Buffer)(uint8_t, float, UART_t*);void (*Motor_Brake)(uint8_t, UART_t*);
} Motor_t;/* extern variables-----------------------------------------------------------*/
extern Motor_t  Motor;
/* extern function prototypes-------------------------------------------------*/#endif
/********************************************************End Of File
********************************************************/

Motor.c

/* Includes ------------------------------------------------------------------*/
#include "MyApplication.h"/* Private define-------------------------------------------------------------*/
#define FunctionCode_Read_Motor 		(uint8_t)0x03
#define FunctionCode_Write_Motor 	(uint8_t)0x06
#define UART3_Read_Speed_LENGTH		(uint8_t)7/* Private variables----------------------------------------------------------*/
static void Motor_Set_PWM(uint8_t, float, UART_t*); 
static void Motor_Read_Value(uint8_t, UART_t*);
static void Protocol_Read_Speed(uint8_t, UART_t*);
static void Motor_PWM_Acc_Buffer(uint8_t, float, UART_t*);
static void Motor_PWM_Rv_Buffer(uint8_t, float, UART_t*);
static void Motor_Brake(uint8_t, UART_t*); /* Public variables-----------------------------------------------------------*/
Motor_t Motor = 
{0x01, 0x02,FALSE,0,0,Motor_Set_PWM,Motor_Read_Value,Protocol_Read_Speed,Motor_PWM_Acc_Buffer,Motor_PWM_Rv_Buffer,Motor_Brake
};/* Private function prototypes------------------------------------------------*/      /** @name   Motor_Set_PWM* @brief  设置驱动PWM占空比* @param  Motor_Num -> 编号, pwm -> 占空比, UART -> 串口* @retval None      
*/
static void Motor_Set_PWM(uint8_t Motor_Num, float pwm, UART_t* UART)
{UART_t* const COM = UART;uint16_t SpeedTemp = (uint16_t)(pwm * 10);//条件选择语句switch(Motor_Num){	case M1: {*(COM->pucSend_Buffer + 0) = Motor.M1_Addr;*(COM->pucSend_Buffer + 1) = FunctionCode_Write_Motor;*(COM->pucSend_Buffer + 2) = 0x00;*(COM->pucSend_Buffer + 3) = 0x42;*(COM->pucSend_Buffer + 4) = (uint8_t)(SpeedTemp >> 8);*(COM->pucSend_Buffer + 5) = (uint8_t)SpeedTemp;CRC_16.CRC_Value = CRC_16.CRC_Check(COM->pucSend_Buffer, 6);CRC_16.CRC_H     = (uint8_t)(CRC_16.CRC_Value >> 8);CRC_16.CRC_L     = (uint8_t)CRC_16.CRC_Value;*(COM->pucSend_Buffer + 6) = CRC_16.CRC_H;*(COM->pucSend_Buffer + 7) = CRC_16.CRC_L;UART3.SendArray(COM->pucSend_Buffer, 8);break;}case M2:{*(COM->pucSend_Buffer + 0) = Motor.M2_Addr;*(COM->pucSend_Buffer + 1) = FunctionCode_Write_Motor;*(COM->pucSend_Buffer + 2) = 0x00;*(COM->pucSend_Buffer + 3) = 0x42;*(COM->pucSend_Buffer + 4) = (uint8_t)(SpeedTemp >> 8);*(COM->pucSend_Buffer + 5) = (uint8_t)SpeedTemp;CRC_16.CRC_Value = CRC_16.CRC_Check(COM->pucSend_Buffer, 6);CRC_16.CRC_H     = (uint8_t)(CRC_16.CRC_Value >> 8);CRC_16.CRC_L     = (uint8_t)CRC_16.CRC_Value;*(COM->pucSend_Buffer + 6) = CRC_16.CRC_H;*(COM->pucSend_Buffer + 7) = CRC_16.CRC_L;UART3.SendArray(COM->pucSend_Buffer, 8);break;}default: System.Assert_Failed();}HAL_Delay(30);
}/** @name   Motor_Read_Speed* @brief  通过驱动读取转速* @param  UART -> 串口* @retval None      
*/
static void Motor_Read_Value(uint8_t Motor_Num, UART_t* UART)
{UART_t* const  COM = UART;//条件选择语句switch(Motor_Num){case M1: {*(COM->pucSend_Buffer + 0) = Motor.M1_Addr;*(COM->pucSend_Buffer + 1) = FunctionCode_Read_Motor;*(COM->pucSend_Buffer + 2) = 0x00;*(COM->pucSend_Buffer + 3) = 0x34;*(COM->pucSend_Buffer + 4) = 0x00;*(COM->pucSend_Buffer + 5) = 0x01;CRC_16.CRC_Value = CRC_16.CRC_Check(COM->pucSend_Buffer, 6);CRC_16.CRC_H     = (uint8_t)(CRC_16.CRC_Value >> 8);CRC_16.CRC_L     = (uint8_t)CRC_16.CRC_Value;*(COM->pucSend_Buffer + 6) = CRC_16.CRC_H;*(COM->pucSend_Buffer + 7) = CRC_16.CRC_L;Modbus.Sensor_To_Read_Flag = 1;UART3.SendArray(COM->pucSend_Buffer, 8);break;			}case M2: {*(COM->pucSend_Buffer + 0) = Motor.M2_Addr;*(COM->pucSend_Buffer + 1) = FunctionCode_Read_Motor;*(COM->pucSend_Buffer + 2) = 0x00;*(COM->pucSend_Buffer + 3) = 0x34;*(COM->pucSend_Buffer + 4) = 0x00;*(COM->pucSend_Buffer + 5) = 0x01;CRC_16.CRC_Value = CRC_16.CRC_Check(COM->pucSend_Buffer, 6);CRC_16.CRC_H     = (uint8_t)(CRC_16.CRC_Value >> 8);CRC_16.CRC_L     = (uint8_t)CRC_16.CRC_Value;*(COM->pucSend_Buffer + 6) = CRC_16.CRC_H;*(COM->pucSend_Buffer + 7) = CRC_16.CRC_L;Modbus.Sensor_To_Read_Flag = 2;UART3.SendArray(COM->pucSend_Buffer, 8);break;			}	default: System.Assert_Failed();}HAL_Delay(30);
}/** @name   Protocol_Read_Speed* @brief  分析串口值* @param  UART_t* -> 串口* @retval None      
*/
static void Protocol_Read_Speed(uint8_t Motor_Num, UART_t* UART)
{UART_t* const  COM = UART;uint8_t i = 0, Index = 0;//串口3停止DMA接收HAL_UART_DMAStop(&huart3);switch(Motor_Num){case M1:{//过滤干扰数据,首字节为modbus地址,共8字节for(i = 0; i < UART3_Rec_LENGTH; i++){//检测键值起始数据Modbus.Addrif(Index == 0){if(*(COM->pucRec_Buffer+i) != Motor.M1_Addr)continue;}*(COM->pucRec_Buffer + Index) = *(COM->pucRec_Buffer + i);//已读取7个字节if(Index == UART3_Read_Speed_LENGTH - 1)break;Index++;}//计算CRC-16CRC_16.CRC_Value   = CRC_16.CRC_Check(COM->pucRec_Buffer, 5); //计算CRC值CRC_16.CRC_H       = (uint8_t)(CRC_16.CRC_Value >> 8);CRC_16.CRC_L       = (uint8_t)CRC_16.CRC_Value;	//校验CRC-16if(((*(COM->pucRec_Buffer + 5) == CRC_16.CRC_L) && (*(COM->pucRec_Buffer + 6) == CRC_16.CRC_H))||((*(COM->pucRec_Buffer + 5) == CRC_16.CRC_H) && (*(COM->pucRec_Buffer + 6) == CRC_16.CRC_L))){//校验地址if(((*(COM->pucRec_Buffer + 0)) == Motor.M1_Addr) && ((*(COM->pucRec_Buffer + 1)) == FunctionCode_Read_Motor) && ((*(COM->pucRec_Buffer + 2)) == 0x02)){Motor.M1_Read_Value = ((*(COM->pucRec_Buffer + 3)) << 8) | ((*(COM->pucRec_Buffer + 4)));}}	break;}case M2:{//过滤干扰数据,首字节为modbus地址,共8字节for(i = 0; i < UART3_Rec_LENGTH; i++){//检测键值起始数据Modbus.Addrif(Index == 0){if(*(COM->pucRec_Buffer+i) != Motor.M2_Addr)continue;}*(COM->pucRec_Buffer + Index) = *(COM->pucRec_Buffer + i);//已读取7个字节if(Index == UART3_Read_Speed_LENGTH - 1)break;Index++;}//计算CRC-16CRC_16.CRC_Value   = CRC_16.CRC_Check(COM->pucRec_Buffer, 5); //计算CRC值CRC_16.CRC_H       = (uint8_t)(CRC_16.CRC_Value >> 8);CRC_16.CRC_L       = (uint8_t)CRC_16.CRC_Value;	//校验CRC-16if(((*(COM->pucRec_Buffer + 5) == CRC_16.CRC_L) && (*(COM->pucRec_Buffer + 6) == CRC_16.CRC_H))||((*(COM->pucRec_Buffer + 5) == CRC_16.CRC_H) && (*(COM->pucRec_Buffer + 6) == CRC_16.CRC_L))){//校验地址if(((*(COM->pucRec_Buffer + 0)) == Motor.M2_Addr) && ((*(COM->pucRec_Buffer + 1)) == FunctionCode_Read_Motor) && ((*(COM->pucRec_Buffer + 2)) == 0x02)){Motor.M2_Read_Value = ((*(COM->pucRec_Buffer + 3)) << 8) | ((*(COM->pucRec_Buffer + 4)));}}				break;}default: break;}//清缓存for(i = 0; i < UART3_Rec_LENGTH; i++){*(COM->pucRec_Buffer + i) = 0x00;}}/** @name   Motor_PWM_Acc_Buffer* @brief  电机PWM加速缓冲* @param  Motor_Num -> 编号, time -> 时间, UART -> 串口* @retval None      
*/
static void Motor_PWM_Acc_Buffer(uint8_t Motor_Num, float time, UART_t* UART)
{UART_t* const  COM = UART;uint8_t SpeedTemp = (uint8_t)(time * 10);//条件选择语句switch(Motor_Num){	case M1: {*(COM->pucSend_Buffer + 0) = Motor.M1_Addr;*(COM->pucSend_Buffer + 1) = FunctionCode_Write_Motor;*(COM->pucSend_Buffer + 2) = 0x00;*(COM->pucSend_Buffer + 3) = 0x60;*(COM->pucSend_Buffer + 4) = 0x00;*(COM->pucSend_Buffer + 5) = SpeedTemp;CRC_16.CRC_Value = CRC_16.CRC_Check(COM->pucSend_Buffer, 6);CRC_16.CRC_H     = (uint8_t)(CRC_16.CRC_Value >> 8);CRC_16.CRC_L     = (uint8_t)CRC_16.CRC_Value;*(COM->pucSend_Buffer + 6) = CRC_16.CRC_H;*(COM->pucSend_Buffer + 7) = CRC_16.CRC_L;UART3.SendArray(COM->pucSend_Buffer, 8);break;}case M2:{*(COM->pucSend_Buffer + 0) = Motor.M2_Addr;*(COM->pucSend_Buffer + 1) = FunctionCode_Write_Motor;*(COM->pucSend_Buffer + 2) = 0x00;*(COM->pucSend_Buffer + 3) = 0x60;*(COM->pucSend_Buffer + 4) = 0x00;*(COM->pucSend_Buffer + 5) = SpeedTemp;CRC_16.CRC_Value = CRC_16.CRC_Check(COM->pucSend_Buffer, 6);CRC_16.CRC_H     = (uint8_t)(CRC_16.CRC_Value >> 8);CRC_16.CRC_L     = (uint8_t)CRC_16.CRC_Value;*(COM->pucSend_Buffer + 6) = CRC_16.CRC_H;*(COM->pucSend_Buffer + 7) = CRC_16.CRC_L;UART3.SendArray(COM->pucSend_Buffer, 8);break;}default: System.Assert_Failed();}HAL_Delay(30);	
}/** @name   Motor_PWM_Rv_Buffer* @brief  电机PWM减速缓冲* @param  Motor_Num -> 编号, time -> 时间, UART -> 串口* @retval None      
*/
static void Motor_PWM_Rv_Buffer(uint8_t Motor_Num, float time, UART_t* UART)
{UART_t* const  COM = UART;uint8_t SpeedTemp = (uint8_t)(time * 10);//条件选择语句switch(Motor_Num){	case M1: {*(COM->pucSend_Buffer + 0) = Motor.M1_Addr;*(COM->pucSend_Buffer + 1) = FunctionCode_Write_Motor;*(COM->pucSend_Buffer + 2) = 0x00;*(COM->pucSend_Buffer + 3) = 0x51;*(COM->pucSend_Buffer + 4) = 0x00;*(COM->pucSend_Buffer + 5) = SpeedTemp;CRC_16.CRC_Value = CRC_16.CRC_Check(COM->pucSend_Buffer, 6);CRC_16.CRC_H     = (uint8_t)(CRC_16.CRC_Value >> 8);CRC_16.CRC_L     = (uint8_t)CRC_16.CRC_Value;*(COM->pucSend_Buffer + 6) = CRC_16.CRC_H;*(COM->pucSend_Buffer + 7) = CRC_16.CRC_L;UART3.SendArray(COM->pucSend_Buffer, 8);break;}case M2:{*(COM->pucSend_Buffer + 0) = Motor.M2_Addr;*(COM->pucSend_Buffer + 1) = FunctionCode_Write_Motor;*(COM->pucSend_Buffer + 2) = 0x00;*(COM->pucSend_Buffer + 3) = 0x51;*(COM->pucSend_Buffer + 4) = 0x00;*(COM->pucSend_Buffer + 5) = SpeedTemp;CRC_16.CRC_Value = CRC_16.CRC_Check(COM->pucSend_Buffer, 6);CRC_16.CRC_H     = (uint8_t)(CRC_16.CRC_Value >> 8);CRC_16.CRC_L     = (uint8_t)CRC_16.CRC_Value;*(COM->pucSend_Buffer + 6) = CRC_16.CRC_H;*(COM->pucSend_Buffer + 7) = CRC_16.CRC_L;UART3.SendArray(COM->pucSend_Buffer, 8);break;}default: System.Assert_Failed();}HAL_Delay(30);	
}/** @name   Motor_Brake* @brief  电机刹车* @param  Motor_Num -> 编号, UART -> 串口* @retval None      
*/
static void Motor_Brake(uint8_t Motor_Num, UART_t* UART)
{UART_t* const  COM = UART;//条件选择语句switch(Motor_Num){	case M1: {*(COM->pucSend_Buffer + 0) = Motor.M1_Addr;*(COM->pucSend_Buffer + 1) = FunctionCode_Write_Motor;*(COM->pucSend_Buffer + 2) = 0x00;*(COM->pucSend_Buffer + 3) = 0x40;*(COM->pucSend_Buffer + 4) = 0x00;*(COM->pucSend_Buffer + 5) = 0x01;CRC_16.CRC_Value = CRC_16.CRC_Check(COM->pucSend_Buffer, 6);CRC_16.CRC_H     = (uint8_t)(CRC_16.CRC_Value >> 8);CRC_16.CRC_L     = (uint8_t)CRC_16.CRC_Value;*(COM->pucSend_Buffer + 6) = CRC_16.CRC_H;*(COM->pucSend_Buffer + 7) = CRC_16.CRC_L;UART3.SendArray(COM->pucSend_Buffer, 8);break;}case M2:{*(COM->pucSend_Buffer + 0) = Motor.M2_Addr;*(COM->pucSend_Buffer + 1) = FunctionCode_Write_Motor;*(COM->pucSend_Buffer + 2) = 0x00;*(COM->pucSend_Buffer + 3) = 0x40;*(COM->pucSend_Buffer + 4) = 0x00;*(COM->pucSend_Buffer + 5) = 0x01;CRC_16.CRC_Value = CRC_16.CRC_Check(COM->pucSend_Buffer, 6);CRC_16.CRC_H     = (uint8_t)(CRC_16.CRC_Value >> 8);CRC_16.CRC_L     = (uint8_t)CRC_16.CRC_Value;*(COM->pucSend_Buffer + 6) = CRC_16.CRC_H;*(COM->pucSend_Buffer + 7) = CRC_16.CRC_L;UART3.SendArray(COM->pucSend_Buffer, 8);break;}default: System.Assert_Failed();}HAL_Delay(30);	
}/********************************************************End Of File
********************************************************/

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

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

相关文章

GC2804——GC2803 的升级,12V H桥驱动,8 个NPN达林顿晶体管,采用SSOP24 封装,应用于安防步进电机驱动产品上

GC2804 是 GC2803 的升级&#xff0c;在内部集成了 8 个 NPN 达林顿晶体管连接阵列的基础上&#xff0c;又集成了一路 12V 的 H 桥驱动。8 个 NPN 达林顿阵列用来驱动高压的步进电机&#xff0c;H 桥驱动可以用来驱动 IR-CUT&#xff0c;此芯片专用于安防摄像头系统方案。该 GC…

十分钟部署清华 ChatGLM-6B,实测效果超预期(Linux版)

前段时间&#xff0c;清华公布了中英双语对话模型 ChatGLM-6B&#xff0c;具有60亿的参数&#xff0c;初具问答和对话功能。 最&#xff01;最&#xff01;最重要的是它能够支持私有化部署&#xff0c;大部分实验室的服务器基本上都能跑起来。因为条件特殊&#xff0c;实验室网…

从零学Java 集合概述

Java 集合概述 文章目录 Java 集合概述1 什么是集合?2 Collection体系集合2.1 Collection父接口2.1.1 常用方法2.1.2 Iterator 接口 1 什么是集合? 概念&#xff1a;对象的容器&#xff0c;定义了对多个对象进行操作的常用方法&#xff1b;可实现数组的功能。 和数组区别&…

Logo设计神器:适合新手的简易操作软件,快速入门!

标志设计软件在品牌营销和企业识别中发挥着重要作用。本文将对10款知名标志设计软件进行横向评价&#xff0c;从不同维度评价其功能、易用性、创意和适用性&#xff0c;帮助您选择最适合您需求的标志设计软件。 1.即时设计 推荐指数&#xff1a;★★★★★ 即时设计是一款功…

springboot 2.7 oauth server配置源码走读一

springboot 2.7 oauth server配置源码走读 入口&#xff1a; 上述截图中的方法签名和OAuth2AuthorizationServerConfiguration类中的一个方法一样&#xff0c;只不过我们自己的配置类优先级比spring中的配置类低&#xff0c;算是配置覆盖&#xff0c;看下图所示&#xff1a; …

阿里云国际服务器设置安全防护程序

阿里云云服务器&#xff08;ECS&#xff09;提供弹性、安全、高性能、高性价比的虚拟云服务器&#xff0c;满足您的所有需求。立即在这里免费注册&#xff01; 常见 Web 应用程序 请勿对 Web 服务控制台&#xff08;如 WDCP、TOMCAT、Apache、Nginx、Jekins、PHPMyAdmin、Web…

JavaScript数组sort()对负数排序的陷阱

前言 想着好久没去力扣刷题了&#xff0c;刚好手上的需求也差不多了&#xff0c;就去看了看。看到一个难度级别为困难的题&#xff0c;看到这个题想着直接使用JS现成的方法&#xff0c;先concat再sort。再取中间值不就实现了吗。是不是你们也这么想&#xff0c;哈哈哈。 就是…

11 个 Python全栈开发工具集

前言 以下是专注于全栈开发不同方面的 Python 库;有些专注于 Web 应用程序开发&#xff0c;有些专注于后端&#xff0c;而另一些则两者兼而有之。 1. Taipy Taipy 是一个开源的 Python 库&#xff0c;用于构建生产就绪的应用程序前端和后端。 它旨在加快应用程序开发&#xf…

2024--Django平台开发-Django知识点(五)

day05 django知识点 今日概要&#xff1a; 中间件 【使用】【源码】cookie 【使用】【源码 - Django底层请求本质】session【使用】【源码 - 数据库请求周期中间件】 1.中间件 1.1 使用 编写类&#xff0c;在类型定义&#xff1a;process_request、process_view、process_…

【C++】STL 算法 ⑨ ( 预定义函数对象示例 - 将容器元素从大到小排序 | sort 排序算法 | greater<T> 预定义函数对象 )

文章目录 一、预定义函数对象示例 - 将容器元素从大到小排序1、sort 排序算法2、greater<T> 预定义函数对象 二、代码示例 - 预定义函数对象1、代码示例2、执行结果 一、预定义函数对象示例 - 将容器元素从大到小排序 1、sort 排序算法 C 标准模板库 ( STL , Standard Te…

离散数学-二元关系

4.1关系的概念 1)序偶及n元有序组 由两个个体x和y&#xff0c;按照一定顺序排序成的、有序数组称为有序偶或有序对、二元有序组&#xff0c; 记作<x&#xff0c;y>&#xff0c;其中x是第一分量&#xff0c;y是第二分量。 相等有序偶&#xff1a;第一分量和第二分量分…

游戏开发中,你的游戏图片压缩格式使用ASTC了吗

文章目录 ASTC原理&#xff1a;使用要求 ASTC&#xff08;Adaptive Scalable Texture Compression&#xff0c;自适应可伸缩纹理压缩&#xff09;是一种高级的纹理压缩技术&#xff0c;由ARM公司开发并推广。它在图形处理领域中因其出色的压缩效率和灵活性而受到广泛关注。 AST…

前端国际化之痛点(二):多包多库场景下联动多语言

前言 VoerkaI18n是一款非常优秀的前端国际化解决方案&#xff0c;其开发的出发点是为了解决现存多语言的一些痛点,接下来几篇文章将分别进行分析。 前端国际化之痛点(一)&#xff1a;让人头疼的词条Key前端国际化之痛点(二)&#xff1a;多包多库场景下联动多语言前端国际化之…

Jetson Orin AGX 64GB更新 Jetpack6.0

Jetson Orin AGX 64GB更新 Jetpack6.0 注意&#xff1a; 1&#xff0c;如果你要向我一样为AGX更新Jetpack6.0的话&#xff0c;它还要求你的ubuntu版本必须是20.04 或22.04 2&#xff0c;安装完SDKmanager后&#xff0c;然后选择对应的设备&#xff0c;根据个人选择勾选是否安装…

【Mysql】InnoDB 引擎中的页目录

一、页目录和槽 现在知道记录在页中按照主键大小顺序串成了单链表。 那么我使用主键查询的时候&#xff0c;最顺其自然的办法肯定是从第一条记录&#xff0c;也就是 Infrimum 记录开始&#xff0c;一直向后找&#xff0c;只要存在总会找到。这种在数据量少的时候还好说&#x…

四、K8S-Deployment(无状态服务)

目录 一、引入Deployment 二、Deployment资源清单 三、Deployment支持的功能 1、扩缩容 1、通过命令行方式修改 2 、在线编辑yaml文件方式修改 2、镜像更新 1、重建更新 2、滚动更新 3、金丝雀发布&#xff08;灰度更新&#xff09; [rootk8s-master-1 ~]# kubectl g…

centos用yum安装mysql详细教程

1 查询安装mysql的yum源,命令如下 ls /etc/yum.repos.d/ -l 界面如下图所示&#xff0c;未显示mysql的安装源 2 安装mysql相关的yum源,例如&#xff1a; 例如&#xff1a;rpm -ivh mysql57-community-release-el7.rpm 要注意 mysql的版本和系统的版本匹配 mysql57-communi…

【高等数学之泰勒公式】

一、从零开始 1.1、泰勒中值定理1 什么是泰勒公式?我们先看看权威解读: 那么我们从古至今到底是如何创造出泰勒公式的呢? 由上图可知&#xff0c;任一无穷小数均可以表示成用一系列数字的求和而得出的结果&#xff0c;我们称之为“无穷算法”。 那么同理我们想对任一曲线来…

Qt/QML编程学习之心得:hicar手机投屏到车机中控的实现(32)

hicar,是华为推出的一款手机APP,有百度地图、华为音乐,更多应用中还有很多对应手机上装在的其他APP,都可以在这个里面打开使用,对开车的司机非常友好。但它不仅仅是用在手机上,它还可以投屏到车机中控上,这是比较神奇的一点。 HiCar本质上是一套智能投屏系统,理论上所有…

springboot 企业微信 网页授权

html 引入jquery $(function () {// alert("JQ onready");// 当前企业的 corp_idconst corp_id xxxxxx;// 重定向 URL → 最终打开的画面地址&#xff0c;域名是在企业微信上配置好的域名const redirect_uri encodeURI(http://xxxxx.cn);//企业的agentId 每个应用都…