TIM时钟中断——输出捕获、输入捕获、编码器接口测速

news2024/11/24 9:29:00

输出捕获

在这里插入图片描述

通道与DMA

计算机中的通道是一种专用于输入/输出(I/O)操作的控制器,它充当了主机(包括CPU和内存)与外部设备之间数据传输的桥梁。通道的主要目的是提高系统的并行处理能力,允许CPU与I/O设备同时工作,从而提升整体效率。

通道的基本特点和功能:
独立性:通道是一个相对独立的处理单元,拥有自己的指令集(通道指令),可以独立于CPU执行I/O操作。这意味着CPU可以启动通道后继续执行其他任务,不必等待I/O操作完成。

直接内存访问 (DMA):通道能够直接与内存交互,进行数据传输,无需CPU介入每个数据传输步骤,这大大减少了CPU的负担。

并行处理:通过使用通道,计算机系统能够实现CPU处理计算任务与通道处理I/O操作的同时进行,即CPU与I/O并行工作,提高了系统性能。

多种类型:常见的通道类型有字节多路通道、数组多路通道和选择通道,每种类型适用于不同场景下的I/O需求。例如,字节多路通道适合连接大量低速设备,而数组多路通道适合处理高速数据传输的设备。

中断机制:一旦通道完成指定的I/O任务,它会向CPU发送一个中断信号,通知CPU任务已完成,这样CPU可以适时地处理后续操作或结果。

与DMA的关系:
通道技术通常与直接内存访问(DMA)结合使用,但两者有所区别。DMA主要关注数据在内存与外设间的直接传输,减少CPU在数据传输中的参与,而通道技术更侧重于对外部设备的管理和控制,是一种更高级别的I/O处理机制。

总的来说,计算机中的通道是提高系统效率的关键组件之一,特别是在需要频繁进行大量I/O操作的大型系统或特定应用环境中。

频率测量

在这里插入图片描述

测周法: 一个标准频率用时= 1/Fc, 两个上升沿为一个周期,T= (1/Fc) * N , 所以 Freq= Fc/N

高频率用测频法,低频率用测周法

PWMI模式: 波形上升沿统计频率,下降沿用于统计占空比

主从触发模式(主动发出信号和被动接收信号,进行相关操作的)

在这里插入图片描述

输入捕获结构(基本定时器TIM1、2都可以选择从模式让CNT自动清零,TIM3、4则需要通过捕获中断来实现,消耗资源)

在这里插入图片描述 - 标准频率(Fc)= 72MHz / 预分频系数

  • 频率太低的时候,周期变长,CNT的值可能会溢出

PWMI基本结构

在这里插入图片描述

  • CCR2 / CCR1 = 占空比

输入捕获连线图

在这里插入图片描述

输入捕获结构

在这里插入图片描述

//测频率
#include "stm32f10x.h"
#include "PWM.h"
//输入捕获初始化
void IC_Init(void){
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);   //输入捕获,开启时钟3
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);    //配置GPIO
    
    GPIO_InitTypeDef GI;
    GI.GPIO_Mode = GPIO_Mode_IPU;    //引脚复用
    GI.GPIO_Pin = GPIO_Pin_6;         //TIM3专用引脚之一
    GI.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GI);
  
    TIM_InternalClockConfig(TIM2);
  
    TIM_TimeBaseInitTypeDef TI;     //配置时钟单元
    TI.TIM_ClockDivision = TIM_CKD_DIV2;
    TI.TIM_CounterMode = TIM_CounterMode_Up;
    TI.TIM_Period = 65536-1;  //ARR满减
    TI.TIM_Prescaler = 72-1;    //PSC,决定计数频率(72MHz/psc)
    TI.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM3,&TI);  
  
     //初始化输入捕获单元
     TIM_ICInitTypeDef TIC;
     TIC.TIM_Channel = TIM_Channel_1;
     TIC.TIM_ICFilter = 0xF;   //滤波器,避免干扰信号,数值越大,采样效果越好
     TIC.TIM_ICPolarity = TIM_ICPolarity_Rising;
     TIC.TIM_ICPrescaler =  TIM_ICPSC_DIV1;    //每次更新事件,都捕获一次输入
     TIC.TIM_ICSelection = TIM_ICSelection_DirectTI;
     TIM_ICInit(TIM3,&TIC);
     
     //从模式,触发源以及模式选择(触发复位)
     TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);
     TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);
     
     //启动定时器
     TIM_Cmd(TIM3,ENABLE);
}

