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

STM32--TIM定时器(3)

文章目录

  • 输入捕获简介
  • 频率测量
  • 输入捕获通道
  • 输入捕获基本结构
  • PWMI的基本结构
  • 输入捕获模式测量PWM频率和占空比
    • 代码
  • 编码器接口
  • 正交编码器
  • 工作模式
  • 接口基本结构
  • TIM编码接口器测速
    • 代码:

输入捕获简介

输入捕获IC(Input Capture),是处理器捕获外部输入信号的功能。基于定时器抓取输入信号指定触发方式之间的长度。通过输入捕获功能,我们可以测量脉冲宽度和测量频率。

在每个高级定时器和通用器都有4个输入捕获通道。

当通道输入引脚出现指定电平跳变时,当前CNT的值将被锁存到CCR中,可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数。

输入捕获功能主要涉及以下几个关键概念:

  1. 捕获通道(Capture Channel):定时器可以配置多个捕获通道,每个通道用于捕获一个外部事件的触发时间和脉冲宽度。

  2. 计数器(Counter):定时器的计数器用于记录定时器的计数值,表示经过的时间。

  3. 捕获寄存器(Capture Register):捕获寄存器用于存储捕获通道捕获到的时间戳或者脉冲宽度值。

  4. 触发源(Trigger Source):触发源可以是定时器的输入引脚(如外部信号源),或者是定时器自身的输出(如另一个定时器的通道输出)。

  5. 中断(Interrupt):当捕获事件发生时,定时器会触发相应的中断,可以在中断服务程序中处理捕获结果。

频率测量

在这里插入图片描述

测频法:在闸门时间T内,对上升沿计次,得到N,则频率f_x=N / T.
这种方法要求测量的频率比较快,计算频率的N越多,计算的越精确,也就表明频率越快;

测周法:两个上升沿内,以标准频率fc计次,得到N ,则频率f_x=f_c / N.
这种方法要求所测频率比较低,要求标准频率要远大于所测频率,这样N会算的越多,所测频率越准确。

中界频率:测频法与测周法误差相等的频率点f_m=√f_c / T
这种方法主要用来判断所测频率用哪种方法比较合适,根据所给的标准频率和时间T去验证。

输入捕获通道

先看总框图
在这里插入图片描述
最左边的是输入捕获的通道引脚,有4个,可以参考引脚定义表来确认通道;
进来之后有一个三输入的异或门,执行逻辑是当三个引脚有任何一个引脚有电平翻转的时候,输出引脚就发生电平翻转,之后输出通过数据选择器,到达输入捕获通道1,异或这里有两个选择,如果是上面那个,那输入捕获通道1就是三个引脚的异或值,如果选择下面一个,那么异或门就没有用,直接四个通道各用各的引脚。这个异或门主要用于三相无刷电机。

接着进入输入滤波器和边沿检测器,滤波器可以对输入信号进行滤波,避免毛刺和干扰信号;边沿检测器可以选择上升沿触发或者下降沿触发,触发后执行后续电路;并且这里是设计了两套滤波检测电路,第一套电路经过滤波和极性选择,得到TI1FP1,进入后续电路;第二套电路同样的操作,得到TI2FP2,进入后续电路;输入通道2也是同样的道理。对于TI1FP1会进入通道1的后续电路,TI2FP2会进入通道2的后续电路。这样做就能让一个引脚的输入映射到两个捕获单元了。下面还有一个TRC输入,也是用于无刷电机的驱动。

走到预分频器,每个通道都各有一个,可以对输入的频率进行分频,分频后的信号就能够触发捕获电路开始工作。每来一个值,CNT中的值就会转到捕获寄存器进行锁存。可以根据这个值进行时间,频率的计算。同时也会产生捕获事件(CC1I),还会产生标志位(U)到寄存器上,可以产生中断。

再看捕获通道:
在这里插入图片描述

