stm32学习笔记:TIM-输出比较

news2024/11/17 17:18:02

四部分讲解内容,本文是第二部分

输出比较主要用于PWM波形的控制电机(驱动电机的必要条件)

1、定时器基本定时,定一个时间,然后让定时器每隔一段时间产生一个中断,来实现每隔一个固定时间执行一段程序的目的,比如要做一个时钟、秒表或者使用一些程序算法

2、定时器输出比较的功能,输出比较这个模块最常见的用途是产生PWM波形,用于驱动电机等设备,使用stm32的PWM波形来驱动舵机和直流电机的例子

3、定时器输入捕获的功能,学习使用输入捕获这个模块来测量方波频率的例子

4、定时器的编码器接口,使用这个编码器接口,能够更加方便地读取正交编码器的输出波形,在编码电机测速中,应用广泛。

TIM输出比较

CNT:时基单元里面的计数器

CCR: 捕获/比较寄存器(输入捕获和输出比较公用)

输出比较的基本功能:当CNT大于CCR、小于CCR或者等于CCR时,输出就会对应的置1、置0。这样就可以输出一个电平不断跳变的PWM波形

 

 

PWM(Pulse Width Modulation 脉冲宽度调制)的秘诀时:天下武功,为快不破——惯性系统才可用

高低电平跳变的数字信号可以等效为中间虚线所表示的模拟量,当上面电平时间长一点,下面电平时间短一点的时候,那么等效的模拟量就偏向于上面,当下面电平时间长一点,上面电平时间短一点的时候,等效的模拟量就偏向于下面。

当我们调控这个点亮和熄灭的时间比例时,就能让LED呈现出不同的亮度级别。

只有具有惯性的系统,才能使用PWM

占空比,它决定了PWM等效出来的模拟电压的大小。占空比越大,那等效的模拟电压就越趋近于高电平,占空比越小,那等效的模拟电压就越趋近于低电平。(线性关系)

分辨率:占空比变化的精细程度

使用PWM波形,就可以在数字系统等效输出模拟量,就能实现LED控制亮度 ,电机控速等功能。
 

输出比较通道(通用定时器)

模式控制的输入是:CNT和CCR的大小关系,输出是REF的高低电平。

冻结:比如你正在输出PWM波,突然想暂停一会输出,就可以设置成这个模式,一旦切换为冻结模式,输出就暂停,并且高低电平也维持为暂停时刻的状态,保持不变。

PWM模式1和PWM模式2可以用于输出频率和占空比都可调的PWM波形。而PWM模式2实际上就是PWM模式1输出的取反。改变PWM模式1和PWM模式2就只是改变了REF电平的极性。
输出模式可设置极性,最终输出之前也可以设置极性灵活

重点-PWM基本结构

左上角是时基单元和运行控制,最左边是时钟源选择,这里省略了,这里更新中断申请不再需要,输出PWM暂时不需要中断。 

配置好时基单元,CNT就可以开始不断自增运行。然后下面就是输出比较单元,总共4路。输出比较单元的最开始是CCR捕获寄存器。CCR是我们设定的,CNT不断自增运行,同时它俩还在不断比较,后面就是输出模式控制器。

上图是PWM1模式1的执行逻辑。

蓝色线: CNT的值

黄色线:ARR的值

红色线:CCR

蓝色线从0开始自增,一直增到ARR,也就是99,之后清0继续自增,在这个过程中,再设置一条红色线,这条红色线就是CCR,比如我们设置CCR为30,之后再执行以下这个逻辑。

绿色线就是输出:

CNT<CCR,置高电平

CNT>=CCR,置低电平

以上占空比是受到CCR值的调控的。

若CCR设置高,则输出的占空比就变大。若CCR设置低一些,输出的占空比就变小。

REF:一个频率可调,占空比也可调的PWM波形

最终经过极性选择,输出使能,最终通向GPIO,完成PWM波形的输出

 

