stm32-定时器输入捕获

目录

一、输入捕获简介

二、输入捕获框图

1.定时器总框图

2.输入捕获框图 

3.主从触发模式

三、固件库实现 

1.定时器测量PWM频率

2.PWMI模式 


一、输入捕获简介

二、输入捕获框图

1.定时器总框图

 上图可知,四个输入捕获和输出比较共用4CCR寄存器,且输入捕获和输出比较的CH口是同一个,所以同一个通道同一时间只能使用一种功能

  • 输入滤波器和边沿检测器一旦检测到电平跳变,就会将CNT的值写入CCR中,类似于中断的作用

2.输入捕获框图 

分频器:

滤波器:

3.主从触发模式

主模式: 这个主模式的输出可以是PWM,即我的看法是主模式是用来作为其他定时器的输入的,比如我们用定时器1的PWMOC输出作为TIM2的输入捕获波型

触发源选择和从模式:即触发从模式的方式,比如我们可以用通道1的滤波后的定时器输入作为触发器,来触发从模式的复位,即通道一每接收到一次边沿跳变(具体的高低是我们自己设置的),就会触发从模式CNT清零

三、固件库实现 

1.定时器测量PWM频率

  • TIM3用于输出比较产生PWM,TIM4用于输入捕获,只有CH1和CH2有从模式
  • TIM4的配置同TIM3的前面一致,不过TIM4的ARR给到了65536-1 防止溢出时还未检测完频率
  • 初始化输入捕获单元,选上升沿---TIM_ICInit
  • 配置触发源--TIM_SelectInputTrigger
  • 配置从模式为RESET--TIM_SelectSlaveMode
  • 启动定时器,TIM_Cmd(TIM4,ENABLE);//CNT开始自增
  • 在主函数里用库函数设置TIM3的PSC和CRR,初始化的时候TIM3的ARR设置为100-1,这个数字好计算,用库函数读取N(CNT)

