当前位置: 首页 > news >正文

【电机控制】基于STC8H1K28的六步换向——方波驱动(软件篇)

【电机控制】基于STC8H1K28的六步换向——方波驱动(软件篇)


文章目录

    • @[TOC](文章目录)
  • 前言
  • 一、main.c
  • 二、GPIO.c
  • 三、PWMA.c
  • 四、ADC.c
  • 五、CMP.c
  • 六、Timer.c
  • 七、PMSM.c
  • 八、参考资料
  • 总结

前言

【电机控制】STC8H无感方波驱动—反电动势过零检测六步换向法


在这里插入图片描述

提示:以下是本篇文章正文内容,下面案例可供参考

一、main.c

void main(void)
{GPIO_Init();			//IO初始化Uart1_Init();			//串口初始化PWMA_config();			//PWMA初始化ADC_config();			//ADC初始化CMP_config();			//比较器初始化Timer0_config();		// Timer0初始化函数 4ms定时器,用于事件处理Timer3_Config();		// Timer3初始化函数 1ms定时器,用于换向时间计算Timer4_Config();		// Timer4初始化函数 4us定时器,用于计算六步换向PWW_Set = 0;			//初始PWM设定值TimeOut = 0;			//超时设定值初始化EA  = 1; 				// 打开总中断while (1){Event_Deal();}
}

二、GPIO.c

配置IO

void GPIO_Init(void)
{P2n_standard(0xf8);P3n_standard(0xbf);P5n_standard(0x10);
}

三、PWMA.c

u8	PWM_Value;	// 决定PWM占空比的值
u8	PWW_Set;	//目标PWM设置
void PWMA_config(void)
{P_SW2 |= 0x80;		//SFR enable   PWM1   = 0;PWM1_L = 0;PWM2   = 0;PWM2_L = 0;PWM3   = 0;PWM3_L = 0;P1n_push_pull(0x3f);
// 预分频寄存器, 分频 Fck_cnt = Fck_psc/(PSCR[15:0}+1),  
// 边沿对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)),
// 中央对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)*2).PWMA_PSCR = 3;		PWMA_DTR  = 24;		// 死区时间配置, n=0~127: DTR= n T,   0x80 ~(0x80+n), n=0~63: DTR=(64+n)*2T,  //				0xc0 ~(0xc0+n), n=0~31: DTR=(32+n)*8T,   0xE0 ~(0xE0+n), n=0~31: DTR=(32+n)*16T,PWMA_ARR    = 255;	// 自动重装载寄存器,  控制PWM周期PWMA_CCER1  = 0;PWMA_CCER2  = 0;PWMA_SR1    = 0;PWMA_SR2    = 0;PWMA_ENO    = 0;PWMA_PS     = 0;PWMA_IER    = 0;
//	PWMA_ISR_En = 0;PWMA_CCMR1  = 0x68;		// 通道模式配置, PWM模式1, 预装载允许PWMA_CCR1   = 0;		// 比较值, 控制占空比(高电平时钟数)PWMA_CCER1 |= 0x05;		// 开启比较输出, 高电平有效PWMA_PS    |= 0;		// 选择IO, 0:选择P1.0 P1.1, 1:选择P2.0 P2.1, 2:选择P6.0 P6.1, 
//	PWMA_ENO   |= 0x01;		// IO输出允许,  bit7: ENO4N, bit6: ENO4P, bit5: ENO3N, bit4: ENO3P,  bit3: ENO2N,  bit2: ENO2P,  bit1: ENO1N,  bit0: ENO1P
//	PWMA_IER   |= 0x02;		// 使能中断PWMA_CCMR2  = 0x68;		// 通道模式配置, PWM模式1, 预装载允许PWMA_CCR2   = 0;		// 比较值, 控制占空比(高电平时钟数)PWMA_CCER1 |= 0x50;		// 开启比较输出, 高电平有效PWMA_PS    |= (0<<2);	// 选择IO, 0:选择P1.2 P1.3, 1:选择P2.2 P2.3, 2:选择P6.2 P6.3, 
//	PWMA_ENO   |= 0x04;		// IO输出允许,  bit7: ENO4N, bit6: ENO4P, bit5: ENO3N, bit4: ENO3P,  bit3: ENO2N,  bit2: ENO2P,  bit1: ENO1N,  bit0: ENO1P
//	PWMA_IER   |= 0x04;		// 使能中断PWMA_CCMR3  = 0x68;		// 通道模式配置, PWM模式1, 预装载允许PWMA_CCR3   = 0;		// 比较值, 控制占空比(高电平时钟数)PWMA_CCER2 |= 0x05;		// 开启比较输出, 高电平有效PWMA_PS    |= (0<<4);	// 选择IO, 0:选择P1.4 P1.5, 1:选择P2.4 P2.5, 2:选择P6.4 P6.5, 
//	PWMA_ENO   |= 0x10;		// IO输出允许,  bit7: ENO4N, bit6: ENO4P, bit5: ENO3N, bit4: ENO3P,  bit3: ENO2N,  bit2: ENO2P,  bit1: ENO1N,  bit0: ENO1P
//	PWMA_IER   |= 0x08;		// 使能中断PWMA_BKR    = 0x80;		// 主输出使能 相当于总开关PWMA_CR1    = 0x81;		// 使能计数器, 允许自动重装载寄存器缓冲, 边沿对齐模式, 向上计数,  bit7=1:写自动重装载寄存器缓冲(本周期不会被打扰), =0:直接写自动重装载寄存器本(周期可能会乱掉)PWMA_EGR    = 0x01;		//产生一次更新事件, 清除计数器和与分频计数器, 装载预分频寄存器的值
//	PWMA_ISR_En = PWMA_IER;	//设置标志允许通道1~4中断处理
}//	PWMA_PS   = (0<<6)+(0<<4)+(0<<2)+0;	//选择IO, 4项从高到低(从左到右)对应PWM1 PWM2 PWM3 PWM4, 0:选择P1.x, 1:选择P2.x, 2:选择P6.x, 
//  PWMA_PS    PWM4N PWM4P    PWM3N PWM3P    PWM2N PWM2P    PWM1N PWM1P
//    00       P1.7  P1.6     P1.5  P1.4     P1.3  P1.2     P1.1  P1.0
//    01       P2.7  P2.6     P2.5  P2.4     P2.3  P2.2     P2.1  P2.0
//    02       P6.7  P6.6     P6.5  P6.4     P6.3  P6.2     P6.1  P6.0
//    03       P3.3  P3.4      --    --       --    --       --    --