//自定义计算频率函数,这里用测周法:Freq = Fc/N  , 由于PSC为72-1,所以Fc=1MHz=(72MHz / PSC)
uint32_t IC_GetFreq(void){
    return 1000000  / (TIM_GetCapture1(TIM3)+1);  
}


#ifndef IC_H
#define IC_H
//输入捕获初始化
void IC_Init(void);
//自定义计算频率函数,这里用测周法:Freq = Fc/N  , 由于PSC为72-1,所以Fc=1MHz=(72MHz / PSC)
uint32_t IC_GetFreq(void);
#endif

测PWM占空比(两通道同时捕获同一引脚)

#ifndef IC_H
#define IC_H
//输入捕获初始化
void IC_Init(void);
//自定义计算频率函数,这里用测周法:Freq = Fc/N  , 由于PSC为72-1,所以Fc=1MHz=(72MHz / PSC)
uint32_t IC_GetFreq(void);
//获取占空比,上升沿次数记录在CCR1,下降沿次数记录在CCR2
uint32_t IC_GetDuty(void);
#endif



#include "stm32f10x.h"                  // Device header
//初始化PWM
void PWM_Init(void){
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);   //时钟中断
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);  //为呼吸灯指定引脚PA0
  //法二:为了提高引脚使用率,重映射端口,打开AFIO,重映射引脚,解除调试端口
//  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
//  GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2,ENABLE);
//  GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); //禁用JTAG调试,这里用的是ST-Link
  
  GPIO_InitTypeDef GI;
  GI.GPIO_Mode = GPIO_Mode_AF_PP;   //(外设)控制引脚,PA2要用复用推挽输出
  GI.GPIO_Pin = GPIO_Pin_0;
  GI.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA,&GI);
  
  TIM_InternalClockConfig(TIM2);     //内部时钟
 
  TIM_TimeBaseInitTypeDef TI;     //时钟中断配置
  TI.TIM_ClockDivision = TIM_CKD_DIV1 ;
  TI.TIM_CounterMode = TIM_CounterMode_Up;
  TI.TIM_Period = 100-1;    // ARR
  TI.TIM_Prescaler = 720-1;      // PSC ,CK_PSC=72MHZ
  TI.TIM_RepetitionCounter = 0;
  TIM_TimeBaseInit(TIM2,&TI);
  
  //时钟中断的输出比较模块定义: PWM波形,频率1KHZ,占空比50%,分辨率为 1%,
  TIM_OCInitTypeDef OCI;
  TIM_OCStructInit(&OCI); //先初始化输出比较模块,后续修改某个属性,其余属性默认
  
  OCI.TIM_OCMode = TIM_OCMode_PWM1;
  OCI.TIM_OCPolarity = TIM_OCPolarity_High;   //极性,高电平有效电平
  OCI.TIM_OutputState = TIM_OutputState_Enable;
  OCI.TIM_Pulse = 0;    //CCR捕获寄存器,可以通过改变CCR的值,调制PWM波形的占空比,从而改变LED灯的亮度    
  TIM_OC1Init(TIM2,&OCI);  //pwm波形初始化 ,将结构体变量交给TIM_OC1Init,配置TIM2的输出比较通道1,端口PA0
  
   TIM_Cmd(TIM2,ENABLE);  //时钟中断使能
  
}

//动态改变CCR
void PWM_SetCompare1(uint16_t Compare){
   
   TIM_SetCompare1(TIM2,Compare); //该函数用于设置CRR的值

}

//动态修改PSC ,  PSC的频率=更新频率= 72MHZ/(PSC+1)/(ARR+1)
void PWM_SetPrescaler_TIM2(uint16_t PSC) {
   
    TIM_PrescalerConfig(TIM2,PSC,TIM_PSCReloadMode_Immediate);     //先把修改写进影子寄存器,触发更新事件再修改
  
}

#include "stm32f10x.h"    // Device header
#include "MyDelay.h"   //自定义延时函数
#include "Delay.h"     //官方延迟函数
#include "Button.h"   //按键Led驱动
#include "stdio.h"
#include "OLED.h"
#include "Servos.h"
#include "DCmotors.h"
#include "PWM.h"
#include "IC.h"