通过输入引脚引入滤波器,TI1就是输入的引脚,输出的TI1F就是滤波后的信号,fDTS是滤波器的采样时钟来源,下面是CCMR1是控制滤波器参数的寄存器;
滤波后的信号进入边沿检测器,捕获上升沿或者下降沿,用下面的CCER寄存器就能选择极性。
得到的TI1FP1通过数据选择器,进入通道1的后续电路。
CC1S可以对数据选择器进行选择,IPPS可以对分频器进行配置,CCIE控制输出的使能。
这个TI1FP1信号触发进入通道1后续电路时,也可以同时触发从模式,从模式中有模式可以对CNT进行自动清0

在这里插入图片描述

主模式将定时器的内部信号映射到TRGO引脚,用于触发别的外设;
从模式就是接收其他外设或者自身外设的信号,用于控制自身定时器的运行。
触发源可以选择一个信号到TRGI引脚上;

像我们刚才的选择,就是触发源选择TI1FP1,从模式的Reset;这样就完成对CNT自动清零的设置。

输入捕获基本结构

在这里插入图片描述
这里我们将采用上面的测周法进行测量;

举个例子,我们事先给时间单元的预分频器给72(接上内部时钟72MHz),那么频率就为1000000Hz。GPIO口输入一个频率为100Hz的PWM,通过滤波器和边缘检测极性选择,TI1FP1信号会触发后续通道电路并且触发从模式,以100Hz的一个周期来算,也就是在两个上升沿(100Hz)期间,1000000Hz的可以计算10000次(1000000/100),那么捕获寄存器就会得到10000的值,接着从模式会对CNT清零。这样得到的捕获值就可以对输入的频率进行计算。
当然,我们无法保证最后100Hz最后的周期是完整的,所以会有所误差(±1)。

PWMI的基本结构

在这里插入图片描述
相比于上面的基本结构,这里多了一条捕获通道,这个TI2FP2触发的极性与TI1FP1相反,我们利用这个TI2FP2可以计算PWM的占空比。
例如TI1FP1触发极性为上升沿,TI2FP2触发极性为下降沿,我们还是以上面的例子展开延申,一个100Hz的周期内可以计算到10000次的标准频率周期,假设占空比为50%,那么在100Hz周期内,以标准频率去算的话,将会有5000次,那么这样把5000除以10000就可以得到占空比了。

输入捕获模式测量PWM频率和占空比

接线模式:
在这里插入图片描述
我们将在A0口输出一个PWM,由A6进行对A0口的PWM频率和占空比的测量。

代码

OLED所取路径

PWM.h

#ifndef __PWM_H__
#define __PWM_H__void PWM_Init();
void PWM_SetCompare(uint16_t Compare);
void PWM_Prescaler(uint16_t Prescaler);#endif

PWM.c