PWM参数计算 

CNT从0一直加到ARR(99),总共计算了100个数,再看高电平时间,从0加到CCR(30),在等于30的瞬间就已经跳变为低电平,所以CNT从0到29是高电平,总共是30个数。

占空比=30/(99(ARR)+1)=30/100=30%

CCR的值取决于ARR的范围。ARR越大,CCR的范围就越大,对应的分辨率就越大。
 

舵机,直流电机,硬件电路

执行逻辑:PWM输入到控制板,给控制板一个指定的目标角度,然后电位器检测输出轴的当前角度,如果大于目标角度,电机就会反转,如果小于目标角度,电机就会正转最终使输出轴固定在指定角度。

 

PWM驱动LED呼吸灯代码

第一步:RCC开启时钟,把我们要用的TIM外设和GPIO外设的始终打开

第二步:配置时基单元,包括前面的时钟源选择

第三步:配置输出比较单元,里面包括这个CCR的值、输出比较模式、极性选择、输出使能这些参数;

第四步:配置GPIO,把PWM对应的GPIO口,初始化为复用推挽输出的配置,PWM和GPIO的对应关系是怎样的(参考引脚定义表)

第五步:运行控制,启动计数器,就能输出PWM

PWM代码总体思路

初始化TIM2的通道1,产生一个PWM波形,输出引脚是PA0,然后通过SetCompare1函数,可以调节CCR1寄存器的值,从而控制PWM的占空比。但是PWM的频率在初始化写定,运行时调节不方便,所以在最后加一个函数来便捷调节PWM频率

 通用公式:
在这里插入图片描述
PSC和ARR都可以调节频率,但是占空比=CCR/(ARR+1),如果通过调节ARR调节频率,同时会影响到占空比。通过PSC调节频率,不会影响占空比。因此固定ARR,通过调节PSC改变PWM频率,另外ARR为100-1,CCR的数值直接就是占空比。

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "PWM.h"

uint8_t i;

int main(void)
{
	OLED_Init();
	PWM_Init();
	//在主循环里不断调用PWM_SetCompare1函数
	//更改CCR的值,这样就能完成LED呼吸灯的效果
	while (1)
	{//从0变到100
		for (i = 0; i <= 100; i++)
		{
			PWM_SetCompare1(i);
			Delay_ms(10);  //延时,否则太快
		}
		//从100变到0
		for (i = 0; i <= 100; i++)
		{
			PWM_SetCompare1(100 - i);
			Delay_ms(10);
		}
	}
}

pwm.c:

#include "stm32f10x.h"                  // Device header

void PWM_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
//	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//	GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE);    //引脚重映射配置函数,部分重映射,可将PA0换到PA15
//	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);  //关闭调试端口的复用
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;		//GPIO_Pin_15;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	//初始化时基单元
	TIM_InternalClockConfig(TIM2);
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;		//ARR周期
	TIM_TimeBaseInitStructure.TIM_Prescaler = 720 - 1;		//PSC预分频器
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
	//初始化输出比较单元(即初始化通道)
	TIM_OCInitTypeDef TIM_OCInitStructure;
	//给结构体赋初始值,如果不想把所有成员都列一遍赋值,可以先用structInit赋值,再更改想要修改的值
	TIM_OCStructInit(&TIM_OCInitStructure);
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;          //输出比较模式,PWM模式1
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  //设置输出比较的极性,高极性,就是极性不翻转,REF波形直接输出
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  //设置输出使能
	TIM_OCInitStructure.TIM_Pulse = 0;		//设置CCR
	//在TIM2的OC1通道上就可以输出PWM波形了,但最终这个波形需要借用GPIO口才能输出
	TIM_OC1Init(TIM2, &TIM_OCInitStructure);
	
	TIM_Cmd(TIM2, ENABLE);
}
//该函数单独设置通道1的CCR值。 
void PWM_SetCompare1(uint16_t Compare)
{
	TIM_SetCompare1(TIM2, Compare);
}

