基于STM32F103C8T6的同步电机驱动-ADC采样与基于MT6701的角度获取

news2024/10/5 14:02:15

基于STM32F103C8T6的同步电机驱动-ADC采样与基于MT6701的角度获取

本系列文章:

  1. 基于STM32F103C8T6的同步电机驱动-CubeMX配置与IQmath调用
  2. 基于STM32F103C8T6的同步电机驱动-PWM驱动代码以及SVPWM的实现
  3. 基于STM32F103C8T6的同步电机驱动-ADC采样与基于MT6701的角度获取

一、ADC采样与电流电压计算相关代码编写

头文件、宏定义、变量定义等

/****file:main.c*****/
//Include Header Files
#include "main.h"
#include "adc.h"
#include "can.h"
#include "i2c.h"
#include "spi.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"
#include "stdio.h"
#include "IQmathlib.h"
//常用数学值定义
#define pi      3.14159f                 //pi
#define pi_2    6.28318f                 //2*pi
#define pi_23   2.094f                   //2*pi/3
#define pi_180  0.01745f                 //2*pi/360
#define sqrt3   1.73205f                 //sqrt(3)
#define sqrt3_2 0.86603f                 //sqrt(3)/2
#define sqrt23  0.81649f                //sqrt(2/3)
#define sqrt24  0.70710f                 //sqrt(2/4)
//ADC相关参数(选用CC6903电流采样芯片)
uint16_t ADC_Value[4]={0};	//存储ADC采样值,范围为0-4095
#define K_1       0.00081f          //ADC电流计算中:3.3/4096
#define K_2       7.57576f         //132mv/A:1000/132
#define K_3       0.132f           //1A/132mv:132/1000
//电流相关参数
_iq i_a ;_iq i_b ;_iq i_c ;	//三相电流值
_iq i_alpha ; _iq i_beta ; 	//两相静止坐标电流值
_iq i_d 	; _iq i_q ; 	//两相旋转坐标电流值
_iq i_d_lpf 	; _iq i_q_lpf ; 	//两相旋转坐标电流值
//电压相关参数
_iq u_a ;_iq u_b ;_iq u_c ;	//三相电压值
_iq u_alpha ; _iq u_beta ; 	//两相静止坐标电压值
_iq u_d 	; _iq u_q ; 	//两相旋转坐标电压值
_iq u_dc_now;
_iq u_ref;
//角度相关参数
int32_t now_angle=0;		//SPI获取的编码器原值,now_theta = now_angle*360/16384
int32_t now_angle_offcet=377;//编码器原值与电子角度0度之间的偏移值
_iq now_theta_M ;				//当前机械角度值,范围为0-360°
_iq last_theta_M ;		//上一周期机械角度值,范围为0-360°
_iq now_theta_E ;			//当前电子角度值,范围为0-360°
_iq now_radian;				//当前弧度值,范围为0-2*pi,now_radian = now_theta *2pi/360 ;IQ格式的三角函数计算需要弧度值。

TIM4中断回调函数,即驱动控制算法运行函数