#include "stm32f10x.h"                  // Device headervoid PWM_Init()
{//开启APB1外设开关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_0;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);//配置内部时钟TIM2TIM_InternalClockConfig(TIM2);//时钟结构体初始化TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; //划分TIM2TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //计时器模式TIM_TimeBaseInitStructure.TIM_Period=100-1; //自动加载寄存器周期值TIM_TimeBaseInitStructure.TIM_Prescaler=720-1; //预分频值TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0; //指定重复计时器的值,这里不用到TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);//配置输出比较结构体TIM_OCInitTypeDef 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; //指定要捕获的脉冲值CCRTIM_OC1Init(TIM2,&TIM_OCInitStructure);//启用TIM2外设控制TIM_Cmd(TIM2,ENABLE);}
//可以设置占空比
void PWM_SetCompare(uint16_t Compare)
{//配置TIM2比较值TIM_SetCompare1(TIM2,Compare);
}
//配置TIMx的预调度器,可以设置PWM频率
void PWM_Prescaler(uint16_t Prescaler)
{TIM_PrescalerConfig(TIM2,Prescaler,TIM_PSCReloadMode_Immediate);
}

IC.h

#ifndef __IC_H__
#define __IC_H__void IC_Init();
uint32_t IC_GetFreq();
uint16_t IC_GetDuty();#endif

IC.c

#include "stm32f10x.h"                  // Device header
#include "PWM.h"void IC_Init()
{//开启外设时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//引脚输出初始化GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//Time内部时钟TIM_InternalClockConfig(TIM3);//内部时钟初始化TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1;		//ARRTIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;		//PSCTIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);//输入捕获初始化TIM_ICInitTypeDef TIM_ICInitStructure;TIM_ICInitStructure.TIM_Channel=TIM_Channel_1; //选择通道TIM_ICInitStructure.TIM_ICFilter=0xF; //指定输入捕获过滤器TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising; //触发方式TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1; //不分频TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI; //直流方式//配置TIM3外设测量通道2,输出初始化通道相反,流相反,触发方式相反的成员TIM_PWMIConfig(TIM3,&TIM_ICInitStructure);//选择输入触发源TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);//选择从模式TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);TIM_Cmd(TIM3,ENABLE);
}//获取输入捕获PWM频率
uint32_t IC_GetFreq()
{//72M/72=1Mreturn 1000000/(TIM_GetCapture1(TIM3)+1);//根据计算验证,捕获值为9999,有1的误差
}
//获取输入捕获PWM占空比
uint16_t IC_GetDuty()
{return ((TIM_GetCapture2(TIM3))*100/TIM_GetCapture1(TIM3)+1);
}

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "PWM.h"
#include "IC.h"int main()
{OLED_Init();PWM_Init();IC_Init();OLED_ShowString(1,1,"Freq:00000Hz");OLED_ShowString(2, 1, "Duty:00%");PWM_Prescaler(7200-1); //Freq=72M/(PSC+1)/100PWM_SetCompare(75);   //Duty=CCR/100;不能超过100while(1){OLED_ShowNum(1,6,IC_GetFreq(),5);OLED_ShowNum(2,6,IC_GetDuty(),2);}
}

编码器接口

编码器接口常应用于测量、控制和位置检测等领域的传感器,用于监测旋转和线性运动的位置和速度
每个高级定时器和通用定时器都拥有1个编码器接口。
两个输入引脚借用了输入捕获的通道1和通道2。
编码器接口模式基本上相当于使用了一个带有方向选择的外部时钟
在这里插入图片描述

正交编码器

正交编码器通常由两个光电传感器组成,分别成为A相和B相。这两个相位差90°的信号输出,可以通过检测两个相位信号的变化来确认旋转方向和计数值。
在这里插入图片描述
在正交编码器中,两个相位信号的波形是基于格雷码(Gray Code)的。格雷码是一种二进制编码,相邻的数值只有一个位数发生变化。这样设计的好处是,在旋转过程中,即使出现脉冲跳变也不会导致计数错误。

通过对A相和B相信号进行解码,可以获取准确的旋转位置和方向。例如,当顺时针旋转时,A相先变化然后B相变化,而逆时针旋转时,B相先变化然后A相变化。

工作模式

在这里插入图片描述
我们主要用TI1和TI2上的计数模式。
举个例子,在TI1低电平时,TI2上升沿,那么计数减少;TI2下降沿,计数增加。在TI1高电平时,TI2上升沿,那么计数增加;TI2下降沿,计数减少
在这里插入图片描述
这是极性不反向的情况,也就是TI1和TI2的触发极性相同时,

若是相反:
在这里插入图片描述

接口基本结构

在这里插入图片描述
这里的编码器接口充当外部时钟,通过捕获输入的频率作为时钟源

TIM编码接口器测速

接线方式:
在这里插入图片描述
通过编码器的旋转速度,让它显示在屏幕上。

代码:

Timer.h

#ifndef __TIMER_H__
#define __TIMER_H__void Timer_Init();#endif

Timer.c

#include "stm32f10x.h"                  // Device headervoid Timer_Init()
{//开启APB1外设开关RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//配置TIM2为内部时钟TIM_InternalClockConfig(TIM2);//时钟结构体初始化TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; //划分TIM2TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //计时器模式TIM_TimeBaseInitStructure.TIM_Period=10000-1; //自动加载寄存器周期值TIM_TimeBaseInitStructure.TIM_Prescaler=7200-1; //预分频值TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0; //指定重复计时器的值,这里不用到TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);//TIM_ClearFlag(TIM2, TIM_FLAG_Update);//启用TIM2中断TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//配置优先级分组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//NVIC初始化NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;NVIC_Init(&NVIC_InitStructure);//启用TIM2外设控制TIM_Cmd(TIM2,ENABLE);
}

内部时钟中断,利用TIM2作为时间中断,每隔一秒钟,将会进入中断函数。

Encoder.h

#ifndef __ENCODER_H__
#define __ENCODER_H__void Encoder_Init();
int16_t Encoder_Get();#endif

Encoder.c

#include "stm32f10x.h"                  // Device headervoid Encoder_Init()
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//编码器接口模式相当于接入一个外设时钟TIM_TimeBaseInitTypeDef TimeBaseInitStructure;TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;TimeBaseInitStructure.TIM_Period=65535-1; //ARRTimeBaseInitStructure.TIM_Prescaler=1-1;  //PSCTimeBaseInitStructure.TIM_RepetitionCounter=0;TIM_TimeBaseInit(TIM3,&TimeBaseInitStructure);//输入捕获TIM_ICInitTypeDef TIM_ICInitStructure;TIM_ICStructInit(&TIM_ICInitStructure);TIM_ICInitStructure.TIM_Channel=TIM_Channel_1;TIM_ICInitStructure.TIM_ICFilter=0xF;TIM_ICInit(TIM3,&TIM_ICInitStructure);TIM_ICInitStructure.TIM_Channel=TIM_Channel_2;TIM_ICInitStructure.TIM_ICFilter=0xF;TIM_ICInit(TIM3,&TIM_ICInitStructure);//编码接口器TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);//设置两个触发极性为相同的//启用TIM外设TIM_Cmd(TIM3,ENABLE);
}
//获取速度值,获取后将计数器清0
int16_t Encoder_Get()
{int16_t Temp;Temp=TIM_GetCounter(TIM3);TIM_SetCounter(TIM3,0);return Temp;
}

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Encoder.h"
#include "Timer.h"int16_t Speed;int main()
{OLED_Init();Timer_Init();Encoder_Init();OLED_ShowString(1,1,"Speed:");while(1){OLED_ShowSignedNum(1,7,Speed,4);}
}
//中断函数
void TIM2_IRQHandler()
{if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET){//将数值赋给SpeedSpeed=Encoder_Get();TIM_ClearITPendingBit(TIM2,TIM_IT_Update);}
}