pwm.h

#ifndef __PWM_H
#define __PWM_H

void PWM_Init(void);                    //PWM初始化                  
void PWM_SetCompare1(uint16_t Compare); //设置CCR,改变占空比

#endif

PWM舵机控制代码

驱动舵机的关键,输出如下图的PWM波形:

main.c:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Servo.h"
#include "Key.h"

uint8_t Angle;
uint8_t KeyNum;

int main(void)
{
	OLED_Init();
	Servo_Init();

	Servo_SetAngle(90);
	OLED_ShowString(1,1,"Angle:");
	
	while (1)
	{
		KeyNum = Key_GetNum();
		if(KeyNum == 1)
		{
			Angle += 90;
			if(Angle > 180)
			{
				Angle = 0;
			}
		}
		Servo_SetAngle(Angle);
		OLED_ShowNum(1,7,Angle,3);  //1行7列显示Angle,长度为3
		
	}
}

pwm.c:

#include "stm32f10x.h"                  // Device header

void PWM_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	//PA1 口的通道2
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;		
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	//初始化时基单元
	TIM_InternalClockConfig(TIM2);
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStructure.TIM_Period = 20000 - 1;		//ARR周期
	TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;		//PSC预分频器
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
	//初始化输出比较单元(即初始化通道)
	TIM_OCInitTypeDef TIM_OCInitStructure;
	//给结构体赋初始值,如果不想把所有成员都列一遍赋值,可以先用structInit赋值,再更改想要修改的值
	TIM_OCStructInit(&TIM_OCInitStructure);
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;          //输出比较模式,PWM模式1
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  //设置输出比较的极性,高极性,就是极性不翻转,REF波形直接输出
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  //设置输出使能
	TIM_OCInitStructure.TIM_Pulse = 0;		//设置CCR (500~2500对应0.5ms~2.5ms)
	//在TIM2的OC1通道上就可以输出PWM波形了,但最终这个波形需要借用GPIO口才能输出
	TIM_OC2Init(TIM2, &TIM_OCInitStructure);  //通道2
	
	TIM_Cmd(TIM2, ENABLE);
}
//该函数在运行过程中单独设置通道2的CCR值
void PWM_SetCompare2(uint16_t Compare)
{
	TIM_SetCompare2(TIM2, Compare);
}

pwm.h

#ifndef __PWM_H
#define __PWM_H

void PWM_Init(void);
void PWM_SetCompare2(uint16_t Compare);

#endif

servo.c

#include "stm32f10x.h"
//舵机模块需要继承PWM文件的功能
#include "PWM.h"

//舵机初始化函数
void Servo_Init(void)
{
	PWM_Init();
}

/*
0        500
180      2500
*/
//线性映射
void Servo_SetAngle(float Angle)
{
	PWM_SetCompare2(Angle / 180 * 2000 + 500);
}

servo.h

#ifndef __SERVO_H
#define __SERVO_H

void Servo_Init(void);
void Servo_SetAngle(float Angle);


#endif

PWM驱动直流电机

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Motor.h"
#include "Key.h"

//通过按键控制电机转速(全局变量)
uint8_t KeyNum;
int8_t Speed;

int main(void)
{
	OLED_Init();
	Motor_Init();
	Key_Init();
	
	Motor_SetSpeed(2);
	
	OLED_ShowString(1,1,"Speed:");

	while (1)
	{
		//实现按键控制速度
		KeyNum = Key_GetNum();
		if(KeyNum == 1)
		{
			Speed += 20;
			if(Speed > 100)
			{
				Speed = -100;
			}
		}
		if(KeyNum == 2)
		{
			Speed -= 10;
			if(Speed < -100)
			{
				Speed = 100;
			}
		}
		Motor_SetSpeed(Speed);
		OLED_ShowNum(1,7,Speed,3);
	}
}

