04:TIM定时器功能---输出比较功能(PWM)

news2025/1/12 19:59:26

目录

一:TIM输出比较功能

1: 简历

2:PWM波形

 3:输出比较模式

4:参数计算

5:PWM基本结构

 6:输出比较功能的实际应用

A:PWM驱动LED呼吸灯

1:连接图

2:步骤

 3:函数介绍

4:代码

B:PWM驱动舵机

1:连接图

2:舵机介绍

3:步骤

4:代码

C:PWM驱动直流电机 

1:连接图

 2:电机与驱动电路

3:代码


一:TIM输出比较功能

1: 简历

        OC(Output Compare)输出比较

        输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形

         每个高级定时器和通用定时器都拥有4个输出比较通道

        高级定时器的前3个通道额外拥有死区生成和互补输出的功能

2:PWM波形

        PWM(Pulse Width Modulation)脉冲宽度调制

        在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,常应用于电机控速等领域

        PWM参数:      频率 = 1 / TS            占空比 = TON / TS           分辨率 = 占空比变化步距

 

 3:输出比较模式

 配置比较单元时使用TIM_OCXInit()

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择PWM1的模式

4:参数计算

5:PWM基本结构

 6:输出比较功能的实际应用

A:PWM驱动LED呼吸灯

1:连接图

2:步骤

1 :RCC开启时钟,(TIM外设---RCC_APB1PeriphClockCmd和GPIO外设----RCC_APB2PeriphClockCmd的时钟打开)

2: 配置GPIO----GPIO_Init    (最后写第二步)

3: 时钟选择----TIM_InternalClockConfig(内部)

4: 配置时基单元-----TIM_TimeBaseInit()

5: 配置输出比较单元----TIM_OC1Init()

6:启动定时器-----TIM_Cmd

 3:函数介绍

在stm32f10x tim.h文件中的函数-----配置输出比较单元函数

void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);

TIM_OCXInit : 配置输出比较单元 

在stm32f10x tim.h文件中的函数

void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct);

 TIM_OCStructInit : 给输出比较结构体赋一个默认的值

在stm32f10x tim.h文件中的函数-----改变占空比函数

void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);
void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2);
void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3);
void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4);

 TIM_SetCompareX :  来单独更改CCR寄存器值的函数,可以更改占空比

4:代码

每次调用修改它的占空比,以达到呼吸灯的作用


#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "PWM.h"
void PWM_init(){
	//第一步,RCC开启时钟,把我们要用的TIM外设和GPIO外设的时钟打开
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	//第二步,配置GPIO
	GPIO_InitTypeDef GPIO_INITStruct;
	GPIO_INITStruct.GPIO_Mode=GPIO_Mode_AF_PP;  //复用推挽输出
	GPIO_INITStruct.GPIO_Pin=GPIO_Pin_0 ;
	GPIO_INITStruct.GPIO_Speed= GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_INITStruct);
	//第三步,时钟源选择(内部时钟)
	TIM_InternalClockConfig(TIM2);
	//第四步,配置时基单元
	TIM_TimeBaseInitTypeDef TIM_INITStruct;
	TIM_INITStruct.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_INITStruct.TIM_CounterMode=TIM_CounterMode_Up;  向上计数
	TIM_INITStruct.TIM_Period=100-1;     ///自动重装载寄存器ARR
	TIM_INITStruct.TIM_Prescaler=720-1;    // //预分频器PSC
	TIM_INITStruct.TIM_RepetitionCounter=0;
	TIM_TimeBaseInit(TIM2,&TIM_INITStruct);
	//第五步,配置输出比较单元
	TIM_OCInitTypeDef TIM_OCInitStructure;
	TIM_OCStructInit(&TIM_OCInitStructure);//给输出比较结构体赋一个默认的值
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择PWM1的模式
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //有效电频为低电频
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  //使能
	TIM_OCInitStructure.TIM_Pulse = 0;		//CCR
	TIM_OC1Init(TIM2, &TIM_OCInitStructure);
	//第六步,启动定时器
	TIM_Cmd(TIM2,ENABLE);
}

void PWM_SetCompare1(uint16_t Compare)
{
	TIM_SetCompare1(TIM2, Compare);
}



uint8_t i;

int main(void)
{
	OLED_Init();
	PWM_init();
	
	while (1)
	{
		for (i = 0; i <= 100; i++)
		{
			PWM_SetCompare1(i);
			Delay_ms(10);
		}
		for (i = 0; i <= 100; i++)
		{
			PWM_SetCompare1(100 - i);
			Delay_ms(10);
		}
	}
}