相关文章:

STM32--TIM定时器(3)

文章目录 输入捕获简介频率测量输入捕获通道输入捕获基本结构PWMI的基本结构输入捕获模式测量PWM频率和占空比代码 编码器接口正交编码器工作模式接口基本结构TIM编码接口器测速代码: 输入捕获简介 输入捕获IC(Input Capture),是处理器捕获外部输入信号…...

爬虫框架- feapder + 爬虫管理系统 - feaplat 的学习简记

文章目录 feapder 的使用feaplat 爬虫管理系统部署 feapder 的使用 feapder是一款上手简单,功能强大的Python爬虫框架 feapder 官方文档 文档写的很详细,可以直接上手。 基本命令: 创建爬虫项目 feapder create -p first-project创建爬虫 …...

设计模式详解-享元模式

类型:结构型模式 实现原理:尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象 目的:减少创建对象的数量以减少内存占用和提高性能。 解决的问题:大量的对象可能造成的内存溢出问题 解决方法&a…...

BDA初级分析——用SQL筛选数据

一、用SQL对数据分组 GROUP BY Group by,按...分组 作用:根据给定字段进行字段的分组,通常和聚合函数配合使用,实现分组的分析 写法:select ...from ...group by 字段名 (也可以是多个字段) GROUP BY的逻辑 SELECT gender,COUNT(user_id) …...