pwm.c

#include "stm32f10x.h"                  // Device header

void PWM_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;		 //PWM电平输出的GPIO口,控制速度
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	//初始化时基单元
	TIM_InternalClockConfig(TIM2);
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;		//ARR周期
	TIM_TimeBaseInitStructure.TIM_Prescaler = 36 - 1;		//PSC预分频器
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
	//初始化输出比较单元(即初始化通道)
	TIM_OCInitTypeDef TIM_OCInitStructure;
	//给结构体赋初始值,如果不想把所有成员都列一遍赋值,可以先用structInit赋值,再更改想要修改的值
	TIM_OCStructInit(&TIM_OCInitStructure);
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;          //输出比较模式,PWM模式1
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  //设置输出比较的极性,高极性,就是极性不翻转,REF波形直接输出
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  //设置输出使能
	TIM_OCInitStructure.TIM_Pulse = 0;		//设置CCR
	//在TIM2的OC3通道上就可以输出PWM波形了,但最终这个波形需要借用GPIO口才能输出
	TIM_OC3Init(TIM2, &TIM_OCInitStructure);
	
	TIM_Cmd(TIM2, ENABLE);
}
//该函数单独设置通道1的CCR值。 
void PWM_SetCompare3(uint16_t Compare)
{
	TIM_SetCompare3(TIM2, Compare);
}

pwm.h

#ifndef __PWM_H
#define __PWM_H

void PWM_Init(void);                    //PWM初始化                  
void PWM_SetCompare3(uint16_t Compare); //设置CCR,改变占空比

#endif

motor.c

#include "stm32f10x.h" 
//继承PWM
#include "PWM.h"

//初始化电机
void Motor_Init(void)
{
	//电机模块里多了控制方向的两个引脚
	//额外初始化方向控制的两个引脚
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;  //初始化电机控制方向的两个GPIO口
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	PWM_Init();
}
//通过PWM_Setcompare来设置占空比来设置转速
//设置电机速度的函数,参数需要给带符号的速度变量,负数用来表示反转
void Motor_SetSpeed(int8_t Speed)
{
	if(Speed >= 0)
	{
		GPIO_SetBits(GPIOA,GPIO_Pin_4);    //PA4=1
		GPIO_ResetBits(GPIOA,GPIO_Pin_5);  //PA5 = 0
		PWM_SetCompare3(Speed);
	}
	if(Speed < 0)
	{
		GPIO_SetBits(GPIOA,GPIO_Pin_5);  //PA5 = 1
		GPIO_ResetBits(GPIOA,GPIO_Pin_4);  //PA4 = 0
		PWM_SetCompare3(-Speed);   //配置CCR的值
	}
}

motor.h

#ifndef __MOTOR_H
#define __MOTOR_H

void Motor_Init(void);
void Motor_SetSpeed(int8_t Speed);

#endif

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

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

相关文章

HarmoryOS Ability页面的生命周期

接入穿山甲SDK app示例&#xff1a; android 数独小游戏 经典数独休闲益智 广告接入示例: Android 个人开发者如何接入广告SDK&#xff0c;实现app流量变现 Ability页面的生命周期 学习前端&#xff0c;第一步最重要的是要理解&#xff0c;页面启动和不同场景下的生命周期的…

老师们居然这样把期末考试成绩发给家长——群发成绩系统的妙用

在现代社会&#xff0c;随着科技的发展和教育的进步&#xff0c;家校之间的沟通方式也在不断更新和完善。其中&#xff0c;群发成绩系统作为一种新型的教育信息化工具&#xff0c;在期末考试成绩的传递方面发挥了重要作用。老师们通过群发成绩系统&#xff0c;将期末考试成绩快…

合合TextIn团队发布 - 文档图像多模态大模型技术发展、探索与应用