#include "bsp_tim.h"//TIM3--CH1--PA6
void TIM3_OC_Config()
{//开启时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启PWM引脚//重定义GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);//初始化GPIOGPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_AF_PP;//复用推挽,手册可看GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;GPIO_Init(GPIOA,&GPIO_InitStruct);//选择时基单元的时钟-为内部时钟--定时器上电后默认是内部时钟,故不写这一个也行TIM_InternalClockConfig(TIM3);//初始化时基单元TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;TIM_TimeBaseInitStruct.TIM_Prescaler = 720-1;//PSC-预分频器TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//向上计数 TIM_TimeBaseInitStruct.TIM_Period = 100-1;//ARR寄存器-重装载寄存器TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;/*不分频----滤波器的采样频率,可以由内部时钟直接提供,也可以由内部时钟加一个时钟分频而来,分频系数就是由TIM_ClockDivision决定*/TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;//重复计数器,只有高级定时器才有TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);//初始化OC-输出比较结构体TIM_OCInitTypeDef TIM_OCInitStruct;TIM_OCStructInit(&TIM_OCInitStruct);//因为结构体里面的成员有些是高级定时器采用得到,所以这里就先全部初始化一遍,然后再配置具体的值TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;//输出比较模式TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;//TIM_OCInitStruct.TIM_Pulse = 50;//CRR   --设置频率1KHZ,占空比50%,分辨率1%的PWM波型TIM_OCInitStruct.TIM_Pulse = 0;//用固件库的一个函数 TIM_SetCompare2 直接配置CRRTIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;//输出比较极性TIM_OC1Init(TIM3,&TIM_OCInitStruct);//CH1通道//启动定时器TIM_Cmd(TIM3,ENABLE);}
void PWM_SetCompare1(uint16_t Compare)//设置CRR,即比较值
{TIM_SetCompare1(TIM3,Compare);
}
void PWM_SetPrescaler(uint16_t Prescaler)//设置PSC
{TIM_PrescalerConfig(TIM3,Prescaler,TIM_PSCReloadMode_Immediate);//不使用影子寄存器
}
//TIM4--CH1--PB6
void TIM4_IC_Config()
{//开启时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启PWM引脚//初始化GPIOGPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;GPIO_Init(GPIOB,&GPIO_InitStruct);//选择时基单元的时钟-为内部时钟--定时器上电后默认是内部时钟,故不写这一个也行TIM_InternalClockConfig(TIM4);//初始化时基单元TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;TIM_TimeBaseInitStruct.TIM_Prescaler = 72-1;//PSC-预分频器-->fc = 72M/PSC = 1MTIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//向上计数 TIM_TimeBaseInitStruct.TIM_Period = 65536-1;//ARR寄存器-重装载寄存器TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;/*不分频----滤波器的采样频率,可以由内部时钟直接提供,也可以由内部时钟加一个时钟分频而来,分频系数就是由TIM_ClockDivision决定*/TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;//重复计数器,只有高级定时器才有TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStruct);//初始化输入捕获单元TIM_ICInitTypeDef TIM_ICInitStruct;TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;//输入通道TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;//上升沿TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;//直连通道 ,不交叉TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;//不分频--每次触发都有效TIM_ICInitStruct.TIM_ICFilter = 0xF;//滤波器参数TIM_ICInit(TIM4,&TIM_ICInitStruct);//配置触发源TIM_SelectInputTrigger(TIM4,TIM_TS_TI1FP1);//配置从模式为RESETTIM_SelectSlaveMode(TIM4,TIM_SlaveMode_Reset);//启动定时器TIM_Cmd(TIM4,ENABLE);//CNT开始自增}uint32_t IC_Get_Freq(void)
{return 1000000 / (TIM_GetCapture1(TIM4)+1);//fc/N   fc = 1M-->我们在上方配置的PSC为72-1//这里加1是为了凑整,--->不然测出来是1001//未连接PB6和PA6的时候是1000000是因为CRR1寄存器复位值为0,0+1=1 所以1M/1=1M
}
int main()
{OLED_Init();USART_Config();TIM3_OC_Config();TIM4_IC_Config();//配置TIM3的输出PWM频率和占空比				//CK_PSC = 72M   ARR+1 已经配置好了是100PWM_SetPrescaler(720-1);		//Freq = CK_PSC / (PSC+1)/(ARR+1)PWM_SetCompare1(50); 				//占空比 Duty = CCR /(ARR+1)//此时Freq = 72000000/720/100 = 1000while(1){i = IC_Get_Freq();OLED_ShowNum(1,1,i,7);}
}

2.PWMI模式 

PA6提供PWM
PB6接收PWM
接收的时候分两个通道接收,通道一接收频率,通道二接收占空比
--因为一个CCR寄存器只能接收一种数据
占空比 = 高电平时间/总时间,只用一个CCR无法测量
所以把CCR2当做测量高电平时间的工具
相当于把PWM信号通过CH1的通道输入到两个CCR中,所以最后只用测CH1的PWM就行
通道一上升沿
通道二下降沿
选CH1的RESET,->选中的触发输入(TRGI)的上升沿重新初始化计数器,并且产生一个更新寄存器的信号。
所以CCR1是上升沿->上升沿,即整个PWM
CCR2是从下降沿->上升沿
所以Duty = CCR2/CCR1

TIM_PWMIConfig()

使用这个函数可快速配置通道二,其原理就是用if语句判断当前已经配置好的通道,然后进行另一个通道的反向配置 

#include "bsp_tim.h"//TIM3--CH1--PA6
void TIM3_OC_Config()
{//开启时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启PWM引脚//重定义GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);//初始化GPIOGPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_AF_PP;//复用推挽,手册可看GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;GPIO_Init(GPIOA,&GPIO_InitStruct);//选择时基单元的时钟-为内部时钟--定时器上电后默认是内部时钟,故不写这一个也行TIM_InternalClockConfig(TIM3);//初始化时基单元TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;TIM_TimeBaseInitStruct.TIM_Prescaler = 720-1;//PSC-预分频器TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//向上计数 TIM_TimeBaseInitStruct.TIM_Period = 100-1;//ARR寄存器-重装载寄存器TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;/*不分频----滤波器的采样频率,可以由内部时钟直接提供,也可以由内部时钟加一个时钟分频而来,分频系数就是由TIM_ClockDivision决定*/TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;//重复计数器,只有高级定时器才有TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);//初始化OC-输出比较结构体TIM_OCInitTypeDef TIM_OCInitStruct;TIM_OCStructInit(&TIM_OCInitStruct);//因为结构体里面的成员有些是高级定时器采用得到,所以这里就先全部初始化一遍,然后再配置具体的值TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;//输出比较模式TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;//TIM_OCInitStruct.TIM_Pulse = 50;//CRR   --设置频率1KHZ,占空比50%,分辨率1%的PWM波型TIM_OCInitStruct.TIM_Pulse = 0;//这里的CRR就不需要了,用固件库的一个函数 TIM_SetCompare2 直接配置CRRTIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;//输出比较极性TIM_OC1Init(TIM3,&TIM_OCInitStruct);//CH1通道//启动定时器TIM_Cmd(TIM3,ENABLE);}
void PWM_SetCompare1(uint16_t Compare)//设置CRR,即比较值
{TIM_SetCompare1(TIM3,Compare);
}
void PWM_SetPrescaler(uint16_t Prescaler)//设置PSC
{TIM_PrescalerConfig(TIM3,Prescaler,TIM_PSCReloadMode_Immediate);//不使用影子寄存器
}
//TIM4--CH1--PB6-频率
// 			CH2--PB7-占空比	
void TIM4_IC_Config()
{//开启时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启PWM引脚//初始化GPIOGPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;GPIO_Init(GPIOB,&GPIO_InitStruct);//选择时基单元的时钟-为内部时钟--定时器上电后默认是内部时钟,故不写这一个也行TIM_InternalClockConfig(TIM4);//初始化时基单元TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;TIM_TimeBaseInitStruct.TIM_Prescaler = 72-1;//PSC-预分频器-->fc = 72M/PSC = 1MTIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//向上计数 TIM_TimeBaseInitStruct.TIM_Period = 65536-1;//ARR寄存器-重装载寄存器TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;/*不分频----滤波器的采样频率,可以由内部时钟直接提供,也可以由内部时钟加一个时钟分频而来,分频系数就是由TIM_ClockDivision决定*/TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;//重复计数器,只有高级定时器才有TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStruct);//初始化输入捕获单元TIM_ICInitTypeDef TIM_ICInitStruct;TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;//输入通道TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;//上升沿TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;//直连通道 ,不交叉TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;//不分频--每次触发都有效TIM_ICInitStruct.TIM_ICFilter = 0xF;//滤波器参数TIM_ICInit(TIM4,&TIM_ICInitStruct);TIM_PWMIConfig(TIM4,&TIM_ICInitStruct);//由该函数的具体实现可知,我们上面配置的通道一,该函数就会给我们配置成通道二和应该更改的参数//作用同下/*TIM_ICInitStruct.TIM_Channel = TIM_Channel_2;//输入通道TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Falling;//下降沿TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_IndirectTI;//交叉TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;//不分频--每次触发都有效TIM_ICInitStruct.TIM_ICFilter = 0xF;//滤波器参数TIM_ICInit(TIM4,&TIM_ICInitStruct);*///配置触发源TIM_SelectInputTrigger(TIM4,TIM_TS_TI1FP1);//配置从模式为RESETTIM_SelectSlaveMode(TIM4,TIM_SlaveMode_Reset);//选中的触发输入(TRGI)的上升沿重新初始化计数器,并且产生一个更新寄存器的信号。--SMCR_SMSTIM_SelectMasterSlaveMode(TIM4,TIM_MasterSlaveMode_Enable);//使能主从模式--SMCR_MSM//启动定时器TIM_Cmd(TIM4,ENABLE);//CNT开始自增}float IC_Get_Freq(void)
{return 1000000 / (float)(TIM_GetCapture1(TIM4)+1);//fc/N   fc = 1M//这里加1是为了凑整,--->不然测出来是1001//未连接PB6和PA6的时候是1000000是因为CRR1寄存器复位值为0,0+1=1 所以1M/1=1M
}
float IC_Get_Duty(void)
{return (float)(100*(1+TIM_GetCapture2(TIM4)))/(1+TIM_GetCapture1(TIM4));//*100->为了显示的是整数,各加一是为了看着舒服
}
int main()
{OLED_Init();USART_Config();TIM3_OC_Config();TIM4_IC_Config();//配置TIM3的输出PWM频率和占空比				//CK_PSC = 72M   ARR+1 已经配置好了是100PWM_SetPrescaler(720-1);		//Freq = CK_PSC / (PSC+1)/(ARR+1)PWM_SetCompare1(50); 				//占空比 Duty = CCR /(ARR+1)//此时Freq = 72000000/720/100 = 1000while(1){i = IC_Get_Freq();j = IC_Get_Duty();OLED_ShowNum(1,1,i,7);OLED_ShowNum(3,1,j,3);}
}

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

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

相关文章

Android SystemServer进程解析

SystemServer进程在android系统中占了举足轻重的地位,系统的所有服务和SystemUI都是由它启动。 一、SystemServer进程主函数流程 1、主函数三部曲 //frameworks/base/services/java/com/android/server/SystemServer.java /** * The main entry point from zy…

人工智能程序使用的编程语言

用C语言可以写人工智能程序吗? 可以用C语言编写具有人工智能功能的程序,但是较为复杂。C语言是一种通用的编程语言,它在执行速度和资源控制方面表现出色,这使得它适合于需要高性能处理的人工智能应用,如游戏AI&#xf…

邮件安全|“AI钓鱼邮件”愈发泛滥,钓鱼邮件如何防“钓”?

毋庸置疑,人工智能是把双刃剑。 在AI蓬勃发展的过程中,潜在的风险正在悄然滋长。 近日,网络安全公司Enea发布的一份报告指出,随着以人工智能驱动的语音钓鱼(vishing)和短信钓鱼(smishing&…

tomcat中把项目放在任意目录中的步骤

java web 项目由idea开发&#xff0c;路径如下图所示&#xff1a; 1.在tomcat安装目录conf\Catalina\localhost 里面&#xff0c;编写lesson1.xml文件内容如下&#xff1a; <Context path"/lesson1" docBase"C:\Users\信息技术系\Desktop\2024\学校工作\jav…

【一】【单片机】有关LED的实验

点亮一个LED灯 根据LED模块原理图&#xff0c;我们可以知道&#xff0c;通过控制P20、P21...P27这八个位置的高低电平&#xff0c;可以实现D1~D8八个LED灯的亮灭。VCC接的是高电平&#xff0c;如果P20接的是低电平&#xff0c;那么D1就可以亮。如果P20接的是高电平&#xff0c;…

【四 (4)数据可视化之 Ploty Express常用图表及代码实现 】

目录 文章导航一、介绍二、安装Plotly Express三、导入Plotly Express四、占比类图表1、饼图2、环形图3、堆叠条形图4、百分比堆叠条形图 五、比较排序类1、条形图2、漏斗图3、面积漏斗图 六、趋势类图表1、折线图2、多图例折线图3、分列折线图4、面积图5、多图例面积图 七、频…

逻辑数据平台的 NoETL 之道(内含QA)

作者简介&#xff1a; 余俊&#xff0c;Aloudata 合伙人 & 技术副总裁。拥有 18 年互联网技术和大数据平台相关架构经验。作为主架构师及核心研发主导并完成了 Alibaba B2B 首个海量分布式 KV 存储系统&#xff0c;作为网站架构师负责 Aliexpress 全球买全球卖交易系统的第…

【云原生-kubernetes系列】--kubernetes日志收集

1、ELK架构 1.1、部署ES集群 https://mirrors.tuna.tsinghua.edu.cn/elasticstack/apt/7.x/pool/main/e/elasticsearch/ 1、下载软件包 rootes-server1:~# wget https://mirrors.tuna.tsinghua.edu.cn/elasticstack/apt/7.x/pool/main/e/elasticsearch/elasticsearch-7.12.0-…

STL库中的string

文章目录 一、STL的六大组件二、string类2.1string中的size()方法2.2隐式类型的转换2.3string的多种构造2.4string中size与length是否有差异&#xff1f;2.4string中的capacity2.5string中的push_back和append2.6string中运算符重载operator2.7string中的reserve扩容2.8string中…

数据结构——字符串

1.leetcode 151 题目链接&#xff1a; . - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/reverse-words-in-a-string/…

体验OceanBase OBD V2.5.0 组件内扩容和组件变更

背景 OBD 是OceanBase的命令行部署工具&#xff0c;在 obd V2.5.0 版本之前&#xff0c;其主要功能主要是部署各类组件&#xff0c;例如 oceanbase-ce,obproxy-ce,obagent 等。然而&#xff0c;它并不支持组件的变更操作以及组件内部的扩缩容调整。具体来说&#xff1a; 1、若…

网络层_IP

传输层解决的是传输控制&#xff0c;而实际真正决定数据能否发送到对端的是网络层。网络层是有概率传输&#xff0c;而传输层是可靠性传输。所以传输层网络层就可以做到将数据可靠发送到对端。网络层的常见协议有&#xff1a;IP、ICMP等&#xff0c;其中最重要的是IP协议&#…

STM32F103 CubeMX 使用USB生成鼠标设备

STM32F103 CubeMX 使用USB生成鼠标设备 1 配置cubeMX1.1配置外部晶振&#xff0c;配置debug口1.2 配置USB1.3 配置芯片的时钟1.4 生成工程 2. 编写代码2.1 添加申明2.2 main函数代码 1 配置cubeMX 1.1配置外部晶振&#xff0c;配置debug口 1.2 配置USB 1.3 配置芯片的时钟 需…

云与云计算:从传统到云端的IT资源变革

云&#xff1a;从分散到集约&#xff0c;资源服务化的新模式 让我们先通过一个生活化的场景来理解“云”这一概念。几十年前&#xff0c;诸如农村地区的居民需要自给自足&#xff0c;比如在自家院子里打井取水&#xff0c;冬季烧煤取暖&#xff0c;一切满足自己生活需要的都要…

html和winform webBrowser控件交互并播放视频(包含转码)

1、 为了使网页能够与winform交互 将com的可访问性设置为真 [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name "FullTrust")][System.Runtime.InteropServices.ComVisibleAttribute(true)] 2、在webBrow…

idea+vim+pycharm的块选择快捷键

平时开发的时候&#xff0c;有的时候我们想用矩形框住代码&#xff0c;或者想在某列上插入相同字符 例如下图所示&#xff0c;我想在22-24行的前面插入0000 1. Idea的快捷键&#xff1a;option 鼠标 2. Pycharm的快捷键&#xff1a;shift option 鼠标 2. Vim 块选择 v/V/c…

spy分析文件另存为弹框【selenium】

有时需要下载多个文件&#xff0c;但是不想保存在同一个目录下&#xff0c;需要做两步 selenium设置浏览器默认下载路径&#xff0c;这个路径需要是个不存在的路径操作文件另存为弹框 文章目录 selenium设置浏览器默认下载路径操作文件另存为弹框 selenium设置浏览器默认下载路…

Github和TeamCity的持续集成构建

一、简介 TeamCity是JetBrains旗下的一款持续集成[Continuous Integration&#xff0c;简称CI]工具&#xff0c;开箱即用。TeamCity提供一系列特性可以让团队快速实现持续集成&#xff1a;IDE工具集成、各种消息通知、各种报表、项目的管理、分布式的编译等等。 二、安装使用(…

Excel xlsx file:not supported

报错信息&#xff1a; 原因&#xff1a; Excel和xlrd版本不匹配 解决措施&#xff1a; 降低xlrd版本或Excel版本 方法一&#xff1a; 1) 先卸载了原来的版本&#xff1a;uninstal xlrd 2) 安装新的低版本xlrd模块pip install xlrd1.2.0 方法二&#xff1a; 1&#xff09…

AI日报:欧盟人工智能法案通过后行业面临合规障碍

文章目录 人工智能新规对web爬网的影响对英国的影响。 人工智能新规 立法者已经通过了欧盟人工智能法案。企业现在必须确保其人工智能应用程序符合规则。 全面的新规定对可能影响公民权利的人工智能系统实施制裁&#xff0c;并有可能彻底禁止某些系统。 违反规定的公司可能面…