//TIM4的中断回调函数
void  HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim == &htim4)
	{
		//中断进来先改变占空比,此时占空比为上一周期计算得到的值
		__HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_1, PWM1_PULSE);
		__HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_2, PWM2_PULSE);
		__HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_3, PWM3_PULSE);		
		//在此后面加入电机驱动相关代码
		//电流电压ADC采样与计算
		//获取四路ADC采样值,其中 AD0 = ADC_Value[1] ;AD1 = ADC_Value[2] ;AD2 = ADC_Value[3] ;AD3 = ADC_Value[0]
		get_ADCvalue();
		//计算相电流、母线电压、母线电流值
		i_a = _IQmpy(_IQmpy(_IQ(ADC_Value[2]), _IQ(K_1)) - _IQ(1.65), _IQ(K_2)) ;
		i_b = _IQmpy(_IQmpy(_IQ(ADC_Value[3]), _IQ(K_1)) - _IQ(1.65), _IQ(K_2)) ;
		i_c = -i_a - i_b;
		i_dc_now = _IQmpy(_IQmpy(_IQ(ADC_Value[0]), _IQ(K_1)) - _IQ(1.65), _IQ(K_2));
		u_dc_now = _IQmpy( _IQ(ADC_Value[1]) , _IQ(0.00793)) ;
		//CLARK、PARK变换
		i_alpha = _IQmpy((i_a - _IQmpy(_IQ(0.5), i_b) - _IQmpy(_IQ(0.5), i_c)), _IQ(K_park));
		i_beta = _IQmpy((_IQmpy(_IQ(sqrt3_2), i_b) - _IQmpy(_IQ(sqrt3_2), i_c)), _IQ(K_park));		
		i_d     = _IQmpy( _IQcos(now_radian) , i_alpha ) +_IQmpy( _IQsin(now_radian) , i_beta );
        i_q     = _IQmpy( -_IQsin(now_radian) , i_alpha ) +_IQmpy( _IQcos(now_radian) , i_beta );		
		//编码器获取角度与速度
		//转速PI控制器
		//电流PI控制器
		//SVPWM
		U1 = u_beta;
		U2 = _IQmpy( _IQ(sqrt3_2) , u_alpha ) - _IQmpy(_IQ(0.5) , u_beta);
		U3 = _IQmpy( _IQ(-sqrt3_2) , u_alpha ) - _IQmpy(_IQ(0.5) , u_beta);		
		if(U1>0){A=1;} else{A=0;}
		if(U2>0){B=1;} else{B=0;}
		if(U3>0){C=1;} else{C=0;}
		N=A+2*B+4*C;
		//对应扇区   //算T时不乘以Ts 算占空比时不除Ts,相互抵消 
		switch (N)
		{
		case 3://第一扇区 0-4-6-7-6-4-0
			T4 = _IQmpy( _IQ(K) ,U2  );
			T6 = _IQmpy( _IQ(K) ,U1  );
			T0 = _IQmpy( _IQ(0.5) , _IQ(1.0)-T4-T6 ); 
			T7 = T0;
			T1 = _IQ(0);T2 =_IQ(0);T3 =_IQ(0);T5 =_IQ(0);
			duty_ratio1 = T4 + T6 + T7;
			duty_ratio2 = T6 + T7;
			duty_ratio3 = T7;
			break;
		case 1://第二扇区 0-2-6-7-6-2-0
			T2 = _IQmpy( _IQ(-K) ,U2  );
			T6 = _IQmpy( _IQ(-K) ,U3  );
			T0 = _IQmpy( _IQ(0.5) , _IQ(1.0)-T2-T6 ); 
			T7 = T0;
			T1 = _IQ(0);T3 =_IQ(0);T4 =_IQ(0);T5 =_IQ(0);
			duty_ratio1 = T6 + T7;
			duty_ratio2 = T2 + T6 + T7;
			duty_ratio3 = T7;
			break;
		case 5://第三扇区 0-2-3-7-3-2-0
			T2 = _IQmpy( _IQ(K) ,U1  );
			T3 = _IQmpy( _IQ(K) ,U3  );
			T0 = _IQmpy( _IQ(0.5) , _IQ(1.0)-T2-T3 ); 
			T7 = T0;
			T1 = _IQ(0);T6 =_IQ(0);T4 =_IQ(0);T5 =_IQ(0);
			duty_ratio1 = T7;
			duty_ratio2 = T2 + T3 + T7;
			duty_ratio3 = T3 + T7;
			break;
		case 4://第四扇区 0-1-3-7-3-2-0
			T1 = _IQmpy( _IQ(-K) ,U1  );
			T3 = _IQmpy( _IQ(-K) ,U2  );
			T0 = _IQmpy( _IQ(0.5) , _IQ(1.0)-T1-T3 ); 
			T7 = T0;
			T2 = _IQ(0);T6 =_IQ(0);T4 =_IQ(0);T5 =_IQ(0);
			duty_ratio1 = T7;
			duty_ratio2 = T3 + T7;
			duty_ratio3 = T1 + T3 + T7;
			break;          
		case 6://第五扇区 0-1-5-7-5-1-0
			T1 = _IQmpy( _IQ(K) ,U3  );
			T5 = _IQmpy( _IQ(K) ,U2  );
			T0 = _IQmpy( _IQ(0.5) , _IQ(1.0)-T1-T5 ); 
			T7 = T0;
			T2 = _IQ(0);T6 =_IQ(0);T4 =_IQ(0);T3 =_IQ(0);
			duty_ratio1 = T5 + T7;
			duty_ratio2 = T7;
			duty_ratio3 = T1 + T5 + T7;
			break;          
		case 2://第六扇区 0-4-5-7-5-4-0
			T4 = _IQmpy( _IQ(-K) ,U3  );
			T5 = _IQmpy( _IQ(-K) ,U1  );
			T0 = _IQmpy( _IQ(0.5) , _IQ(1.0)-T4-T5 ); 
			T7 = T0;
			T2 = _IQ(0);T6 =_IQ(0);T1 =_IQ(0);T3 =_IQ(0);
			duty_ratio1 = T4 + T5 + T7;
			duty_ratio2 = T7;
			duty_ratio3 = T5 + T7;
			break;
			   
		default:
			break;
		}			
		//计算占空比值
		PWM1_PULSE = 400*_IQtoF(duty_ratio1);
		PWM2_PULSE = 400*_IQtoF(duty_ratio2);
		PWM3_PULSE = 400*_IQtoF(duty_ratio3);		
		//串口信息打印
	}
}
//其中函数get_ADCvalue();
void get_ADCvalue(void)
{
	for(int i=0;i<4;i++)
	{
		HAL_ADC_Start(&hadc1);
		ADC_Value[i]= HAL_ADC_GetValue(&hadc1);
		
	}
}