int main(void){
  //环境配置
   OLED_Init();
   PWM_Init();
   IC_Init();
   
   /*显示静态字符串*/
	OLED_ShowString(1, 1, "Freq:00000Hz");		//1行1列显示字符串Freq:00000Hz
	OLED_ShowString(2, 1, "Duty:00%");			//2行1列显示字符串Duty:00%
  
   PWM_SetPrescaler_TIM2(7200-1); //Freq = 72MHz / (PSC+1) / (ARR+1),这里的频率是1000Hz  
   PWM_SetCompare1(70);    //Duty = CCR/100 ,这里的占空比是50%
   
   while(1){
      OLED_ShowNum(1, 6, IC_GetFreq(), 5);	//不断刷新显示输入捕获测得的频率
		  OLED_ShowNum(2, 6, IC_GetDuty(), 2);	//不断刷新显示输入捕获测得的占空比      
   }
   return 0;
}

编码器(常见应用:使用PWM驱动电机,再用编码器测电机速度,接着用PID算法进行闭环控制)

在这里插入图片描述

正交编码器(抗噪声,可根据正交编码规律,对不符合规律的噪声状态,不予计次)

在这里插入图片描述

编码器接口基本结构

在这里插入图片描述

编码器工作模式(与正反转的正交波形对应)

在这里插入图片描述

实例(对应通道给上升沿,不反相)

在这里插入图片描述

实例(对应通道给下降沿,反相)

在这里插入图片描述

接线图

在这里插入图片描述

TIM_RepetitionCounter

它是STM32定时器的一个寄存器位,它的主要作用是控制定时器中断的触发频率。具体来说,TIM_RepetitionCounter定义了在产生一个更新(溢出)中断之前,定时器的计数器需要重复溢出的次数。

当你设置TIM_RepetitionCounter的值大于0时,定时器的计数器会在每次达到自动重载值后,不是立即产生中断,而是需要再重复计数指定的次数(TIM_RepetitionCounter的值),之后才会产生一个更新中断。这样一来,你就可以通过这个参数来延长中断产生的周期,而不需要改变基础的计数配置(如预分频和计数周期)。

例如,如果你将TIM_RepetitionCounter设置为3,那么定时器会在计数器溢出4次(初始溢出加3次重复溢出)后才触发一次中断,从而实现了中断周期的扩展。

如果TIM_RepetitionCounter没有被显式配置,其值可能是随机的,这可能会导致定时或中断行为不符合预期,特别是在需要精确定时的应用场景中。因此,在初始化定时器时,明确设置TIM_RepetitionCounter是非常重要的,尤其是当你依赖于定时器中断来进行精确控制时。

编码器测速代码

#include "stm32f10x.h"                  // Device header
#include "MyDelay.h"   //自定义延时函数
#include "Delay.h"     //官方延迟函数
#include "Button.h"   //按键Led驱动
#include "stdio.h"
#include "MyClock.h"
#include "OLED.h"
#include "Encoder.h"

int16_t Speed;      
int main(void){
  //环境配置
   OLED_Init();  
   Timer_Init();
   Encoder_Init();
   while(1){
     OLED_ShowSignedNum(1,5,Speed,5);   //现象:旋转一次计数器加4,因为上升沿、下降沿各两次
     //Delay_ms(1000);                      //测完旋转编码器的速度后,延时读秒,之后下一个循环CNT清零,可以通过时钟中断取代延时函数
   }    
   return 0;
}
//时钟中断,中断触发频率由TImer_Init中的ARR、PSC的值决定,频率执行配置
void TIM2_IRQHandler(void){
    if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET){
           Speed = Encoder_GetCounter();
           TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
    }
}



#ifndef Encode_H
#define Encode_H
//编码器配置初始化
void Encoder_Init();
//获取计数值
int16_t Encoder_GetCounter();
#endif