为什么选择TIM_OC1Init

 在这里可以看到,有TM2-CH1_ETR它是在这个PAO这一行的 , 这就说明,TIM2的ETR引脚和通道1的引脚都是借用了PAO这个引脚的位置的.  换句话说就是TM2的引脚复用在了PAO引脚上 , 所以说如果我们要使用TIM2的OC1也就是CH1通道,输出PWM, 那它就只能在PA0的引脚上输出一而不能任意选择引脚输出;    PA0输出PWM波形

为什么选择TIM_SetCompare1

因为使用的是TIM_OC1Init  CH1通道

 TIM_SetCompareX :  来单独更改CCR寄存器值的函数,可以更改占空

 引脚重定义

 

那首先,要使用AFIO,就要开启AFIO的时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

引脚重映射

void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);

   GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2,ENABLE);//部分重映射1

 将PA0改为PA15

因为PA15在它上电后已经默认复用为了调试端回TDIT,如果想让他作为普通的GPIO或者复用定时器的通道, 需要先关闭调试端口的复用(需要谨慎)

    //PA15、PB3、PB4这三个引脚当做GPIO来使用的话
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//解除JTAG复用(解除重映射端口)
	//想重映射定时器或者其他外设的复用引脚
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2,ENABLE);//GPIO_PartialRemap1_TIM2部分重映射1
	//如果重新映射的使调式端口使用
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2,ENABLE);//GPIO_PartialRemap1_TIM2部分重映射1
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);解除JTAG复用(解除重映射端口)
	

 GPIO调式 选择复用推挽输出

GPIO_INITStruct.GPIO_Mode=GPIO_Mode_AF_PP;  //复用推挽输出
输出控制权将转移给片上外设,PWM波形才能通过引脚输出

计算 

PWM频率:        Freq = CK_PSC / (PSC + 1) / (ARR + 1)

PWM占空比:    Duty = CCR / (ARR + 1)

PWM分辨率:    Reso = 1 / (ARR + 1)

CK_PSC=72MHZ           PSC=TIM_INITStruct.TIM_Prescaler=;    // //预分频器PSC

ARR=    TIM_INITStruct.TIM_Period=;     ///自动重装载寄存器ARR

CRR=    TIM_OCInitStructure.TIM_Pulse = ;        //CCR

分辨率 = 占空比变化步距

频率为1KHz,占空比为50%,分辨率为1%的PWM波形

 

B:PWM驱动舵机

1:连接图

 红色-----接USE5V(3v带不动)

橙色-----信号线              棕色---地线

2:舵机介绍

        舵机是一种根据输入PWM信号占空比来控制输出角度的装置

        输入PWM信号要求:周期为20ms,高电平宽度为0.5ms~2.5ms

 高电平宽度=某电频的持续时间

CCR=高电频

舵机的控制一般需要一个20ms的时基脉冲(周期),该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。以180度角度舵机为例,那么对应的控制关系是这样的:
0.5ms--------------0度;
1.0ms------------45度;
1.5ms------------90度;
2.0ms-----------135度;
2.5ms-----------180度;

3:步骤

1 :RCC开启时钟,(TIM外设---RCC_APB1PeriphClockCmd和GPIO外设----RCC_APB2PeriphClockCmd的时钟打开)

2: 配置GPIO----GPIO_Init    (最后写第二步)

3: 时钟选择----TIM_InternalClockConfig(内部)

4: 配置时基单元-----TIM_TimeBaseInit()

5: 配置输出比较单元----TIM_OC2Init()

6:启动定时器-----TIM_Cmd

4:代码

这个使用的是CH2通道, 上面的LED使用的是CH2通道

使用: TIM_SetCompareX和TIM_OCXInit 函数都有换改为相对应的X值

X应为2.见下面的引脚定义表

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Servo.h"
#include "Key.h"
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_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;
	TIM_OCStructInit(&TIM_OCInitStructure);
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse = 0;		//CCR
	TIM_OC2Init(TIM2, &TIM_OCInitStructure);
	
	TIM_Cmd(TIM2, ENABLE);
}

void PWM_SetCompare2(uint16_t Compare)
{
	TIM_SetCompare2(TIM2, Compare);
}


void Servo_Init(void)
{
	PWM_Init();
}