二、ADC采样与电流电压计算相关代码编写

TIM4中断回调函数,即驱动控制算法运行函数

//TIM4的中断回调函数
void  HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim == &htim4)
	{
		//中断进来先改变占空比,此时占空比为上一周期计算得到的值
		__HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_1, PWM1_PULSE);
		__HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_2, PWM2_PULSE);
		__HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_3, PWM3_PULSE);		
		//在此后面加入电机驱动相关代码
		//电流电压ADC采样与计算
		//获取四路ADC采样值,其中 AD0 = ADC_Value[1] ;AD1 = ADC_Value[2] ;AD2 = ADC_Value[3] ;AD3 = ADC_Value[0]
		get_ADCvalue();
		//计算相电流、母线电压、母线电流值
		i_a = _IQmpy(_IQmpy(_IQ(ADC_Value[2]), _IQ(K_1)) - _IQ(1.65), _IQ(K_2)) ;
		i_b = _IQmpy(_IQmpy(_IQ(ADC_Value[3]), _IQ(K_1)) - _IQ(1.65), _IQ(K_2)) ;
		i_c = -i_a - i_b;
		i_dc_now = _IQmpy(_IQmpy(_IQ(ADC_Value[0]), _IQ(K_1)) - _IQ(1.65), _IQ(K_2));
		u_dc_now = _IQmpy( _IQ(ADC_Value[1]) , _IQ(0.00793)) ;
		//CLARK、PARK变换
		i_alpha = _IQmpy((i_a - _IQmpy(_IQ(0.5), i_b) - _IQmpy(_IQ(0.5), i_c)), _IQ(K_park));
		i_beta = _IQmpy((_IQmpy(_IQ(sqrt3_2), i_b) - _IQmpy(_IQ(sqrt3_2), i_c)), _IQ(K_park));		
		i_d     = _IQmpy( _IQcos(now_radian) , i_alpha ) +_IQmpy( _IQsin(now_radian) , i_beta );
        i_q     = _IQmpy( -_IQsin(now_radian) , i_alpha ) +_IQmpy( _IQcos(now_radian) , i_beta );		
		//编码器获取角度与速度
		//获取当前编码器角度值,其并非实际角度值,实际角度值 = now_angle*360/16384
		now_angle = spi_get_angle() - now_angle_offcet;
		if (now_angle <0)	now_angle = now_angle + 16384;
		//获取当前角度值,now_theta为机械角度0-360°;now_theta_E为电子角度0-360°;now_radian为电子弧度0-2*pi
		now_theta_M = _IQmpy( _IQ(now_angle) , _IQ(0.02197266) );
		now_theta_E = _IQfrac(_IQmpy( now_theta_M , _IQ(0.01944444) ));
		now_theta_E = _IQmpy(  now_theta_E, _IQ(360) );		
		now_radian = _IQmpy( now_theta_E , _IQ(pi_180) );		
		//获取当前转速
		//转速PI控制器
		//电流PI控制器
		//SVPWM
		U1 = u_beta;
		U2 = _IQmpy( _IQ(sqrt3_2) , u_alpha ) - _IQmpy(_IQ(0.5) , u_beta);
		U3 = _IQmpy( _IQ(-sqrt3_2) , u_alpha ) - _IQmpy(_IQ(0.5) , u_beta);		
		if(U1>0){A=1;} else{A=0;}
		if(U2>0){B=1;} else{B=0;}
		if(U3>0){C=1;} else{C=0;}
		N=A+2*B+4*C;
		//对应扇区   //算T时不乘以Ts 算占空比时不除Ts,相互抵消 
		switch (N)
		{
		case 3://第一扇区 0-4-6-7-6-4-0
			T4 = _IQmpy( _IQ(K) ,U2  );
			T6 = _IQmpy( _IQ(K) ,U1  );
			T0 = _IQmpy( _IQ(0.5) , _IQ(1.0)-T4-T6 ); 
			T7 = T0;
			T1 = _IQ(0);T2 =_IQ(0);T3 =_IQ(0);T5 =_IQ(0);
			duty_ratio1 = T4 + T6 + T7;
			duty_ratio2 = T6 + T7;
			duty_ratio3 = T7;
			break;
		case 1://第二扇区 0-2-6-7-6-2-0
			T2 = _IQmpy( _IQ(-K) ,U2  );
			T6 = _IQmpy( _IQ(-K) ,U3  );
			T0 = _IQmpy( _IQ(0.5) , _IQ(1.0)-T2-T6 ); 
			T7 = T0;
			T1 = _IQ(0);T3 =_IQ(0);T4 =_IQ(0);T5 =_IQ(0);
			duty_ratio1 = T6 + T7;
			duty_ratio2 = T2 + T6 + T7;
			duty_ratio3 = T7;
			break;
		case 5://第三扇区 0-2-3-7-3-2-0
			T2 = _IQmpy( _IQ(K) ,U1  );
			T3 = _IQmpy( _IQ(K) ,U3  );
			T0 = _IQmpy( _IQ(0.5) , _IQ(1.0)-T2-T3 ); 
			T7 = T0;
			T1 = _IQ(0);T6 =_IQ(0);T4 =_IQ(0);T5 =_IQ(0);
			duty_ratio1 = T7;
			duty_ratio2 = T2 + T3 + T7;
			duty_ratio3 = T3 + T7;
			break;
		case 4://第四扇区 0-1-3-7-3-2-0
			T1 = _IQmpy( _IQ(-K) ,U1  );
			T3 = _IQmpy( _IQ(-K) ,U2  );
			T0 = _IQmpy( _IQ(0.5) , _IQ(1.0)-T1-T3 ); 
			T7 = T0;
			T2 = _IQ(0);T6 =_IQ(0);T4 =_IQ(0);T5 =_IQ(0);
			duty_ratio1 = T7;
			duty_ratio2 = T3 + T7;
			duty_ratio3 = T1 + T3 + T7;
			break;          
		case 6://第五扇区 0-1-5-7-5-1-0
			T1 = _IQmpy( _IQ(K) ,U3  );
			T5 = _IQmpy( _IQ(K) ,U2  );
			T0 = _IQmpy( _IQ(0.5) , _IQ(1.0)-T1-T5 ); 
			T7 = T0;
			T2 = _IQ(0);T6 =_IQ(0);T4 =_IQ(0);T3 =_IQ(0);
			duty_ratio1 = T5 + T7;
			duty_ratio2 = T7;
			duty_ratio3 = T1 + T5 + T7;
			break;          
		case 2://第六扇区 0-4-5-7-5-4-0
			T4 = _IQmpy( _IQ(-K) ,U3  );
			T5 = _IQmpy( _IQ(-K) ,U1  );
			T0 = _IQmpy( _IQ(0.5) , _IQ(1.0)-T4-T5 ); 
			T7 = T0;
			T2 = _IQ(0);T6 =_IQ(0);T1 =_IQ(0);T3 =_IQ(0);
			duty_ratio1 = T4 + T5 + T7;
			duty_ratio2 = T7;
			duty_ratio3 = T5 + T7;
			break;
			   
		default:
			break;
		}		
		//计算占空比值
		PWM1_PULSE = 400*_IQtoF(duty_ratio1);
		PWM2_PULSE = 400*_IQtoF(duty_ratio2);
		PWM3_PULSE = 400*_IQtoF(duty_ratio3);		
		//串口信息打印
	}
}
//其中函数spi_get_angle();
uint32_t spi_get_angle(void)
{
	uint8_t SPI_TXDATA[3];
	uint8_t SPI_RXDATA[3];		
	uint32_t angle;
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15,GPIO_PIN_RESET);
	HAL_SPI_TransmitReceive(&hspi1,SPI_TXDATA,SPI_RXDATA,3,0xffff);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15,GPIO_PIN_SET);	
	angle = ((SPI_RXDATA[0]<<16)|(SPI_RXDATA[1]<<8)|SPI_RXDATA[2])>>10;
	return angle;
}

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

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