合合信息TextIn&#xff08;Text Intelligence&#xff09;团队在2023年12月31日参与了中国图象图形学学会青年科学家会议 - 垂直领域大模型论坛。在会议上&#xff0c;丁凯博士分享了文档图像大模型的思考与探索&#xff0c;完整阐述了多模态大模型在文档图像领域的发展与探索…

在pycharm中执行 os.makedirs 提示用户名或密码不正确

问题&#xff1a;在pycharm中运行脚本&#xff0c;在 \10.0.21.249\share 共享目录下创建目录提示错误 发现&#xff1a;手动在该目录下创建目录没有问题。 解决方法&#xff1a; 切换到cmd 命令行运行该脚本成功创建 猜测&#xff1a;感觉应该是pycharm中使用的用户名和密码存…

医疗设备产生谐波对配电系统危害有哪些

1.对电网的影响 电网中的谐波会增加系统损耗&#xff0c;使设备发热&#xff0c;影响设备使用寿命。此外当并联的无功补偿电容器容抗与系统感抗匹配时&#xff0c;将发生n次并联谐振&#xff0c;造成电容器组的过电压和过电流。当基波频率为时&#xff0c;谐振频率&#xff0c…

【重磅新品】小眼睛科技推出紫光同创盘古系列FPGA开发板套件,盘古200K开发板,紫光同创PG2L200H,Logos2系列

FPGA&#xff0c;即现场可编程门阵列&#xff0c;作为可重构电路芯片&#xff0c;已经成为行业“万能芯片”&#xff0c;在通信系统、数字信息处理、视频图像处理、高速接口设计等方面都有不俗的表现。近几年&#xff0c;随着国家战略支持和产业发展&#xff0c;国产FPGA迎来迅…

LLM(九)| 使用LlamaIndex本地运行Mixtral 8x7大模型

欧洲人工智能巨头Mistral AI最近开源Mixtral 8x7b大模型&#xff0c;是一个“专家混合”模型&#xff0c;由八个70亿参数的模型组成。Mistral AI在一篇博客文章&#xff08;https://mistral.ai/news/mixtral-of-experts/&#xff09;介绍了Mixtral 8x7b&#xff0c;在许多基准上…

代码随想录算法训练营第十五天| 二叉树 513. 找树左下角的值 112. 路径总和 106.从中序与后序遍历序列构造二叉树

513. 找树左下角的值 层序遍历 本题用层序遍历可以直接秒了&#xff0c;直接提取每一层中最左边的元素&#xff08;i0&#xff09;&#xff0c;然后保存到最后一层即可。 class Solution { public:int findBottomLeftValue(TreeNode* root) {queue<TreeNode*> que;int…

【金猿人物展】东方金信董事长兼总经理王伟哲:价值化、智能化驱动下的大数据,治理仍需深化...

‍ 王伟哲 本文由东方金信董事长兼总经理王伟哲撰写并投递参与“数据猿年度金猿策划活动——2023大数据产业年度趋势人物榜单及奖项”评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 2023年&#xff0c;数据要素、公共数据授权运营成为热点话题&#xff0c;也是激活数据…

Flume基础知识(二):Flume安装部署

1. Flume 安装部署 1.1 安装地址 &#xff08;1&#xff09;Flume 官网地址&#xff1a;Welcome to Apache Flume — Apache Flume &#xff08;2&#xff09;文档查看地址&#xff1a;Flume 1.11.0 User Guide — Apache Flume &#xff08;3&#xff09;下载地址&#xf…

Halcon计算封闭区域(孔洞)的面积area_holes

Halcon计算封闭区域&#xff08;孔洞&#xff09;的面积 除了可以用area_center 算子计算区域的面积以外&#xff0c;在Halcon中还可以使用area_holes算子计算图像中封闭区域&#xff08;孔洞&#xff09;的面积。该面积指的是区域中孔洞部分包含的像素数。一个区域中可能不只…