void Servo_SetAngle(float Angle)
{
	PWM_SetCompare2(Angle / 180 * 2000 + 500);
}


void Key_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
}

uint8_t Key_GetNum(void)
{
	uint8_t KeyNum = 0;
	if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)
	{
		Delay_ms(20);
		while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0);
		Delay_ms(20);
		KeyNum = 1;
	}
	if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0)
	{
		Delay_ms(20);
		while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0);
		Delay_ms(20);
		KeyNum = 2;
	}
	
	return KeyNum;
}

uint8_t KeyNum;
float Angle;

int main(void)
{
	OLED_Init();
	Servo_Init();
	Key_Init();
	
	OLED_ShowString(1, 1, "Angle:");
	
	while (1)
	{
		KeyNum = Key_GetNum();
		if (KeyNum == 1)
		{
			Angle += 30;
			if (Angle > 180)
			{
				Angle = 0;
			}
		}
		Servo_SetAngle(Angle);
		OLED_ShowNum(1, 7, Angle, 3);
	}
}

计算

 TIM_SetCompareX :  来单独更改CCR寄存器值的函数,可以更改占空比

 

引脚定义表

 舵机的信号线与PA1连接所以使用的是CH2通道2,使用X为2;     PA1输出PWM波形

C:PWM驱动直流电机 

1:连接图

 2:电机与驱动电路

        直流电机是一种将电能转换为机械能的装置,有两个电极,当电极正接时,电机正转,

        当电极反接时,电机反转直流电机属于大功率器件,GPIO口无法直接驱动,需要配合电机驱动电路来操作
        TB6612是一款双路H桥型的直流电机驱动芯片,可以驱动两个直流电机并且控制其转速和方向

 

 电机驱动详情见: 51:电机(ULN2003D)这一篇

3:代码

#include "stm32f10x.h"                  // Device header
#include "OLED.h"
#include "PWM.h"
#include "motor.h"
#include "Key.h"
void PWM_init(){
	//第一步,RCC开启时钟,把我们要用的TIM外设和GPIO外设的时钟打开
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	

	//第二步,配置GPIO
	GPIO_InitTypeDef GPIO_INITStruct;
	GPIO_INITStruct.GPIO_Mode=GPIO_Mode_AF_PP;  //复用推挽输出
	GPIO_INITStruct.GPIO_Pin=GPIO_Pin_2 ;
	GPIO_INITStruct.GPIO_Speed= GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_INITStruct);
	//第三步,时钟源选择(内部时钟)
	TIM_InternalClockConfig(TIM2);
	//第四步,配置时基单元
	TIM_TimeBaseInitTypeDef TIM_INITStruct;
	TIM_INITStruct.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_INITStruct.TIM_CounterMode=TIM_CounterMode_Up;  向上计数
	TIM_INITStruct.TIM_Period=100-1; 
	TIM_INITStruct.TIM_Prescaler=720-1;
	TIM_INITStruct.TIM_RepetitionCounter=0;
	TIM_TimeBaseInit(TIM2,&TIM_INITStruct);
	//第五步,配置输出比较单元
	TIM_OCInitTypeDef TIM_OCInitStructure;
	TIM_OCStructInit(&TIM_OCInitStructure);//给输出比较结构体赋一个默认的值
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择PWM1的模式
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //有效电频为低电频
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  //使能
	TIM_OCInitStructure.TIM_Pulse = 0;		//CCR
	TIM_OC3Init(TIM2, &TIM_OCInitStructure);
	//第六步,启动定时器
	TIM_Cmd(TIM2,ENABLE);
}

void PWM_SetCompare3(uint16_t Compare)
{
	TIM_SetCompare3(TIM2, Compare);
}
void motor_init(){
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	GPIO_InitTypeDef GPIO_INITstruct;
	GPIO_INITstruct.GPIO_Mode=GPIO_Mode_IPU;//GPIO_Mode_Out_PP  //GPIO_Mode_IPU
	GPIO_INITstruct.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5;
	GPIO_INITstruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_INITstruct);
	PWM_init();
}

void motor_serspeed(int8_t speed){
	if(speed >=0){
		GPIO_SetBits(GPIOA,GPIO_Pin_5);  //高电频
		GPIO_ResetBits(GPIOA,GPIO_Pin_4); //低电频
		PWM_SetCompare3(speed);
	}
	else
	{	
		GPIO_SetBits(GPIOA,GPIO_Pin_4);  //高电频
		GPIO_ResetBits(GPIOA,GPIO_Pin_5); //低电频
		//传穿过来的speed为负数,要变为正,所以要加一个负号;
		PWM_SetCompare3(-speed);
	}
}
void Key_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
}

