stm32入门-----TIM定时器(PWM输出比较——下)

目录

前言

一、硬件元器件介绍

1.舵机

2.直流电机驱动

二、C语言编程步骤

 1.开启时钟

2.配置输出的GPIO口

3.配置时基单元

 4.初始化输出比较通道

5.开启定时器

三、实践项目

1.PWM驱动LED呼吸灯

2.PWM驱动舵机

3.PWM驱动直流电机


前言

        本期我们就开始去进行TIM定时器的输出比较功能的实操了,如果有什么疑惑的可以去看一下上一期理论的知识点(上一期链接:stm32入门-----TIM定时器(PWM输出比较——上)-CSDN博客)这里就分为三个部分的项目,分别是PWM驱动LED呼吸灯,PWM驱动直流电机转动和PWM驱动舵机。(视频:[6-4] PWM驱动LED呼吸灯&PWM驱动舵机&PWM驱动直流电机_哔哩哔哩_bilibili)

一、硬件元器件介绍

1.舵机

  • 舵机是一种根据输入PWM信号占空比来控制输出角度的装置
  •    输入PWM信号要求:周期为20ms,高电平宽度为0.5ms~2.5ms

 舵机里面本身就是有一个驱动电路板的,所以我们只需要给这个舵机通上电以及输入PWM波形就可以控制这个舵机了,内部电路结构就不需要多去了解。根据输入信号的高电平占比不同,舵机就会转动不同的角度(舵机不是一直转动的,当且仅当输入信号PWM发生改变的时候才会转动,转动就之转一定角度,转玩了就保持静止状态)。

电路图:

2.直流电机驱动

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

由于直流电机不像舵机那样有驱动电路,所以我们需要外接一个驱动电路的芯片这里,我们就选择TB6612来驱动直流电机,驱动芯片不知这一种,还是有挺多的,比如L298这个还是挺常见的。

TB6612驱动是双路的,分为AO和BO口,下面电路图展示了这个驱动电路的接线方式,VM是用来接外接电源的,这个可以给到高电压的电源,这个驱动电路可以实现低电压PWM信号驱动高电压电机,AIN2,AIN1是表示转动的方向,PWMA是表示输入的PWM信号。

硬件电路:

二、C语言编程步骤

看到下图的流程,我们只需要把这些通路给打开就行了,这样就可以实现定时器的输出比较功能。

 1.开启时钟

时钟包括定时器的时钟和GPIO口的输出时钟

 //1.开启定时器时钟,TIM2总线是为APB1的RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);TIM_InternalClockConfig(TIM2);  //给TIM2选择时钟 为内部时钟,定时器默认是使用内部的时钟,不写这一行也行的

2.配置输出的GPIO口

 //2.配置GPIO口, PA0 为输出口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);

3.配置时基单元

  • PWM频率:  Freq = CK_PSC / (PSC + 1) / (ARR + 1)
  • PWM占空比:  Duty = CCR / (ARR + 1)
  • PWM分辨率:  Reso = 1 / (ARR + 1)

根据上面这些公式我们来去计算出想要的波形效果,再去进行配置。 

 //3.配置时基单元TIM_TimeBaseInitTypeDef TIM_timebasestruct;//下面两个是运行控制操作值TIM_timebasestruct.TIM_ClockDivision=TIM_CKD_DIV1;//对输入信号进行初步分频,内部时钟72Mhz信号TIM_timebasestruct.TIM_CounterMode=TIM_CounterMode_Up;//计数方式选择向上计数//以下三个是时基单元里面的实际参数值/* 计数器溢出频率:CK_CNT_OV = CK_CNT / (ARR + 1)= CK_PSC / (PSC + 1) / (ARR + 1) */TIM_timebasestruct.TIM_Period=100-1;  //计数器的重装值,目标值  ARRTIM_timebasestruct.TIM_Prescaler=720-1; //预分频器的值          PSCTIM_timebasestruct.TIM_RepetitionCounter=0;//重复计数功能,这个是高级计数器才有的,当前选择的是通用计数器,设置0即可TIM_TimeBaseInit(TIM2,&TIM_timebasestruct);

 4.初始化输出比较通道