相关文章

机械硬盘坏了怎么导出数据?5中高效恢复数据的方法

面对机械硬盘损坏的紧急情况&#xff0c;如何有效地导出数据成为了许多用户关注的焦点。以下是对上述方法的深入分析与润色&#xff0c;旨在为用户提供更加全面、清晰的指导。 机械硬盘损坏后的数据导出策略 1. 利用数据恢复软件&#xff1a; 当机械硬盘出现逻辑故障或轻微物…

解决使用PPIO欧派云服务器时无法使用sftp的问题

首先在对外TCP端口中选择22端口&#xff1a; 在连接-端口映射中可以看到&#xff1a; 使用ssh连接云服务器&#xff0c;更新包列表并安装OpenSSH服务器&#xff1a; apt-get update apt-get install-y openssh-server 创建 SSH 运行目录&#xff1a; mkdir /var/run/sshd 设…

【C语言】指针(1):入门理解篇

目录 一、内存和地址 1.1内存 1.2 深入理解计算机编址 二、指针变量和地址 2.1 取地址操作符&#xff08;&&#xff09; 2.2 指针变量和解应用操作符 2.2.1 指针变量 2.2.2 解引用操作符 2.3指针变量的大小 三、指针变量类型的意义 3.1 指针的解引用 3.1指针-整数…