四、ADC.c

void ADC_config(void)	//ADC初始化函数(为了使用ADC输入端做比较器信号, 实际没有启动ADC转换)
{P1n_pure_input(0xc0);	//设置为高阻输入P0n_pure_input(0x0f);	//设置为高阻输入ADC_CONTR = 0x80 + 6;	//ADC on + channelADCCFG = RES_FMT + ADC_SPEED;P_SW2 |=  0x80;	//访问XSFRADCTIM = CSSETUP + CSHOLD + SMPDUTY;
}
//========================================================================
// 函数: u16	Get_ADC10bitResult(u8 channel))	//channel = 0~15
//========================================================================
u16	Get_ADC10bitResult(u8 channel)	//channel = 0~15
{u8 i;ADC_RES = 0;ADC_RESL = 0;ADC_CONTR = 0x80 | ADC_START | channel; NOP(5);			//
//	while((ADC_CONTR & ADC_FLAG) == 0)	;	//等待ADC结束i = 255;while(i != 0){i--;if((ADC_CONTR & ADC_FLAG) != 0)	break;	//等待ADC结束}ADC_CONTR &= ~ADC_FLAG;return	((u16)ADC_RES * 256 + (u16)ADC_RESL);
}

五、CMP.c

void CMP_config(void)	//比较器初始化程序
{CMPCR1 = 0x8C;			// 1000 1100 打开比较器,P3.6作为比较器的反相输入端,ADC引脚作为正输入端 CMPCR2 = 60;			//60个时钟滤波   比较结果变化延时周期数, 0~63P3n_pure_input(0x40);	//CMP-(P3.6)设置为高阻.P_SW2 |= 0x80;		//SFR enable   
//	CMPEXCFG |= (0<<6);	//bit7 bit6: 比较器迟滞输入选择: 0: 0mV,  1: 10mV, 2: 20mV, 3: 30mV
//	CMPEXCFG |= (0<<2);	//bit2: 输入负极性选择, 0: 选择P3.6做输入,   1: 选择内部BandGap电压BGv做负输入.
//	CMPEXCFG |=  0;		//bit1 bit0: 输入正极性选择, 0: 选择P3.7做输入,   1: 选择P5.0做输入,  2: 选择P5.1做输入,  3: 选择ADC输入(由ADC_CHS[3:0]所选择的ADC输入端做正输入).
//	CMPEXCFG = (0<<6)+(0<<2)+3;
}void CMP_ISR(void) interrupt 21		//比较器中断函数, 检测到反电动势过0事件
{u8	i;CMPCR1 &= ~0x40;	// 需软件清除中断标志位if(XiaoCiCnt == 0)	//消磁后才检测过0事件,   XiaoCiCnt=1:需要消磁, =2:正在消磁, =0已经消磁{T4T3M &= ~(1<<3);	// Timer3停止运行if(B_Timer3_OverFlow)	//切换时间间隔(Timer3)有溢出{B_Timer3_OverFlow = 0;PhaseTime = 8000;	//换相时间最大8ms, 2212电机12V空转最高速130us切换一相(200RPS 12000RPM), 480mA}else{PhaseTime = (((u16)T3H << 8) + T3L) >> 1;	//单位为1usif(PhaseTime >= 8000)	PhaseTime = 8000;	//换相时间最大8ms, 2212电机12V空转最高速130us切换一相(200RPS 12000RPM), 480mA}T3H = 0;	T3L = 0;T4T3M |=  (1<<3);	//Timer3开始运行PhaseTimeTmp[TimeIndex] = PhaseTime;	//保存一次换相时间if(++TimeIndex >= 8)	TimeIndex = 0;	//累加8次for(PhaseTime=0, i=0; i<8; i++)	PhaseTime += PhaseTimeTmp[i];	//求8次换相时间累加和PhaseTime = PhaseTime >> 4;		//求8次换相时间的平均值的一半, 即30度电角度if((PhaseTime >= 40) && (PhaseTime <= 1000))	TimeOut = 125;	//堵转500ms超时if( PhaseTime >= 60)	PhaseTime -= 40;	//修正由于滤波电容引起的滞后时间else					PhaseTime  = 20;//	PhaseTime = 20;	//只给20us, 则无滞后修正, 用于检测滤波电容引起的滞后时间T4T3M &= ~(1<<7);				//Timer4停止运行PhaseTime  = PhaseTime  << 1;	//2个计数1usPhaseTime = 0 - PhaseTime;T4H = (u8)(PhaseTime >> 8);		//装载30度角延时T4L = (u8)PhaseTime;T4T3M |=  (1<<7);	//Timer4开始运行XiaoCiCnt = 1;		//1:需要消磁, 2:正在消磁, 0已经消磁}
}