//4.初始化输出比较通道,这里以OC1通道为示例TIM_OCInitTypeDef TIM_ocinitstruct;//配置输出比较通道结构体TIM_OCStructInit(&TIM_ocinitstruct);//给这个结构体设置默认初始值,避免改为使用高级定时器的时候出错//下面是使用通用定时器的部分,就拉出来单独修改,其余是高级定时器的东西就不去改,保持默认值就行了TIM_ocinitstruct.TIM_OCMode=TIM_OCMode_PWM1;//PWM选择输出比较工作模式,八选一TIM_ocinitstruct.TIM_OCPolarity=TIM_OCPolarity_High;//选择输出极性,当ref为高电平的时候就输出保持不变,还有其他两种一个是低电平,另一个是翻转TIM_ocinitstruct.TIM_OutputState=TIM_OutputState_Enable;//输出使能,开启输出比较通道使能TIM_ocinitstruct.TIM_Pulse=0;  //CCR的初始值,我们要去进行比较的数TIM_OC1Init(TIM2,&TIM_ocinitstruct);

已知是使用内部定时器,频率72MHz, 这里我们可以计算出输出波形的频率为:72MHz / 720*100=100Hz ,PWM占空比:0 / 100 =0(当前初始值为0的)

5.开启定时器

//5.开启定时器TIM_Cmd(TIM2,ENABLE);//开启定时器

三、实践项目

本次项目的代码都在百度网盘,可自行下载。

链接:https://pan.baidu.com/s/10fNUjkPm1WmvSoK0gkCiRA?pwd=0721 
提取码:0721

1.PWM驱动LED呼吸灯

先看现象:

LED呼吸灯

电路连接图:

项目文件:

PWM.c代码:

#include "stm32f10x.h"                  // Device headervoid PWM_init(){//1.开启定时器时钟,TIM2总线是为APB1的RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);TIM_InternalClockConfig(TIM2);  //给TIM2选择时钟 为内部时钟,定时器默认是使用内部的时钟,不写这一行也行的// RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);// GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2,ENABLE);//设置重映射//GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); //解除像PA15,PB3,PB4 这些端口的调试功能,变为普通的GPIO//2.配置GPIO口, PA0 为输出口GPIO_InitTypeDef GPIO_initstruct; GPIO_initstruct.GPIO_Mode=GPIO_Mode_AF_PP; //使用复用推挽输出,因为这里不是输出寄存器控制的,是片上外设定时器操作的,所以要用到复用推挽输出GPIO_initstruct.GPIO_Pin=GPIO_Pin_0;  //重新映射到15口 GPIO_initstruct.GPIO_Pin=GPIO_Pin_15;GPIO_initstruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_initstruct);//3.配置时基单元TIM_TimeBaseInitTypeDef TIM_timebasestruct;//下面两个是运行控制操作值TIM_timebasestruct.TIM_ClockDivision=TIM_CKD_DIV1;//对输入信号进行初步分频,内部时钟72Mhz信号TIM_timebasestruct.TIM_CounterMode=TIM_CounterMode_Up;//计数方式选择向上计数//以下三个是时基单元里面的实际参数值/* 计数器溢出频率:CK_CNT_OV = CK_CNT / (ARR + 1)= CK_PSC / (PSC + 1) / (ARR + 1) */TIM_timebasestruct.TIM_Period=100-1;  //计数器的重装值,目标值  ARRTIM_timebasestruct.TIM_Prescaler=720-1; //预分频器的值          PSCTIM_timebasestruct.TIM_RepetitionCounter=0;//重复计数功能,这个是高级计数器才有的,当前选择的是通用计数器,设置0即可TIM_TimeBaseInit(TIM2,&TIM_timebasestruct);//4.初始化输出比较通道,这里以OC1通道为示例TIM_OCInitTypeDef TIM_ocinitstruct;//配置输出比较通道结构体TIM_OCStructInit(&TIM_ocinitstruct);//给这个结构体设置默认初始值,避免改为使用高级定时器的时候出错//下面是使用通用定时器的部分,就拉出来单独修改,其余是高级定时器的东西就不去改,保持默认值就行了TIM_ocinitstruct.TIM_OCMode=TIM_OCMode_PWM1;//PWM选择输出比较工作模式,八选一TIM_ocinitstruct.TIM_OCPolarity=TIM_OCPolarity_High;//选择输出极性,当ref为高电平的时候就输出保持不变,还有其他两种一个是低电平,另一个是翻转TIM_ocinitstruct.TIM_OutputState=TIM_OutputState_Enable;//输出使能,开启输出比较通道使能TIM_ocinitstruct.TIM_Pulse=0;  //CCR的值,我们要去进行比较的数TIM_OC1Init(TIM2,&TIM_ocinitstruct);//5.开启定时器TIM_Cmd(TIM2,ENABLE);//开启定时器}//寄存器设置CCR的值,我们要去进行比较的数
void PWM_Setcompare1(uint16_t Compare){TIM_SetCompare1(TIM2,Compare);}