#include "stm32f10x.h"
#include "OLED.h"
int16_t Encoder_Count;  //用于记录编码器旋转次数
//编码器配置初始化(旋转计数)
void Encoder_Init(){
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  
    GPIO_InitTypeDef GI;
    GI.GPIO_Mode = GPIO_Mode_IPU;
    GI.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
    GI.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GI);
  
    //内部时钟
    TIM_InternalClockConfig(TIM3);
  
    //时钟属性配置
    TIM_TimeBaseInitTypeDef TI;
    TI.TIM_ClockDivision = TIM_CKD_DIV1;
    TI.TIM_CounterMode = TIM_CounterMode_Up;
    TI.TIM_Period = 65536-1;   //ARR计数范围最大,方便换成负数
    TI.TIM_Prescaler = 1-1;   //1-1,不分频
    TI.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM3,&TI);
  
    //时钟的输入捕获通道配置(两个)
    TIM_ICInitTypeDef TIC;
    TIM_ICStructInit(&TIC);   //避免输入捕获某些属性配置失败,可以先配置默认属性
    TIC.TIM_Channel = TIM_Channel_1;  //通道1
    TIC.TIM_ICFilter = 0xF;
    TIC.TIM_ICSelection = TIM_ICSelection_DirectTI;
    TIM_ICInit(TIM3,&TIC); 
 
    TIM_ICStructInit(&TIC);   //避免输入捕获某些属性配置失败,可以先配置默认属性
    TIC.TIM_Channel = TIM_Channel_2;   //通道2
    TIC.TIM_ICFilter = 0xF;
    TIC.TIM_ICSelection = TIM_ICSelection_DirectTI;
    TIM_ICInit(TIM3,&TIC); 
    
    //编码器接口,配置为T1,T2都计数,非反相,配置极性
    TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);
    //时钟使能
    TIM_Cmd(TIM3,ENABLE);       
    
}
//获取计数值
int16_t Encoder_GetCounter(){
   uint16_t Counter = TIM_GetCounter(TIM3);
   TIM_SetCounter(TIM3,0);  //获取CNT值后,清零
   return Counter;
}


//端口0中断处理函数
void EXTI0_IRQHandler(void){
     //获取中断标志位
     if(EXTI_GetITStatus(EXTI_Line0) == SET){ //触发中断后,端口为高电平
       if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) == 0){ //B下降沿,A低电平,正向旋转
          Encoder_Count++;
          OLED_ShowNum(2,1,Encoder_Count,16);
       }
       //清除标志位
       EXTI_ClearITPendingBit(EXTI_Line0);
    }
}

//端口1中断处理函数
void EXTI1_IRQHandler(void){
     //获取中断标志位
     if(EXTI_GetITStatus(EXTI_Line1) == SET){ //触发中断后,端口为高电平
        if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==0){  //A下降沿,B低电平,逆向旋转
           Encoder_Count--;
           OLED_ShowNum(2,1,Encoder_Count,16);
        }
       //清除标志位
       EXTI_ClearITPendingBit(EXTI_Line1);
    }
}

//定时器初始化,时钟中断更新频率设置为1s
//定时器初始化
void Timer_Init(void){
  // Enables or disables the Low Speed APB (APB1) peripheral clock.(外部时钟)
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
  
   //(内部时钟)
   TIM_InternalClockConfig(TIM2);
  
   //基本定时器配置
  TIM_TimeBaseInitTypeDef BaseTI;
  BaseTI.TIM_ClockDivision = TIM_CKD_DIV1;
  BaseTI.TIM_CounterMode =   TIM_CounterMode_Up; //向上计数法
  BaseTI.TIM_Prescaler = 7200-1;   //PSC,计数器(PSC大,ARR小,则定时器频率低,OV=C_PSC/PSC+1/ARR+1)
  BaseTI.TIM_Period = 10000-1;   //ARR,重定位值 ,(PSC小,ARR大,则定时器频率高) 
  BaseTI.TIM_RepetitionCounter = 0;    //Specifies the repetition counter value. Each time the RCR downcounterreaches zero, an update event is generated and counting restarts from the RCR value
  TIM_TimeBaseInit(TIM2,&BaseTI); 
  
  //由于时钟在初始化的时候,触发了一次更新事件使预分频器的值有效,所以要清除掉更新事件,避免后续计时器数值从一开始
  TIM_ClearFlag(TIM2,TIM_FLAG_Update);  
  
   //中断配置,由更新事件触发中断
  TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
  
  //中断控制器
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  NVIC_InitTypeDef NI;
  NI.NVIC_IRQChannel = TIM2_IRQn;
  NI.NVIC_IRQChannelCmd = ENABLE;
  NI.NVIC_IRQChannelPreemptionPriority = 2;
  NI.NVIC_IRQChannelSubPriority = 1;  
  NVIC_Init(&NI);
  
  //启动定时器
  TIM_Cmd(TIM2,ENABLE);
}

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

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

