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);}
}
以上就是本期的全部内容了,我们下次见!
每日壁纸:
相关文章:

stm32入门-----TIM定时器(PWM输出比较——下)
目录 前言 一、硬件元器件介绍 1.舵机 2.直流电机驱动 二、C语言编程步骤 1.开启时钟 2.配置输出的GPIO口 3.配置时基单元 4.初始化输出比较通道 5.开启定时器 三、实践项目 1.PWM驱动LED呼吸灯 2.PWM驱动舵机 3.PWM驱动直流电机 前言 本期我们就开始去进行TIM定时…...

css实现线条中间高亮,左右两边模糊(linear-gradient的运用)
效果: <div class"line"></div> .line {height: 1px;background: linear-gradient(90deg, rgba(255, 255, 255, 0) 0%, #a9c2ff 50%, rgba(255, 255, 255, 0) 100%);border-radius: 4px 4px 4px 4px; } CSS实现边框底部渐变色的方法:(最简单…...

【数据结构】建堆算法复杂度分析及TOP-K问题
【数据结构】建堆算法复杂度分析及TOP-K问题 🔥个人主页:大白的编程日记 🔥专栏:数据结构 文章目录 【数据结构】建堆算法复杂度分析及TOP-K问题前言一.复杂度分析1.1向下建堆复杂度1.2向上建堆复杂度1.3堆排序复杂度 二.TOP-K问…...
Thinkphp5实现前后端通过接口通讯基本操作方法
在ThinkPHP5框架中,实现前后端通过接口通讯是一个常见的需求,尤其是在开发RESTful API时。下面是一个基本的步骤指南,用于设置ThinkPHP5来创建API接口,并使前端能够通过HTTP请求与后端进行通讯。 1. 创建API模块 首先࿰…...
Go 语言任务编排 WaitGroup
WaitGroup 是常用的 Go 同步原语之一,用来做任务编排。它要解决的就是并发-等待的问题: 现在有一个 goroutine A 在检查点 ( checkpoint ) 等待一组 goroutine 全部完成它们的任务,如果这些 goroutine 还没全部完成任务,那么 goroutine A 就会被阻塞在检查点,直到所有的 …...
星环科技推出知识库产品 AI PC时代数据交互方式变革
随着企业业务的快速发展,数据量呈爆炸式增长,有效的知识管理成为企业面临的重要问题。企业遇到的普遍问题是大量的结构化、半结构化数据存储在不同的系统中,需要用多种计算机语言进行检索。而大模型彻底改变了人们和数据的交互方式࿰…...

10道JVM经典面试题
1、 JVM中,new出来的对象是在哪个区? 2、 说说类加载有哪些步骤? 3、 JMM是什么? 4、 说说JVM内存结构? 5、 MinorGC和FullGC有什么区别? 6、 什么是STW? 7、 什么情况下会发生堆/栈溢出?…...
Redisson常用的数据结构及应用场景
Redisson 提供了一系列高级数据结构,这些数据结构封装了 Redis 的原生数据类型,提供了 Java API 的便利性和分布式特性。以下是 Redisson 中一些常用的数据结构,场景还在不断完善中: RBucket:这是一个简单的键值对存储…...

【实现100个unity特效之8】使用ShaderGraph实现2d贴图中指定部分局部发光效果
最终效果 寒冰法师 火焰法师 文章目录 最终效果寒冰法师火焰法师 素材一、功能分析实现方法基本思路Unity的Bloom后处理为什么关键部位白色?最终结果 二、 新建URP项目三、合并图片四、使用PS制作黑白图片方法一 手动涂鸦方法二 魔棒工具1. 拖入图片进PS࿰…...

Ubuntu 24.04 LTS Noble安装Docker Desktop简单教程
Docker 为用户提供了在 Ubuntu Linux 上快速创建虚拟容器的能力。但是,那些不想使用命令行管理容器的人可以在 Ubuntu 24.04 LTS 上安装 Docker Desktop GUI,本教程将提供用于设置 Docker 图形用户界面的命令…… Docker Desktop 是一个易于使用的集成容…...
XML 和 SimpleXML 入门教程
XML 和 SimpleXML 入门教程 XML(可扩展标记语言)是一种用于存储和传输数据的标记语言。它是一种自我描述的语言,允许用户定义自己的标签来表示数据。SimpleXML 是 PHP 中的一个扩展,用于解析和操作 XML 数据。本文将介绍 XML 和 …...
leetcode--链表类题目总结
本文作为刷题时对链表类题目的总结. 常见技巧: 引入虚拟头节点 便于处理边界情况便于对链表操作快慢双指针(判环,找环的入口等)链表逆序(推荐使用 虚拟头节点 头插法 进行逆序) 链表逆序( 头插法 虚拟头节点):链表内指定区间反转_牛客题霸_牛客网 虚拟节点:合并…...

打卡第22天------回溯算法
开始学习了,希望我可以尽快成功上岸! 一、回溯理论基础 什么是回溯法?回溯法也可以叫做回溯搜索法,它是一种搜索的方式。 回溯是递归的副产品,只要有递归就会有回溯。 回溯法的效率回溯法的本质是穷举,穷举所有可能,然后找出我们想要的答案。如果想让回溯法高效一些,可…...
Ubuntu对比两个文件内容有什么区别?
在Ubuntu(或任何基于Linux的系统)中,你可以使用多种命令行工具来比较两个文件的内容差异。以下是一些常用的方法: 1. **diff 命令**: diff 是Linux中用于比较两个文件差异的标准工具。它逐行比较文件,并显示…...

python:本机摄像头目标检测实时推理(使用YOLOv8n模型)
本文将介绍如何使用本机摄像头进行目标检测实时推理的python代码。 文章目录 一、下载YOLO权重文件二、环境配置三、完整代码 一、下载YOLO权重文件 https://github.com/ultralytics/ultralytics?tabreadme-ov-file 拉到网页最下面,选择适合的模型,下…...

Spark实时(四):Strctured Streaming简单应用
文章目录 Strctured Streaming简单应用 一、Output Modes输出模式 二、Streaming Table API 三、Triggers 1、unspecified(默认模式) 2、Fixed interval micro-batches&am…...

SpringBoot上传超大文件导致OOM,完美问题解决办法
问题描述 报错: Caused by: java.lang.OutOfMemoryError at java.io.ByteArrayOutputStream.hugeCapacity(ByteArrayOutputStream.java:123) ~[?:1.8.0_381] at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:117) ~[?:1.8.0_381] at java.…...
PyTorch 的各个核心模块和它们的功能
1. torch 核心功能 张量操作:PyTorch 的张量是一个多维数组,类似于 NumPy 的 ndarray,但支持 GPU 加速。数学运算:提供了各种数学运算,包括线性代数操作、随机数生成等。自动微分:torch.autograd 模块用于…...
Java开发之LinkedList源码分析
#来自ゾフィー(佐菲) 1 简介 LinkedList 的底层数据结构是双向链表。可以当作链表、栈、队列、双端队列来使用。有以下特点: 在插入或删除数据时,性能好;允许有 null 值;查询效率不高;线程不安…...

外卖霸王餐系统架构怎么选?
在当今日益繁荣的外卖市场中,外卖霸王餐作为一种独特的营销策略,受到了众多商家的青睐。然而,要想成功实施外卖霸王餐活动,一个安全、稳定且高效的架构选择至关重要。本文将深入探讨外卖霸王餐架构的选择,以期为商家提…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...

【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...

毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...