(成功踩坑)electron-builder打包过程中报错

目录 注意:文中的解决方法2,一定全部看完,再进行操作,有坑 背景 报错1: 报错2: 1.原因:网络连接失败 2.解决方法1: 3.解决方法2: 3.1查看缺少什么资源文件 3.2去淘…...

【STM32】 工程

🚩 WRITE IN FRONT 🚩 🔎 介绍:"謓泽"正在路上朝着"攻城狮"方向"前进四" 🔎🏅 荣誉:2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2022博客之星TO…...

Git概述

目录 一、什么是Git 二、什么是版本控制系统 三、Git和SVN对比 SVN集中式 SVN优缺点 Git分布式 Git优缺点 四、Git工作流程 四个工作区域 工作流程 五、Git下载与安装 一、什么是Git 很多人都知道,林纳斯托瓦兹在1991年创建了开源的Linux,从…...

ubuntu 编译安装nginx及安装nginx_upstream_check_module模块

如果有帮助到你,麻烦点个赞呗~ 一、下载安装包 # 下载nginx_upstream_check_module模块 wget https://codeload.github.com/yaoweibin/nginx_upstream_check_module/zip/master# 解压 unzip master# 下载nginx 1.21.6 wget https://github.com/nginx/…...

近 2000 台 Citrix NetScaler 服务器遭到破坏

Bleeping Computer 网站披露在某次大规模网络攻击活动中,一名攻击者利用被追踪为 CVE-2023-3519 的高危远程代码执行漏洞,入侵了近 2000 台 Citrix NetScaler 服务器。 研究人员表示在管理员安装漏洞补丁之前已经有 1200 多台服务器被设置了后门&#x…...

MySQL MVCC的详解之Read View

文章目录 概要一、基于UNDO LOG的版本链1.1、行记录结构1.2、了解UNDO LOG1.3、版本链 二、Read View2.1、判定机制 三、参考 概要 在上文中,我们提到了MVCC(Multi-Version Concurrency Control)多版本并发控制,是通过undo log来实现的。那具…...