uint8_t Key_GetNum(void)
{
	uint8_t KeyNum = 0;
	if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)
	{
		Delay_ms(20);
		while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0);
		Delay_ms(20);
		KeyNum = 1;
	}
	if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0)
	{
		Delay_ms(20);
		while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0);
		Delay_ms(20);
		KeyNum = 2;
	}
	
	return KeyNum;
}


uint8_t key_num;
int8_t speed;  //速度必须是有符号的
int main(void)
{
	Key_Init();
	OLED_Init();
	motor_init();
	
	OLED_ShowString(1,1,"speed:");
	
	while (1)
		
	{	
		key_num=Key_GetNum();
		if (key_num==1){
			speed+=20;
			if(speed>100){
				speed=-100;
			}
		}
			motor_serspeed(speed);
			OLED_ShowSignedNum(1, 7, speed, 3);
	}
	
	
	}
	

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

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

相关文章

常见改机软件及其原理

1. 改机原理分析 1.1 IOS设备改机原理 在iOS上目前所有流行的改机工具&#xff0c;本质上是利用substrate框架对某些用来获取设备和系统参数函数进行hook&#xff0c;从而欺骗App达到修改的目的&#xff0c;具体如下&#xff1a; 用作获取设备参数的函数&#xff0c;无论是C函…

PyQty5—第二课:按钮与函数绑定(1)(附完整代码)

在上一节课中我们学会了PyQty5的安装&#xff0c;以及两个环境的配置&#xff0c;那么今天这节课我们学习一下窗口部件如按钮&#xff0c;和我们函数的绑定&#xff0c;这个学会了&#xff0c;我们就可以自己设计界面自己写函数&#xff0c;从而设计出自己的小工具 1、那么首先…

在线word转pdf免费去哪里好?这个网站可以轻松实现!

很多朋友在保存word文档内容的时候&#xff0c;都想把它转换为pdf格式的&#xff0c;因为这种文档比较安全&#xff0c;不能轻易的进行修改&#xff0c;那么在线word转pdf免费去哪里好呢?这个网站可以轻松实现&#xff0c;下面就来说说。 在线word转pdf免费去哪里好? 我们可…

resultType和paramstype的区别

文章目录 1. resultType&#xff1a;2. parameterType&#xff1a;3. 总结看这里就够啦&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;举例 1. resultType&#xff1a; 返回值类型&#xff0c;类型即为对象类型&#xff0c;返回结果字段与对象属性…

C++对象模型分析

class 是一种特殊的 struct 在内存中 class 依旧可以看作变量的集合 class 和 struct 遵循相同的内存对齐原则 class 中的成员函数和成员变量是分开存放的 每个对象有独立的成员变量所有对象共享类中的成员函数 值得思考的问题 运行时的对象退化为结构体的形式 所有成员变…

2023年上半年软考单独划线地区可以申领证书

根据软考办《关于2023年上半年计算机软件资格考试在部分地区单独划定合格标准有关事项的通知》可以得知&#xff0c;符合单独划线地区的&#xff0c;大家可以在2023年8月21日9:00-9月4日17:00申请单独划线。 单独划线申请方法&#xff1a; 报名入口&#xff1a;https://www.r…

易思智能物流无人值守系统文件上传漏洞

易思智能物流无人值守系统文件上传漏洞 一、 产品简介二、 漏洞概述三、 影响范围四、 复现环境五、 漏洞复现小龙poc检测 六、修复建议 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接…

【附安装包】Moldflow2023安装教程

软件下载 软件&#xff1a;Moldflow版本&#xff1a;2023语言&#xff1a;简体中文大小&#xff1a;5.55G安装环境&#xff1a;Win11/Win10/Win8/Win7硬件要求&#xff1a;CPU2.0GHz 内存4G(或更高&#xff09;下载通道①百度网盘丨64位下载链接&#xff1a;https://pan.baidu…

innovus set_ccopt_property insertion_delay

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 set_ccopt_property insertion_delay -pin A/CP $value value的值是负的&#xff0c;意思是需要把A/CP tree做长&#xff0c;正值就是告诉这里有这么长&#xff0c;工具就会把…

vue2+qrcodejs2+clipboard——实现二维码展示+下载+复制到剪切板——基础积累