深入了解Swagger注解:@ApiModel和@ApiModelProperty实用指南

在现代软件开发中&#xff0c;提供清晰全面的 API 文档 至关重要。ApiModel 和 ApiModelProperty 这样的代码注解在此方面表现出色&#xff0c;通过增强模型及其属性的元数据来丰富文档内容。它们的主要功能是为这些元素命名和描述&#xff0c;使生成的 API 文档更加明确。 Api…

解读 $mash 通证 “Fair Launch” 规则(Staking 玩法解读篇)

Solmash 是 Solana 生态中由社区主导的铭文资产 LaunchPad 平台&#xff0c;该平台旨在为 Solana 原生铭文项目&#xff0c;以及通过其合作伙伴 SoBit 跨链桥桥接到 Solana 的 Bitcoin 生态铭文项目提供更广泛的启动机会。有了 Solmash&#xff0c;将会有更多的 Solana 生态的铭…

静态网页设计——电影推荐网(HTML+CSS+JavaScript)

前言 声明&#xff1a;该文章只是做技术分享&#xff0c;若侵权请联系我删除。&#xff01;&#xff01; 感谢大佬的视频&#xff1a; https://www.bilibili.com/video/BV1NK411x7oK/?vd_source5f425e0074a7f92921f53ab87712357b 使用技术&#xff1a;HTMLCSSJS&#xff08;…

C语言编译器(C语言编程软件)完全攻略(第十二部分:VS2010下载地址和安装教程(图解))

介绍常用C语言编译器的安装、配置和使用。 十二、VS2010下载地址和安装教程&#xff08;图解&#xff09; 为了更好地支持 Win7 程序的开发&#xff0c;微软于2010年4月12日发布了 VS2010&#xff0c;它的界面被重新设计&#xff0c;变得更加简洁。需要注意的是&#xff0c;V…

crontab 创建定时任务

1、创建crontab任务 crontab -ecrontab内容 */59 * * * * sh /home/restartAllSlave.sh >> /home/my-restartAllSlave.log 2>&12、创建执行脚本&#xff08;restartAllSlave.sh&#xff09; docker重启如下&#xff1a; docker restart slave_zllrp_gb_1 slav…

开源分布式任务调度系统DolphinScheduler本地部署与远程访问

文章目录 前言1. 安装部署DolphinScheduler1.1 启动服务 2. 登录DolphinScheduler界面3. 安装内网穿透工具4. 配置Dolphin Scheduler公网地址5. 固定DolphinScheduler公网地址 前言 本篇教程和大家分享一下DolphinScheduler的安装部署及如何实现公网远程访问&#xff0c;结合内…

web服务器nginx和Apache有什么区别?

随着互联网的快速发展&#xff0c;Web服务器在互联网应用中扮演着越来越重要的角色。其中&#xff0c;Nginx和Apache是两种广泛使用的Web服务器软件。尽管它们都可以实现Web服务器的功能&#xff0c;但Nginx和Apache在许多方面存在一些重要的区别。本文将探讨Nginx和Apache之间…

STC进阶开发(四)SPI协议、矩阵键盘、EEPROM

前言 这一期我们简单介绍一下SPI协议&#xff0c;然后我们学习一下矩阵键盘&#xff0c;了解EEPROM是干什么用的&#xff0c;话不多说&#xff0c;开整&#xff01; SPI协议 SPI&#xff08;Serial Peripheral Interface&#xff09;是一种同步串行通信协议&#xff0c;用于在…

【MLOps】使用Ray缩放AI

Ray正在人工智能工程领域崭露头角&#xff0c;对扩展LLM和RL至关重要 Spark在数据工程中几乎是必不可少的。Ray正在人工智能工程领域崭露头角。 雷是伦敦大学学院Spark的继任者。Spark和Ray有很多相似之处&#xff0c;例如用于计算的统一引擎。但Spark主要专注于大规模数据分析…