相关文章

探秘Facebook:社交媒体的未来之路

Facebook,作为全球最大的社交媒体平台之一,一直处于数字社交革命的前沿。然而,随着科技和社会的不断发展,Facebook正面临着新的挑战和机遇。本文将探索Facebook的未来之路,揭示社交媒体的新趋势和发展方向。 1. 深度社…

二、Nginx目录结构与基本运行原理

目录 一、目录结构 二、运行原理 一、目录结构 我们使用tree 命令查看nginx的目录。如果tree 命令失效,需要安装tree工具 [rootlocalhost local]# yum install -y tree[rootlocalhost /]# tree /usr/local/nginx /usr/local/nginx ├── client_body_temp # PO…

PDF软件PDF Extra Premium + Ultimate 9.30.56026

PDF Extra Premium是一个适用于Windows的程序,它提供了所有功能,***在一个地方处理PDF文件的需要。使用此程序,您可以: 扫描和识别文本。您可以轻松地将纸质文档扫描并数字化为可编辑的PDF文件。您可以使用手机的摄像头扫描任何类型的纸质文档:支票、合同、票据、票据、证…

外贸物流与报关操作全解析:避开那些常见的坑

外贸物流与报关是外贸流程中至关重要的环节,任何疏漏都可能导致货物延误、额外费用甚至违约赔偿。本文将详细解析外贸物流与报关操作的关键要点,并告诉你如何避开常见的坑。 一、外贸物流操作 外贸物流,即货物进出口的运输过程,涉…

JDK7 JDK8 JDK9接口中的默认方法、静态方法、私有方法

JDK8开始之后接口新增的方法 JDK7以前:接口中只能定义抽象方法 JDK8的新特性:接口中可以定义有方法体的方法(默认、静态) JDK9的新特性:接口中可以定义私有方法 接口中的默认方法InterA package com.itheima.a06;p…

【C++题解】 1468. 小鱼的航程

问题&#xff1a;1468. 小鱼的航程 类型&#xff1a;需要找规律的循环 题目描述&#xff1a; 有一只小鱼&#xff0c;它上午游泳150公里&#xff0c;下午游泳100公里&#xff0c;晚上和周末都休息&#xff08;实行双休日)&#xff0c;假设从周x(1<x<7)开始算起&#xf…

C语言基础——函数

ʕ • ᴥ • ʔ づ♡ど &#x1f389; 欢迎点赞支持&#x1f389; 个人主页&#xff1a;励志不掉头发的内向程序员&#xff1b; 专栏主页&#xff1a;C语言基础&#xff1b; 文章目录 前言 一、函数的概念 二、库函数 2.1 库函数和头文件 2.2 库函数的使用/…

python中关于函数的两种链式调用

函数之间的嵌套调用之函数的返回值就是另一个函数的参数 用一个函数的返回值作为另一个函数的参数。 如上图所示&#xff0c;将is0dd&#xff08;10&#xff09;的结果交给print函数来执行。 如上图所示&#xff0c;也是一个链式调用的案例&#xff0c;先将add&#xff08;x&a…

Linux宝塔部署数据库连接问题

博主在部署项目时发现网页可以成功部署&#xff0c;但是登录界面一直登录不进去推测是数据库连接问题。 博主当时在IDEA中写的是用户名为root 密码123456 但是在宝塔中因为自己是跟着教程学的所以就顺手把用户名和密码都改了&#xff0c;于是java中的配置和数据库配置连接不上…

toB市场 | 我们喜欢赞助这样的展会活动

过去的六一儿童节&#xff0c;刚去成都参加了个行业内的展会。受护网行动、儿童节等等的影响&#xff0c;这次去成都的客户并不算太多&#xff0c;但会议延续了一贯的高品质&#xff0c;让我们收货满满。 选择目标受众来得多的展会 不同厂商会视自己的产品和模式、目标客户来…