【恒源智享云】建立会话,后台运行实例

建立会话 tmux new -s session1退出会话 ctrlD

通信协议:常见的芯片内通信协议

相关阅读 通信协议https://blog.csdn.net/weixin_45791458/category_12452508.html?spm1001.2014.3001.5482 本文将简单介绍一些常见的芯片间通信协议&#xff0c;但不会涉及到协议的具体细节。 一、AMBA&#xff08;Advanced Microcontroller Bus Architecture&#xff09;…

设计模式探索:策略模式

1. 什么是策略模式&#xff08;Strategy Pattern&#xff09; 定义 策略模式&#xff08;Strategy Pattern&#xff09;的原始定义是&#xff1a;定义一系列算法&#xff0c;将每一个算法封装起来&#xff0c;并使它们可以相互替换。策略模式让算法可以独立于使用它的客户端而…

我使用HarmonyOs Next开发了b站的首页

1.实现效果展示&#xff1a; 2.图标准备 我使用的是iconfont图标&#xff0c;下面为项目中所使用到的图标 3. 代码 &#xff08;1&#xff09;Index.ets&#xff1a; import {InfoTop} from ../component/InfoTop import {InfoCenter} from ../component/InfoCenter import…

EtherCAT总线

目录 1、EtherCAT的系统组成 2、EtherCAT的运行原理 3、EtherCAT的数据帧结构 4、EtherCAT的寻址方式 5、EtherCAT的分布时钟 6、EtherCAT的通信模式 7、EtherCAT应用层协议 1、EtherCAT的系统组成 EtherCAT是一种实时以太网技术&#xff0c;由一个主站设备和多个从站…

SwinTransformer的相对位置索引的原理以及源码分析

文章目录 1. 理论分析2. 完整代码 引用&#xff1a;参考博客链接 1. 理论分析 根据论文中提供的公式可知是在 Q Q Q和 K K K进行匹配并除以 d \sqrt d d ​ 后加上了相对位置偏执 B B B。 A t t e n t i o n ( Q , K , V ) S o f t m a x ( Q K T d B ) V \begin{aligned} &…

认识并理解webSocket