PWM.h代码:

#ifndef __PWM_H
#define __PWM_Hvoid PWM_init();
void PWM_Setcompare1(uint16_t Compare);
#endif // !1

main.c代码:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "PWM.h"int main(void)
{	LED_init();OLED_Init();PWM_init();OLED_ShowString(1,1,"jjjjj:");uint8_t i;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);}}
}

2.PWM驱动舵机

现象:

PWM驱动舵机

实际电路连接图:

项目文件:

其中Servo.c和Servo.h文件是用来封装PWM的。

PWM.c代码:

#include "stm32f10x.h"                  // Device headervoid PWM_init(){//1.开启定时器时钟,TIM2总线是为APB1的RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//配置GPIO口 PA0GPIO_InitTypeDef GPIO_initstruct; GPIO_initstruct.GPIO_Mode=GPIO_Mode_AF_PP; //使用复用推挽输出,因为这里不是输出寄存器控制的,是片上外设定时器操作的,所以要用到复用推挽输出GPIO_initstruct.GPIO_Pin=GPIO_Pin_1; //重新映射到15口 GPIO_initstruct.GPIO_Pin=GPIO_Pin_15;GPIO_initstruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_initstruct);TIM_InternalClockConfig(TIM2);  //给TIM2选择时钟 为内部时钟,定时器默认是使用内部的时钟,不写这一行也行的//2.配置时基单元TIM_TimeBaseInitTypeDef TIM_timebasestruct;//下面两个是运行控制操作值TIM_timebasestruct.TIM_ClockDivision=TIM_CKD_DIV1;//对输入信号进行初步分频,内部时钟72Mhz信号TIM_timebasestruct.TIM_CounterMode=TIM_CounterMode_Up;//计数方式选择向上计数//以下三个是时基单元里面的实际参数值/* 计数器溢出频率:CK_CNT_OV = CK_CNT / (ARR + 1)= CK_PSC / (PSC + 1) / (ARR + 1) */TIM_timebasestruct.TIM_Period=20000-1;  //计数器的重装值,目标值 //ARRTIM_timebasestruct.TIM_Prescaler=72-1; //预分频器的值         //PSCTIM_timebasestruct.TIM_RepetitionCounter=0;//重复计数功能,这个是高级计数器才有的,当前选择的是通用计数器,设置0即可TIM_TimeBaseInit(TIM2,&TIM_timebasestruct);//初始化输出比较通道,这里以OC1通道为示例TIM_OCInitTypeDef TIM_ocinitstruct;//配置输出比较通道结构体TIM_OCStructInit(&TIM_ocinitstruct);//给这个结构体设置默认初始值,避免改为使用高级定时器的时候出错//下面是使用通用定时器的部分,就拉出来单独修改,其余是高级定时器的东西就不去改,保持默认值就行了TIM_ocinitstruct.TIM_OCMode=TIM_OCMode_PWM1;//PWM选择输出比较工作模式,八选一TIM_ocinitstruct.TIM_OCPolarity=TIM_OCPolarity_High;//选择输出极性,当ref为高电平的时候就输出保持不变,还有其他两种一个是低电平,另一个是翻转TIM_ocinitstruct.TIM_OutputState=TIM_OutputState_Enable;//输出使能,开启输出比较通道使能TIM_ocinitstruct.TIM_Pulse=0;  //CCR的值,我们要去进行比较的数//如果想使用多个通道输出同样的波形话,把下面这个初始化复制粘贴改变通道名称就行了/*同一个定时器输出多个PWM通道,是满足 相位一致性,CCR是可以各自设置的,波形的占空比可自定义*/TIM_OC2Init(TIM2,&TIM_ocinitstruct);//5.开启定时器TIM_Cmd(TIM2,ENABLE);//开启定时器}//寄存器设置CCR的值,我们要去进行比较的数
void PWM_Setcompare2(uint16_t Compare){TIM_SetCompare2(TIM2,Compare);}

PWM.h代码:

#ifndef __PWM_H
#define __PWM_H
void PWM_init();
void PWM_Setcompare2(uint16_t Compare);
#endif // !1

 Servo.c代码:

#include "PWM.h"void Servo_init(){PWM_init();}void Servo_setangle(float angle){PWM_Setcompare2(angle/180*2000+500);}

Servo.h代码:

#ifndef __SERVO_H
#define __SERVO_H
void Servo_init();
void Servo_setangle(float angle);
#endif // !__SERVO_H

main.c代码:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Key.h"
#include "Servo.h"uint8_t keynum;
float angle;
int main(void)
{	OLED_Init();Servo_init();Key_init();OLED_ShowString(1,1,"angle:");Servo_setangle(90);while(1){keynum=Keynum();if(keynum==1){angle+=30;if(angle>180)angle=0;}Servo_setangle(angle);OLED_ShowNum(1,7,angle,3);}}

3.PWM驱动直流电机

现象:

直流电机​​​​​

电路连接图:

项目主要文件:

同样的Motor.c 和 Motor.h 文件是用来封装的。

PWM.c代码:

#include "stm32f10x.h"                  // Device headervoid PWM_init(){//1.开启定时器时钟,TIM2总线是为APB1的RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//配置GPIO口 PA0GPIO_InitTypeDef GPIO_initstruct; GPIO_initstruct.GPIO_Mode=GPIO_Mode_AF_PP; //使用复用推挽输出,因为这里不是输出寄存器控制的,是片上外设定时器操作的,所以要用到复用推挽输出GPIO_initstruct.GPIO_Pin=GPIO_Pin_2; //重新映射到15口 GPIO_initstruct.GPIO_Pin=GPIO_Pin_15;GPIO_initstruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_initstruct);TIM_InternalClockConfig(TIM2);  //给TIM2选择时钟 为内部时钟,定时器默认是使用内部的时钟,不写这一行也行的//2.配置时基单元TIM_TimeBaseInitTypeDef TIM_timebasestruct;//下面两个是运行控制操作值TIM_timebasestruct.TIM_ClockDivision=TIM_CKD_DIV1;//对输入信号进行初步分频,内部时钟72Mhz信号TIM_timebasestruct.TIM_CounterMode=TIM_CounterMode_Up;//计数方式选择向上计数//以下三个是时基单元里面的实际参数值/* 计数器溢出频率:CK_CNT_OV = CK_CNT / (ARR + 1)= CK_PSC / (PSC + 1) / (ARR + 1) */TIM_timebasestruct.TIM_Period=100-1;  //计数器的重装值,目标值 //ARRTIM_timebasestruct.TIM_Prescaler=36-1; //预分频器的值         //PSCTIM_timebasestruct.TIM_RepetitionCounter=0;//重复计数功能,这个是高级计数器才有的,当前选择的是通用计数器,设置0即可TIM_TimeBaseInit(TIM2,&TIM_timebasestruct);//初始化输出比较通道,这里以OC1通道为示例TIM_OCInitTypeDef TIM_ocinitstruct;//配置输出比较通道结构体TIM_OCStructInit(&TIM_ocinitstruct);//给这个结构体设置默认初始值,避免改为使用高级定时器的时候出错//下面是使用通用定时器的部分,就拉出来单独修改,其余是高级定时器的东西就不去改,保持默认值就行了TIM_ocinitstruct.TIM_OCMode=TIM_OCMode_PWM1;//PWM选择输出比较工作模式,八选一TIM_ocinitstruct.TIM_OCPolarity=TIM_OCPolarity_High;//选择输出极性,当ref为高电平的时候就输出保持不变,还有其他两种一个是低电平,另一个是翻转TIM_ocinitstruct.TIM_OutputState=TIM_OutputState_Enable;//输出使能,开启输出比较通道使能TIM_ocinitstruct.TIM_Pulse=0;  //CCR的值,我们要去进行比较的数TIM_OC3Init(TIM2,&TIM_ocinitstruct);//5.开启定时器TIM_Cmd(TIM2,ENABLE);//开启定时器}//寄存器设置CCR的值,我们要去进行比较的数
void PWM_Setcompare3(uint16_t Compare){TIM_SetCompare3(TIM2,Compare);}

PWM.h代码:

#ifndef __PWM_H
#define __PWM_Hvoid PWM_init();
void PWM_Setcompare3(uint16_t Compare);
#endif // !1

Motor.c代码:

#include "stm32f10x.h"                  // Device header
#include "PWM.h"void Motor_init()
{//电机方向控制脚RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_initstruct; GPIO_initstruct.GPIO_Mode=GPIO_Mode_Out_PP; 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_setspeed(int8_t speed){//正转if(speed>=0){GPIO_SetBits(GPIOA,GPIO_Pin_4);GPIO_ResetBits(GPIOA,GPIO_Pin_5);PWM_Setcompare3(speed);}//反转else{GPIO_SetBits(GPIOA,GPIO_Pin_5);GPIO_ResetBits(GPIOA,GPIO_Pin_4);PWM_Setcompare3(-speed);}
}