15天搭建ETF量化交易系统Day7—全自动化交易系统

搭建过程 每个交易者都应该形成一套自己的交易系统。 很多交易者也清楚知道&#xff0c;搭建自己交易系统的重要性。现实中&#xff0c;从&#xff10;到&#xff11;往往是最难跨越的一步。 授人鱼不如授人以渔&#xff0c;为了帮助大家跨出搭建量化系统的第一步&#xff0c;我…

热搜爆了!AI秒写3篇湖南高考作文,邀你来打分!

今天上午 全国高考语文科目结束 作文题目成为焦点 相关话题立刻冲上热搜 今年湖南高考采用的是新课标 I 卷 作文题涉及到了人工智能 引发大量网友讨论 ↓↓↓ 随着互联网的普及、人工智能的应用&#xff0c;越来越多的问题能很快得到答案。那么&#xff0c;我们的问题是…

零基础入门学用Arduino 第一部分(一)

重要的内容写在前面&#xff1a; 该系列是以up主太极创客的零基础入门学用Arduino教程为基础制作的学习笔记。个人把这个教程学完之后&#xff0c;整体感觉是很好的&#xff0c;如果有条件的可以先学习一些相关课程&#xff0c;学起来会更加轻松&#xff0c;相关课程有数字电路…

编程规范-代码检测-格式化-规范化提交

适用于vue项目的编程规范 – 在多人开发时统一编程规范至关重要 1、代码检测 --Eslint Eslint&#xff1a;一个插件化的 javascript 代码检测工具 在 .eslintrc.js 文件中进行配置 // ESLint 配置文件遵循 commonJS 的导出规则&#xff0c;所导出的对象就是 ESLint 的配置对…

SG3225EEN贴片差分晶振可实现高频高精度的要求

在高速通信和高性能电子设备的发展中&#xff0c;高频高精度时钟源的需求日益增加。SG3225EEN贴片差分晶振以其出色的性能&#xff0c;满足了这一需求&#xff0c;成为这些应用领域的理想选择。SG3225EEN贴片差分晶振采用先进的制造工艺&#xff0c;提供高精度和低抖动的时钟信…

005.FashionMNIST数据集简介

一、FashionMNIST数据集简介 FashionMNIST数据集&#xff0c;作为经典的MNIST数据集的现代替代品的数据集&#xff0c;是衣物分类数据集&#xff0c;由Zalando&#xff08;一家德国的在线时尚零售商&#xff09;发布。 FashionMNIST数据集和MNIST相比。图片尺寸相同&#xff0c…

超声波风速仪—快速捕捉气象变化

TH-WQX2超声波风速仪&#xff0c;特别是在风力发电中作为风速风向仪的应用&#xff0c;是一种基于超声波原理测量风速和风向的设备。以下是对其特点、技术参数和应用的详细介绍&#xff1a; 特点 高精度测量&#xff1a;超声波风速风向仪利用超声波在空气中的传播速度随风速变化…

2024下《系统集成项目管理工程师》50个高频考点汇总!值得收藏

宝子们&#xff01;5月软考考完了&#xff0c;终于可以考系统集成了&#xff01; 整理了50个高频考点&#xff0c;涵盖全书90%考点&#xff0c;先把这个存下&#xff01;再慢慢看书&#xff0c;边看书边背这个 1、信息安全的基本要素有&#xff1a; &#xff08;1&#xff09…

爬取股票数据python

最近在搜集数据要做分析&#xff0c;一般的数据来源是一手数据&#xff08;生产的&#xff09;和二手数据&#xff08;来自其他地方的&#xff09;。 今天我们爬取同花顺这个网站的数据。url为&#xff1a;https://data.10jqka.com.cn/ipo/xgsgyzq/ 话不多说直接上代码。有帮…

前端框架前置知识之Node.js:fs模块、path模块、http模块、端口号介绍

什么是模块&#xff1f; 类似插件&#xff0c;封装了方法 / 属性 fs 模块- 读写文件 代码示例 // 1. 加载 fs 模块对象 const fs require(fs) // 2. 写入文件内容 fs.writeFile(./test.txt, hello, Node.js, (err) > {if (err) console.log(err) //若 err不为空&#xf…