基于springboot+vue的考研资讯平台(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…...

学习网络编程No.3【socket理论实战】

引言: 北京时间:2023/8/12/15:32,自前天晚上更新完文章,看了一下鹅厂新出的《扫毒3》摆烂至现在,不知道是长大了,还是近年港片就那样,给我的感觉不是很好,也可能是国内市场对港片不…...

Linux学习之ssh和scp

ls /etc/ssh可以看到这个目录下有一些文件,而/etc/ssh/ssh_config是客户端配置文件,/etc/ssh/sshd_config是服务端配置文件。 cat -n /etc/ssh/sshd_config | grep "Port "可以看一下sshd监听端口的配置信息,发现这个配置端口是22…...

录制游戏视频的软件有哪些?分享3款软件!

“有录制游戏视频的软件推荐吗?最近迷上了网游,想录制点自己高端操作的游戏画面,但是不知道用什么软件录屏比较好,就想问问大家,有没有好用的录制游戏视频软件。” 在游戏领域,玩家们喜欢通过录制游戏视频…...

每日一题——螺旋矩阵

题目 给定一个m x n大小的矩阵(m行,n列),按螺旋的顺序返回矩阵中的所有元素。 数据范围:0≤n,m≤10,矩阵中任意元素都满足 ∣val∣≤100 要求:空间复杂度 O(nm) ,时间复杂度 O(nm)…...

前端面试的性能优化部分(12)每天10个小知识点

目录 系列文章目录前端面试的性能优化部分(1)每天10个小知识点前端面试的性能优化部分(2)每天10个小知识点前端面试的性能优化部分(3)每天10个小知识点前端面试的性能优化部分(4)每天…...

SAP BTEs 业务交易事件/增强(Business Transaction Event)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、BTEs是什么? 二、使用步骤 1.查找BTE event 2.处理FM 总结 前言 SAP BTEs是一种新型的增强方式,可以通过事务代码FIFB打开&#…...

leetcode做题笔记90. 子集 II

给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。 思路一:回溯 int comp(const void* a, cons…...

“开发和运维”只是一个开始,最终目标是构建高质量的软件工程

随着技术的飞速发展,软件行业不断寻求改进和创新的方法来提供更高质量的产品。在这方面,DevOps已经展现出了巨大的潜力。通过打破开发和运维之间的壁垒,DevOps将持续集成、持续交付和自动化流程引入到软件开发中,使团队能够更快地…...

自学C#,要懂得善用MSDN

很多初学者学习编程,都会通过看别人写的教程、或者录制的视频,来学习。 这是一个非常好的途径,因为这个是非常高效的。 但是这样,存在两个问题: 1、教程不够全面:任何再好的教程,都无法囊括所…...

mac上如何压缩视频大小?

mac上如何压缩视频大小?由于视频文件体积庞大,常常会占据我们设备的大量存储空间。通常情况下,我们选择删除视频以释放内存,但这将永久丢失它们。然而,有一种更好的方法可以在不删除视频的情况下减小内存占用&#xff…...

git merge规则

参考文档:https://juejin.cn/post/7129333439299321887 丹尼尔:Hi,蛋兄,周杰伦都出新专辑了,你咋还不更新啊,真的打算半年一更啊? 蛋先生:好像确实是这样,要不&#xff0…...

【周末闲谈】关于“数据库”你又知道多少?

个人主页:【😊个人主页】 系列专栏:【❤️周末闲谈】 系列目录 ✨第一周 二进制VS三进制 ✨第二周 文心一言,模仿还是超越? ✨第二周 畅想AR 文章目录 系列目录前言数据库数据库的五大特点数据库介绍数据库管理系统&a…...

C++ 对象生成:构造函数

对象生成:构造函数 一、构造函数特性二、三种构造函数1.无参构造函数2.有参构造函数3.拷贝构造函数 一、构造函数特性 C编译器提供了构造函数供程序生成对象这是一个与类同名的函数,参数可以有多种形式(重载)没有返回类型声明一般…...

RFID如何在汽车混流生产中进行车辆跟踪?

在汽车混流生产中,RFID技术可以对每个车辆进行唯一标识,从而实现车辆生产全程跟踪。实时确定车辆的位置、状态和生产过程,生产管理系统就能够对生产流程进行实时监控和管理,及时发现和解决问题,提高生产效率和质量。 焊…...

差值结构的复合底部

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有3个节点,AB训练集各由6张二值化的图片组成,让A 中有3个点,B中有1个点,且不重合,统计迭代次数并排序。 其中有20组数据 让迭代次数与排斥能成反比,排…...

在Docker 上使用 Nginx 配置https及wss

预先创建挂载文件 /mydata/nginx/conf/nginx.conf /mydata/nginx/cert /mydata/nginx/conf.d /mydata/nginx/html /mydata/nginx/logs运行并且挂载容器 docker run -p 80:80 -p 443:443 --name nginx01 --restartalways \ -v /mydata/nginx/conf/nginx.conf:/etc/nginx/ngi…...

git回退操作

1. 在工作区回退: 此时文件没有经过任何提交 git checkout -- filename2. git add之后回退 git reset HEAD3. git commit 之后回退 git reset --hard commit_id(前4位)其中,commit_id可通过git log查看,例如: qzcryqz MINGW6…...

C++系列-类和对象-静态成员

类和对象-静态成员 静态成员静态成员变量静态成员函数 静态成员 静态成员就是在成员变量或者是成员函数前面加上static关键字。 静态成员变量 所有对象共享同一份数据在编译阶段分配内存类内声明,类外初始化可以通过对象或者类名进行访问。静态成员变量也具有访问…...

SAP MM学习笔记26- SAP中 振替转记(转移过账)和 在库转送(库存转储)2- 品目Code振替转记 和 在库转送

SAP 中在库移动 不仅有入库(GR),出库(GI),也可以是单纯内部的转记或转送。 1,振替转记(转移过账) 2,在库转送(库存转储) 1&#xff…...

【Python机器学习】实验13 基于神经网络的回归-分类实验

文章目录 神经网络例1 基于神经网络的回归(简单例子)1.1 导入包1.2 构造数据集(随机构造的)1.3 构造训练集和测试集1.4 构建神经网络模型1.5 采用训练数据来训练神经网络模型 实验:基于神经网络的分类(鸢尾花数据集)1. 导入包2. 构造数据集3.…...

【数据结构】二叉树的链式结构的实现 -- 详解

一、前置说明 在学习二叉树的基本操作前,需先要创建一棵二叉树,然后才能学习其相关的基本操作。为了降低大家学习成本,此处手动快速创建一棵简单的二叉树,快速进入二叉树操作学习。 typedef char BTDataType;typedef struct Binar…...

【C语言】什么是结构体内存对齐?结构体的大小怎么计算?

目录 1.结构体内存对齐 对偏移量的理解:​ 2.结构体的大小计算 2.1结构体中只有普通的数据类型的大小计算 2.2 结构体中有嵌套的结构体的大小计算 3.修改默认对齐数 4.为什么存在内存对齐? 这篇文章主要介绍结构体内存对齐和如何计算大小。 在学习结构体内存…...

【Redis】Redis中的布隆过滤器

【Redis】Redis中的布隆过滤器 前言 在实际开发中,会遇到很多要判断一个元素是否在某个集合中的业务场景,类似于垃圾邮件的识别,恶意IP地址的访问,缓存穿透等情况。类似于缓存穿透这种情况,有许多的解决方法&#xf…...

接口测试 —— Jmeter 参数加密实现

Jmeter有两种方法可以实现算法加密 1、使用__digest自带函数 参数说明: Digest algorithm:算法摘要,可输入值:MD2、MD5、SHA-1、SHA-224、SHA-256、SHA-384、SHA-512 String to be hashed:要加密的数据 Salt to be…...

Linux c语言字节序

文章目录 一、简介二、大小端判断2.1 联合体2.2 指针2.3 网络字节序 一、简介 字节序(Byte Order)指的是在存储和表示多字节数据类型(如整数和浮点数)时,字节的排列顺序。常见的字节序有大端字节序(Big En…...

批量将excel中第5列中内容将人名和电话号码进行分列

使用Python可以使用openpyxl库来实现批量将Excel中第5列的内容分列为人名和电话号码的操作。下面是示例代码: import openpyxl def split_names_and_phone_numbers(file_path, sheet_name): # 加载Excel文件 workbook openpyxl.load_workbook(file_path) …...

WPF DataGrid columns表头根据数据集动态动态生成Demo

思路是这样的&#xff0c;数组集合装表头的信息&#xff0c;遍历这个集合&#xff0c;遍历过程中处理一下数据&#xff0c;然后就把每表头信息添加到dataGrid2.Columns.Add(templateColumn); 1&#xff0c;页面Xaml代码&#xff1a; <DataGrid x:Name"dataGrid" …...

1339. 分裂二叉树的最大乘积

链接&#xff1a; ​​​​​​1339. 分裂二叉树的最大乘积 题解&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* …...

【C++】Stack和Queue

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析3 目录 &#x1f449;&#x1f3fb;Stack Constructor&#x1f449;&#x1f3fb;Stack …...

Maven之tomcat7-maven-plugin 版本低的问题

tomcat7-maven-plugin 版本『低』的问题 相较于当前最新版的 tomcat 10 而言&#xff0c;tomcat7-maven-plugin 确实看起来很显老旧。但是&#xff0c;这个问题并不是问题&#xff0c;至少不是大问题。 原因 1&#xff1a;tomcat7-maven-plugin 仅用于我们&#xff08;程序员&…...

在项目中如何解除idea和Git的绑定

在项目中如何解除idea和Git的绑定 1、点击File--->Settings...(CtrlAltS)--->Version Control--->Directory Mappings--->点击取消Git的注册根路径&#xff1a; 2、回到idea界面就没有Git了&#xff1a; 3、给这个项目初始化 这样就可以重新绑定远程仓库了&#x…...

AGI 在网易云信的技术提效和业务创新

We believe our research will eventually lead to artificial general intelligence, a system that can solve human-level problems. Building safe and beneficial AGI is our mission. ---- OpenAI 通用人工智能 AGI 作为 AI 的终极形态&#xff0c;是 AI 行业内追求的演…...

线性代数的学习和整理9(草稿-----未完成)

3.3 特征值和特征向量是什么&#xff1f; 直接说现在&#xff1a;特征向量这个块往哪个方向进行了拉伸&#xff0c;各个方向拉伸了几倍。这也让人很容易理解为什么&#xff0c;行列式的值就是特征值的乘积。 特征向量也代表了一些良好的性质&#xff0c;即这些线在线性变换后…...

React的useReducer与Reudx对比

useReducer 和 Redux 都是用于处理应用程序的状态管理的工具&#xff0c;但它们在概念和使用场景上存在一些区别。 useReducer&#xff1a; useReducer 是 React 提供的一个 Hook&#xff0c;用于管理局部状态。它接受一个 reducer 函数和初始状态&#xff0c;并返回一个包含当…...

深度学习环境搭建 cuda、模型量化bitsandbytes安装教程 windows、linux

cuda、cudann、conda安装教程 输入以下命令&#xff0c;查看 GPU 支持的最高 CUDA 版本。 nvidia-smi cuda安装&#xff08;cudatoolkit&#xff09; 前往 Nvidia 的 CUDA 官网&#xff1a;CUDA Toolkit Archive | NVIDIA Developer CUDA Toolkit 11.8 Downloads | NVIDIA …...

pythond assert 0 <= colx < X12_MAX_COLS AssertionError

python使用xlrd读取excel时&#xff0c;报错&#xff1a; assert 0 < colx < X12_MAX_COLS AssertionError 大意是excel列太多了。主要是xlrd库的问题。最好的方法是不用它&#xff0c;但是我用的其他人提供的工具用到它&#xff0c;没法改。 尝试手动删除excel的列&am…...

js简介以及在html中的2种使用方式(hello world)

简介 javascript &#xff1a;是一个跨平台的脚本语言&#xff1b;是一种轻量级的编程语言。 JavaScript 是 Web 的编程语言。所有现代的 HTML 页面都使用 JavaScript。 HTML&#xff1a; 结构 css&#xff1a; 表现 JS&#xff1a; 行为 HTMLCSS 只能称之为静态网页&#xff0…...

vsCode使用cuda

一、vsCode使用cuda 前情提要&#xff1a;配置好mingw&#xff1a; 1.安装cuda 参考&#xff1a; **CUDA Toolkit安装教程&#xff08;Windows&#xff09;&#xff1a;**https://blog.csdn.net/qq_42951560/article/details/116131410 2.在vscode中添加includePath c_cp…...

ubuntu无法使用apt命令时怎么安装库

如题 因为某些原因&#xff0c;不能直接联网使用apt命令安装库。只能手动去ubuntu镜像源里 找对应的包的deb安装文件 镜像源地址&#xff08;适用于AMD64架构,就是常见的PC的X86-64啦&#xff09; 镜像源地址&#xff08;适用于ARM64,armhf,ppc64el,riscv64,s390x架构&#xff…...