最近在写后台管理系统时&#xff0c;遇到一个需求就是要实现二维码的展示下载复制到剪切板。 效果图如下&#xff1a; 1.二维码展示下载功能——qrcodejs20.0.2 我是安装的qrcodejs20.0.2&#xff0c;指定了具体的版本号&#xff0c;也可以安装默认的当前稳定版本&#xff0…

Scikit-learn降维与度量学习代码批注及相关练习

一、代码批注 代码来自&#xff1a;https://scikit-learn.org/stable/auto_examples/decomposition/plot_pca_iris.html#sphx-glr-auto-examples-decomposition-plot-pca-iris-py import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes…

Ruoyi安装部署(linux环境、前后端不分离版本)

目录 简介 1 新建目录 2 安装jdk 2.1 jdk下载 2.2 解压并移动文件夹到/data/service目录 2.3 配置环境变量 3 安装maven 3.1 进入官网下载最新的maven 3.2 解压并移动文件夹到/data//service目录 3.3 配置环境变量 3.4 配置本地仓库地址与阿里云镜像 4 安装git 4.…

Linux centos7 高频词统计

如何统计文章中高频词?是我们经常遇到的问题&#xff0c;也是多场合考察个人知识整合能力的重要手段。招聘经典问题&#xff1a;linux中命令行统计文件中前10个高频词。 在讨论此问题中&#xff0c;主要应用到的知识点有&#xff1a;排序、去重、单词查询、grep、sed和awk使用…

AWS解决方案日:Web 3业务安全方案

近日&#xff0c;AWS合作伙伴之Web3解决方案日在香港举办&#xff0c;多家科技公司专家和企业代表就WEB 3.0方案、AI创新和Web 3.0安全进行了探讨。顶象现场展示了Web 3.0业务安全解决方案。 NFT是Web 3.0典型场景之一。NFT基于区块链技术的非同质化代币&#xff0c;具有不可分…

行为型(七) - 访问者模式

一、概念 访问者模式&#xff08;Visitor Pattern&#xff09;&#xff1a;我们使用了一个访问者类&#xff0c;改变元素类的执行算法。通过这种方式&#xff0c;元素的执行算法可以随着访问者改变而改变。 优点&#xff1a;把业务操作跟具体的数据结构解耦。 二、实现 我们…

利用ANARCI标识CDR区域

brief 总有一些朋友丢给我一些抗体蛋白序列,希望我把抗体的框架区和高变区标识出来。 然后ANARCI 可以对抗蛋白序列的氨基酸进行编号和allign。 所以我想ANARCI可以解决这个问题。 安装 github开源软件: https://github.com/oxpig/ANARCI 也有网页版的: https://opig.st…

Quickstart: MinIO for Linux

单节点部署教程 1.安装Minio服务端 //wget下载二进制文件 wget https://dl.min.io/server/minio/release/linux-amd64/minio //赋予权限 chmod x minio //将minio可执行文件移入usr/local/bin目录下&#xff0c;使得minio可以全局执行 sudo mv minio /usr/local/bin/ 2.启动Mi…

React基础入门之虚拟Dom

React官方文档&#xff1a;https://react.docschina.org/ 说明 重要提示&#xff1a;本系列文章基础篇总结自尚硅谷课程&#xff0c;且采用类式写法&#xff01;&#xff01;最新的函数式组件写法见高级篇。 本系列文档旨在帮助vue同学更快速的学习react&#xff0c;如果你很…

OpenAI推出GPT-3.5Turbo微调功能并更新API;Midjourney更新局部绘制功能

&#x1f989; AI新闻 &#x1f680; OpenAI推出GPT-3.5Turbo微调功能并更新API&#xff0c;将提供GPT-4微调功能 摘要&#xff1a;OpenAI宣布推出GPT-3.5Turbo微调功能&#xff0c;并更新API&#xff0c;使企业和开发者能够定制ChatGPT&#xff0c;达到或超过GPT-4的能力。通…

如何使用装rancher安装k8s集群(k8s集群图形化管理工具)

前言 kubernetes集群的图形化管理工具主要有以下几种&#xff1a; 1、 Kubernetes Dashborad: Kubernetes 官方提供的图形化工具 2、 Rancher: 目前比较主流的企业级kubernetes可视化管理工具 3、各个云厂商Kubernetes集成的管理器 4、 Kuboard: 国产开源Kubernetes可视化管理…