Motor.h代码:

#ifndef __MOTOR_H
#define __MOTOR_H
void Motor_init();
void Motor_setspeed(int8_t speed);
#endif // !__MOTOR_H

main.c代码:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Key.h"
#include "Motor.h"
#include "LED.h"uint8_t keynum;
int speed;int main(void)
{	Key_init();OLED_Init();Motor_init();LED_init();OLED_ShowString(1,1,"speed:");OLED_ShowString(2,1,"state:");while(1){keynum=Keynum();OLED_ShowSignedNum(1,8,speed,3);if(speed>0){LED1_ON();OLED_ShowString(2,7,"Posi");}else if(speed==0){LED1_OFF();OLED_ShowString(2,7,"Rest");}else{LED1_ON();OLED_ShowString(2,7,"Oppo");}if(keynum==1){ //调档,占空比分百分之 0 25 50 75 100 speed+=25;if(speed>100)speed=0;}if(keynum==2){ //调方向,按下就按照原来的速度反方向转speed=-speed;}Motor_setspeed(speed);}
}

以上就是本期的全部内容了,我们下次见!

每日壁纸:

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

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

相关文章

802.11 wireshark 抓包

80211 wireshark 抓包 前言配置 monitor软件配置wireshark 操作 前言 本人习惯使用 Omnipeek 抓包分析&#xff0c;所以 wireshark 的实验只讲到抓包完成。 Windows 环境采用 wireshark 抓包是比较麻烦的&#xff0c;因为支持在 Windows 环境中支持抓包的网卡并不多&#xff0…

Oracle数据库 v$archived_log

v$archived_log详解 V$ARCHIVED_LOG视图描述了系统中已经归档的日志文件的相关信息。归档日志是ARCHIVELOG模式的一种&#xff0c;用来记录DML以及DDL对数据库中对象所做的更改&#xff0c;保护数据库以及实施重做数据库恢复。 V$ARCHIVED_LOG视图的主要用途是查看已经归档的…

Html review1

1、块元素和行内元素 块元素独占一行 p、h 行内元素的宽度是内容撑起来的&#xff0c;几个行内可以在一行a、strong、em 2、视频音频播放 视频&#xff1a; video src" 资源 路径" controls进度条 autoplay自动播放 音频&#xff1a; audio src“资源路径” controls…

探索 IT 领域的新宠儿:量子计算

目录 引言&#xff1a;从经典到量子的飞跃 量子计算的基本概念 量子计算的独特优势 量子计算的深度剖析 量子计算的最新进展 量子计算的行业应用前景 面临的挑战与未来展望 结语&#xff1a;迎接量子计算的新时代 引言&#xff1a;从经典到量子的飞跃 在信息技术飞速发…

Springboot 开发之 RestTemplate 简介

一、什么是RestTemplate RestTemplate 是Spring框架提供的一个用于应用中调用REST服务的类。它简化了与HTTP服务的通信&#xff0c;统一了RESTFul的标准&#xff0c;并封装了HTTP连接&#xff0c;我们只需要传入URL及其返回值类型即可。RestTemplate的设计原则与许多其他Sprin…

Linux没有telnet 如何测试对端的端口状态

前段时间有人问uos没有telnet&#xff0c;又找不到包。 追问了一下为什么非要安装telnet&#xff0c;答复是要测试对端的端口号。 这里简单介绍一下&#xff0c;测试端口号的方法有很多&#xff0c;telent只是在windows上经常使用&#xff0c;linux已很少安装并使用该命令&…

SQL Server 数据备份与恢复

引言 数据备份和恢复是数据库管理中至关重要的一部分。确保数据的安全和可恢复性&#xff0c;可以避免由于数据丢失或损坏而带来的重大损失。本文将介绍 SQL Server 数据备份与恢复的基本概念、类型、以及如何执行这些操作。 1. SQL Server 备份类型 SQL Server 提供了多种备…

java找不到符号解决办法

一、java找不到符号 如果你的代码里没有报错&#xff0c;明明是存在的。但是java报错找不到符号。如下所示&#xff0c; 二、解决步骤 1.清除编码工具缓存 本人用的idea&#xff0c; eclipse清除缓存方式有需要的可以百度一下&#xff01; 2.如果是mavne项目的 先clean 再…

19. 填坑Ⅱ

Description emmm&#xff0c;还是北湖深坑&#xff0c;不用惊喜&#xff0c;不用意外。我们继续用石头填&#xff01; 北湖的地面依旧是一维的&#xff0c;每一块宽度都为1&#xff0c;高度是非负整数&#xff0c;用一个数组来表示。 还是提供不限量的 1 * 2 规格的石头。 …

Redis流量分析

Redis流量分析是指对Redis数据库的网络通信量和内部操作进行监控和分析的过程。这有助于理解Redis服务器的负载、性能瓶颈、以及可能存在的问题&#xff0c;以便进行优化和故障排查。以下是一些主要的分析方面&#xff1a; 网络流量监控&#xff1a; 监控进入和离开Redis服务器…

本地连接远程阿里云K8S

1.首先安装kubectl 1.1验证自己系统 uname -m 1.2 按照步骤安装 在 Linux 系统中安装并设置 kubectl | Kubernetes 1.3 阿里云配置 通过kubectl连接Kubernetes集群_容器服务 Kubernetes 版 ACK(ACK)-阿里云帮助中心 2.验证 阿里云config直接导出&#xff0c;直接扔到.…

vue字段判断是否可以鼠标悬浮或者点击跳转

通过字段判断是否可以鼠标悬浮展示颜色 是否点击 <span :class"[converBond.stkindustry ! null ? hoverSpan:,]"click"converBond.stkindustry ! null ?goToIndustry(converBond.stkindustryname,converBond.stkindustry):false">{{converBon…

矩阵乘法@与dot

scores X W 和 scores np.dot(X, W) 是等价的&#xff0c;两者都用于矩阵乘法运算&#xff0c;但在语法和某些情况下的行为上略有不同。 import numpy as npX np.array([[1, 2, 3], [4, 5, 6]]) W np.array([[0.1, 0.2], [0.3, 0.4], [0.5, 0.6]])scores X W print(sco…

MyCms开源免费的自媒体商城博客CMS企业建站系统

MyCms是一款基于Laravel开发的开源免费的自媒体博客CMS系统&#xff0c;适用于个人网站及企业网站开发使用&#xff0c;MyCms基于Apache2.0开源协议发布&#xff0c;免费且不限制商业使用。 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89575879 更…

【电路笔记】-D类放大器

D类放大器 文章目录 D类放大器1、概述2、D类放大器介绍3、调制4、放大5、滤波6、效率7、总结1、概述 在之前的文章中,放大器的导通角与其效率之间建立了重要的联系。 事实上,基于高导通角的放大器提供非常好的线性度,例如 A 类放大器,但效率非常有限,通常约为 20% 至 30%…

docker 运维查看指定应用log文件位置和名称

启动docker: systemctl start docker 停docker:systemctl stop docker 重启docker:systemctl restart docker 查看docker状态:systemctl status docker 开机启动:systemctlenable docker 查看docker概要信息:docker info 查看docker总体帮助文档:docker --help 查看docker命令帮…

01docker容器互联

Docker 容器互联 一、docker 容器连接及测试 1、新建网络 docker network create -d bridge test-net # 查看已有网络 docker network ls2、创建连接容器 1、创建两个容器test1、test2 docker run -d --name test1 --network test-net ubuntudocker run -d --name test1 -…

俊昭stm32笔记

stm32——中断优先级 stm32——创建基础工程模板stm32——创建基础工程模板-CSDN博客 stm32——MCU启动方式stm32——MCU启动方式_stm32调试时程序启动方式-CSDN博客 stm32——串口stm32——串口_stm32 串口-CSDN博客 stm32——lcd液晶显示stm32——lcd液晶显示-CSDN博客

YOLOv8高效涨点之改进 MAE+ConvNeXtv2

1,论文解读 论文采取的方案 网络设计 实验部分 修改结构 融合MAE和Conv 2、改进YOLOv8代码 + MAE 首先在ultralytics/nn文件夹下,创建一个convnextv2.py文件,新增以下代码 import torch import torch.nn as nn import torch.nn.functional as F from timm.models.layer…

科研成果 | 高精尖中心取得高性能区块链交易调度技术突破

近日&#xff0c;未来区块链与隐私计算高精尖创新中心研究团队在区块链交易效率方面取得突破性进展&#xff0c;最新成果“高性能区块链交易调度引擎”首次为长安链带来高并行度的交易调度&#xff0c;充分利用现有计算资源&#xff0c;显著提升长安链交易处理速度。 随着区块…