六、Timer.c

void Timer0_config(void)	//Timer0初始化函数
{Timer0_16bitAutoReload(); // T0工作于16位自动重装Timer0_12T();TH0 = (65536UL-MAIN_Fosc/12 / 250) / 256; //4msv4000us=4msTL0 = (65536UL-MAIN_Fosc/12 / 250) % 256;TR0 = 1; // 打开定时器0ET0 = 1;// 允许ET0中断
}
void Timer0_ISR(void) interrupt 1	//Timer0中断函数, 20us
{B_4ms = 1;	//4ms定时标志
}
//============================ timer3初始化函数 ============================================
void	Timer3_Config(void)
{P_SW2 |= 0x80;		//SFR enable   T4T3M &= 0xf0;		//停止计数, 定时模式, 12T模式, 不输出时钟T3H = 0;T3L = 0;T3T4PIN = 0x01;		//选择IO, 0x00: T3--P0.4, T3CLKO--P0.5, T4--P0.6, T4CLKO--P0.7;    0x01: T3--P0.0, T3CLKO--P0.1, T4--P0.2, T4CLKO--P0.3;IE2   |=  (1<<5);	//允许中断T4T3M |=  (1<<3);	//开始运行
}
//=========================== timer3中断函数 =============================================
void timer3_ISR (void) interrupt TIMER3_VECTOR
{B_Timer3_OverFlow = 1;	//溢出标志
}
//============================ timer4初始化函数 ============================================
void	Timer4_Config(void)
{P_SW2 |= 0x80;		//SFR enable   T4T3M &= 0x0f;		//停止计数, 定时模式, 12T模式, 不输出时钟T4H = 0;T4L = 0;T3T4PIN = 0x01;		//选择IO, 0x00: T3--P0.4, T3CLKO--P0.5, T4--P0.6, T4CLKO--P0.7;    0x01: T3--P0.0, T3CLKO--P0.1, T4--P0.2, T4CLKO--P0.3;IE2   |=  (1<<6);	//允许中断
//	T4T3M |=  (1<<7);	//开始运行
}
//=========================== timer4中断函数 =============================================
void timer4_ISR (void) interrupt TIMER4_VECTOR
{T4T3M &= ~(1<<7);	//Timer4停止运行if(XiaoCiCnt == 1)		//标记需要消磁. 每次检测到过0事件后第一次中断为30度角延时, 设置消磁延时.{XiaoCiCnt = 2;		//1:需要消磁, 2:正在消磁, 0已经消磁if(B_RUN)	//电机正在运行{if(++step >= 6)	step = 0;StepMotor();}//消磁时间, 换相后线圈(电感)电流减小到0的过程中, 出现反电动势, 电流越大消磁时间越长, 过0检测要在这个时间之后//100%占空比时施加较重负载, 电机电流上升, 可以示波器看消磁时间.//实际上, 只要在换相后延时几十us才检测过零, 就可以了T4H = (u8)((65536UL - 40*2) >> 8);	//装载消磁延时T4L = (u8)(65536UL - 40*2);T4T3M |=  (1<<7);	//Timer4开始运行}else if(XiaoCiCnt == 2)	XiaoCiCnt = 0;		//1:需要消磁, 2:正在消磁, 0已经消磁
}