今天逛牛客&#xff0c;看到有大佬分享说前端面试的时候遇到了关于webSocket的问题&#xff0c;一看自己都没见过这个知识点&#xff0c;赶紧学习一下&#xff0c;在此记录&#xff01; WebSocket 是一种网络通信协议&#xff0c;提供了全双工通信渠道&#xff0c;即客户端和服…

无法下载cuda

cuda下载不了 一、台式机电脑浏览器打不开cuda下载下面二、解决办法 一、台式机电脑浏览器打不开cuda下载下面 用360、chrome、Edge浏览器都打不开下载页面&#xff0c;有的人说后缀com改成cn&#xff0c;都不行。知乎上说是网络问题&#xff0c;电信换成换成移动/联通的网络会…

2229:Sumsets

网址如下&#xff1a; OpenJudge - 2229:Sumsets 这题不是我想出来的 在这里仅做记录 代码如下&#xff1a; #include<iostream> using namespace std;const int N 1000000000; int dp[1000010]; int n;int main() {cin >> n;dp[0] 1;dp[1] 1;for (int i 2…

Win11系统文件夹预览无法预览PDF文件,PDF阅读器是adobe acrobat

三步走 首先&#xff0c;打开文件夹预览功能 然后&#xff0c;设置adobe acrobat为默认PDF打开应用 最后&#xff0c;打开在Windows资源管理器中启用PDF缩略图&#xff0c;正常设定后&#xff0c;会显示配置文件&#xff0c;稍等一会。

5个实用的文章生成器,高效输出优质文章

在自媒体时代&#xff0c;优质内容的持续输出是吸引读者、提升影响力的关键。然而&#xff0c;对于许多自媒体创作者来说&#xff0c;频繁的创作难免会遭遇灵感枯竭、创作不出文章的困扰。此时&#xff0c;文章生成器便成为了得力的助手。文章生成器的优势能够快速自动生成高质…

7 系列 FPGA 引脚及封装(参考ug475)

目录 I/O BankPins引脚定义I/O and Multi-Function PinsPower Supply PinsDedicated XADC PinsTransceiver PinsDedicated Configuration PinsTemperature Sensor Pins Device 视图整个 FPGAIOBILOGIC,OLOGIC,IDELAY,ODELAYBUFIO,BUFR,IDELAYCTRLBUFMRCEBRAM,DSPIBUFDS_GTE2CLB…

Spring源码十四:Spring生命周期

上一篇我们在Spring源码十三&#xff1a;非懒加载单例Bean中看到了Spring会在refresh方法中去调用我们的finishBeanFactoryInitialization方法去实例化&#xff0c;所有非懒加载器单例的bean。并实例化后的实例放到单例缓存中。到此我们refresh方法已经接近尾声。 Spring的生命…

医疗器械企业CRM系统推荐清单(2024版)

近年来&#xff0c;我国医疗器械行业在国家政策支持、医改深入、人口老龄化和消费能力提升等因素推动下&#xff0c;得到了快速发展&#xff0c;正日益成为创新能力增强、市场需求旺盛的朝阳产业。然而&#xff0c;行业也面临价格压力、市场份额重新分配、合规风险以及产品和服…

【C语言】register 关键字

在C语言中&#xff0c;register关键字用于提示编译器将变量尽量存储在CPU的寄存器中&#xff0c;而不是在内存中。这是为了提高访问速度&#xff0c;因为寄存器的访问速度比内存快得多。使用register关键字的变量通常是频繁使用的局部变量。 基本用法 void example() {regist…

使用ChatGPT写学术论文的技巧和最佳实践指南

大家好&#xff0c;感谢关注。我是七哥&#xff0c;一个在高校里不务正业&#xff0c;折腾学术科研AI实操的学术人。关于使用ChatGPT等AI学术科研的相关问题可以和作者七哥&#xff08;yida985&#xff09;交流&#xff0c;多多交流&#xff0c;相互成就&#xff0c;共同进步&a…

ActiveMq工具之管理页面说明

文章目录 安装ActiveMQ一: 访问管理页面二: 进入管理页面&#xff0c;主页三: Queues页说明四: Topics页说明五: Subscribers页说明 安装ActiveMQ wget https://archive.apache.org/dist//activemq/5.13.3/apache-activemq-5.13.3-bin.tar.gz wget https://mirrors.huaweiclou…