七、PMSM.c

/******************* 强制电机启动函数 ***************************/
void StartMotor(void)
{u16 timer,i;CMPCR1 = 0x8C;	// 关比较器中断PWM_Value  = D_START_PWM+10;	// 初始占空比, 根据电机特性设置PWMA_CCR1L = PWM_Value;PWMA_CCR2L = PWM_Value;PWMA_CCR3L = PWM_Value;step = 0;	StepMotor();	Delay_n_ms(100);	//Delay_n_ms(250);// 初始位置timer = 300;	//电机启动值PWM_Value  = D_START_PWM/1.2;	// 根据电机特性设置while(1){for(i=0; i<timer; i++)	delay_us(70);  //根据电机加速特性, 最高转速等等调整启动加速速度timer -= timer /10;  			//设置加速时间if(++step >= 6)	step = 0;	//设置换向次数StepMotor();							//开启电机换向if(timer < 40)	return;		//剩余启动值}
}
void StepMotor(void) // 换相序列函数
{switch(step){case 0:  // AB  PWM1, PWM2_L=1PWMA_ENO = 0x00;	PWM1_L=0;	PWM3_L=0;Delay_500ns();PWMA_ENO = 0x01;		// 打开A相的高端PWMPWM2_L = 1;				// 打开B相的低端ADC_CONTR = 0x80+10;	// 选择P0.2作为ADC输入 即C相电压CMPCR1 = 0x8c + 0x10;	//比较器下降沿中断break;case 1:  // AC  PWM1, PWM3_L=1PWMA_ENO = 0x01;	PWM1_L=0;	PWM2_L=0;	// 打开A相的高端PWMDelay_500ns();PWM3_L = 1;				// 打开C相的低端ADC_CONTR = 0x80+9;		// 选择P0.1作为ADC输入 即B相电压CMPCR1 = 0x8c + 0x20;	//比较器上升沿中断break;case 2:  // BC  PWM2, PWM3_L=1PWMA_ENO = 0x00;	PWM1_L=0;	PWM2_L=0;Delay_500ns();PWMA_ENO = 0x04;		// 打开B相的高端PWMPWM3_L = 1;				// 打开C相的低端ADC_CONTR = 0x80+8;		// 选择P0.0作为ADC输入 即A相电压CMPCR1 = 0x8c + 0x10;	//比较器下降沿中断break;case 3:  // BA  PWM2, PWM1_L=1PWMA_ENO = 0x04;	PWM2_L=0;	PWM3_L=0;	// 打开B相的高端PWMDelay_500ns();PWM1_L = 1;				// 打开C相的低端ADC_CONTR = 0x80+10;	// 选择P0.2作为ADC输入 即C相电压CMPCR1 = 0x8c + 0x20;	//比较器上升沿中断break;case 4:  // CA  PWM3, PWM1_L=1PWMA_ENO = 0x00;	PWM2_L=0;	PWM3_L=0;Delay_500ns();PWMA_ENO = 0x10;		// 打开C相的高端PWMPWM1_L = 1;				// 打开A相的低端ADC_CONTR = 0x80+9;		// 选择P0.1作为ADC输入 即B相电压CMPCR1 = 0x8c + 0x10;	//比较器下降沿中断break;case 5:  // CB  PWM3, PWM2_L=1PWMA_ENO = 0x10;	PWM1_L=0;	PWM3_L=0;	// 打开C相的高端PWMDelay_500ns();PWM2_L = 1;				// 打开B相的低端adc11 = ((adc11 *7)>>3) + Get_ADC10bitResult(6);ADC_CONTR = 0x80+8;		// 选择P0.0作为ADC输入 即A相电压CMPCR1 = 0x8c + 0x20;	//比较器上升沿中断break;default:break;}if(B_start)		CMPCR1 = 0x8C;	// 启动时禁止下降沿和上升沿中断
}

八、参考资料

【电机控制】六步换向——方波驱动(算法篇)

总结

本文仅仅简单介绍了【电机控制】基于STC8H1K28的六步换向——方波驱动(软件篇),评论区欢迎讨论。

相关文章:

【电机控制】基于STC8H1K28的六步换向——方波驱动(软件篇)

【电机控制】基于STC8H1K28的六步换向——方波驱动&#xff08;软件篇&#xff09; 文章目录 [TOC](文章目录) 前言一、main.c二、GPIO.c三、PWMA.c四、ADC.c五、CMP.c六、Timer.c七、PMSM.c八、参考资料总结 前言 【电机控制】STC8H无感方波驱动—反电动势过零检测六步换向法 …...

小程序配置文件 —— 13 全局配置 - window配置

全局配置 - window配置 这里讲解根目录 app.json 中的 window 字段&#xff0c;window 字段用于设置小程序的状态栏、导航条、标题、窗口背景色&#xff1b; 状态栏&#xff1a;顶部位置&#xff0c;有网络信号、时间信息、电池信息等&#xff1b;导航条&#xff1a;有一个当…...

全球域名市场科普之域名交易平台介绍——Sedo与Afternic

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…...

leetcode108:将有序数组转化为二叉搜索树

给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 平衡 二叉搜索树。 示例 1&#xff1a; 输入&#xff1a;nums [-10,-3,0,5,9] 输出&#xff1a;[0,-3,9,-10,null,5] 解释&#xff1a;[0,-10,5,null,-3,null,9] 也将被视为正确…...

截图技术方案

安卓截屏技术附带悬浮窗自动存储功能_安卓截图浮窗-CSDN博客 https://chat.baidu.com/search?dyTabStrMCwxMiwzLDEsMiwxMyw3LDYsNSw5&pdcsaitab&setypecsaitab&extParamsJson%7B%22apagelid%22%3A%2210990774271994514433%22%2C%22enter_type%22%3A%22a_ai_index%…...

程序员测试日常小工具

作为一名程序员&#xff0c;或者测试人员&#xff0c;日常工作最常用的工具有哪些&#xff0c;截图&#xff0c;截图漂浮&#xff0c;翻译&#xff0c;日期处理&#xff0c;api调用...&#xff0c; 当你拿到一串报文后&#xff0c;想要json转换时&#xff0c;是不是要打…...

Kubernetes: NetworkPolicy 的实践应用

一、Network Policy 是什么,在云原生领域有和作用 Network Policy 是 Kubernetes 官方提出来的一种网络策略的规范&#xff0c;用户通过编写符合对应规范的规则来控制 k8s 集群内 L3 和 L4 层的网络流量。 NetworkPolicy 主要的功能就是实现在云原生领域的容器网络管控它给用…...

HTML5滑块(Slider)

HTML5 的滑块&#xff08;Slider&#xff09;控件允许用户通过拖动滑块来选择数值。以下是如何实现一个简单的滑块组件的详细说明。 HTML5 滑块组件 1. 基本结构 使用 <input type"range"> 元素可以创建一个滑块。下面是基本实现的代码示例&#xff1a; <…...

数据结构与算法之动态规划: LeetCode 72. 编辑距离 (Ts版)

编辑距离 https://leetcode.cn/problems/edit-distance/description/ 描述 给你两个单词 word1 和 word2&#xff0c; 请返回将 word1 转换成 word2 所使用的最少操作数你可以对一个单词进行如下三种操作&#xff1a; 插入一个字符删除一个字符替换一个字符 示例 1 输入&…...

洪水灾害多智能体分布式模拟示例代码

1. 环境定义&#xff1a;支持灾害动态、地理数据和分布式架构 import numpy as np import random import matplotlib.pyplot as plt# 新疆主要城市及邻接关系 XINJIANG_CITIES {Urumqi: [Changji, Shihezi],Changji: [Urumqi, Shihezi, Turpan],Shihezi: [Urumqi, Changji, K…...

【前端】Node.js使用教程

目录 一、?Node.js开发环境和编译 1.1 安装Node.js 1.2 创建一个Node.js项目 1.3 编写Node.js程序 1.4 运行Node.js程序 1.5 使用Node.js模块 二、高级的Node.js编程概念和示例 2.1 异步编程 2.2 错误处理 2.3 网络请求 2.4 构建Web服务器 2.5 数据库交互 三、No…...

django33全栈班2025年004 录入数据

前言 通过前面的学习, 我们已经算是Python基本入门了. 如果你能熟练的掌握的话, 至少让你换台电脑, 在新电脑上搭建Python的开发环境肯定是没问题的. 我们呢也学习了第一行Python代码, 但是我们不知道这行代码是什么意思, 为什么能够运行, 怎么就能输出到控制台呢? 还有, …...

小白投资理财 - 看懂 EPS 每股收益

小白投资理财 - 看懂 EPS 每股收益 什么是 EPSEPS 缺陷EPS 优点EPS 跟自己比EPS 跟别人比 总结 投资一家公司就要选择会赚钱的公司&#xff0c;我们最为关心的莫过于公司的盈利能力&#xff0c;只有会下蛋的鸡才是好鸡&#xff0c;买股票为的就是获得利润。想成为一位成功的投资…...

Pandas-apply自定义函数

文章目录 一. Series的apply方法1. 一个元素一个元素的传入2. apply传入一个参数函数2.apply传入多个参数函数 二. DataFrame的apply方法1. axis参数指定按行/ 按列(默认)传入数据2. apply使用 三. apply 使用案例1. 栗子12. 栗子2-列3. 栗子3-行 四. 向量化函数1. 使用np.vect…...

github 项目分享

今天和大家分享一些github上面搜到关于卫星遥感和水环境相关的项目。 一、WaterDetect 使用端到端算法去识别水体范围的算法&#xff0c;针对哨兵2卫星遥感数据可用。 项目地址&#xff1a; https://github.com/cordmaur/WaterDetect 二、DeepWaterMap 深度卷积神经网络去…...

与你共度的烟火日常

见过不少人、经过不少事、也吃过不少苦&#xff0c;感悟世事无常、人心多变&#xff0c;靠着回忆将往事串珠成链&#xff0c;聊聊感情、谈谈发展&#xff0c;我慢慢写、你一点一点看...... 我和她一起收拾完屋子&#xff0c;忙完已经中午了。她说&#xff1a;“咱们去趟超市吧&…...

基于Python的社交音乐分享平台

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…...

Kafka的acks机制和ISR列表

Kafka 是一个流行的分布式流处理平台&#xff0c;用于构建实时数据流管道和应用程序。在 Kafka 中&#xff0c;acks 机制和 ISR&#xff08;In-Sync Replicas&#xff09;列表是两个重要的概念&#xff0c;它们共同确保消息的持久性和可靠性。 acks 机制 acks 机制是 Kafka 生…...

FreeRTOS: ISR(中断服务例程)和 TCB(任务控制块)

在讨论 ISR&#xff08;中断服务例程&#xff09;和 TCB&#xff08;任务控制块&#xff0c;Task Control Block&#xff09;时&#xff0c;我们实际上是在探讨 FreeRTOS 中两个不同但又相互关联的概念&#xff1a;一个是用于处理硬件或软件触发的中断事件&#xff0c;另一个是…...

【Spring】Spring DI(依赖注入)详解—自动装配—byType实现原理

一、引言 依赖注入&#xff08;Dependency Injection, DI&#xff09;是Spring框架的核心特性之一&#xff0c;它通过控制反转&#xff08;Inversion of Control, IoC&#xff09;来管理对象的生命周期和依赖关系。在实际应用中&#xff0c;DI不仅提高了代码的可维护性和可测试…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...

关于uniapp展示PDF的解决方案

在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?

Pod IP 的本质与特性 Pod IP 的定位 纯端点地址&#xff1a;Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址&#xff08;如 10.244.1.2&#xff09;无特殊名称&#xff1a;在 Kubernetes 中&#xff0c;它通常被称为 “Pod IP” 或 “容器 IP”生命周期&#xff1a;与 Pod …...