STM32学习笔记(6_6)- TIM定时器的输入捕获模式测频率和PWMI模式测频率占空比代码

无人问津也好,技不如人也罢,都应静下心来,去做该做的事。

最近在学STM32,所以也开贴记录一下主要内容,省的过目即忘。视频教程为江科大(改名江协科技),网站jiangxiekeji.com

现在开始上难度,STM32功能最强大、结构最复杂的外设——定时器,分四期介绍。

第一期介绍最基础的定时功能理论、定时器中断和定时器内外时钟源选择的代码。

第二期介绍定时器输出比较功能的代码,输出比较功能常用产生PWM波驱动电机。

本期介绍定时器输入捕获功能代码,常用测量方波频率。

最后介绍定时器的编码器接口,更方便读取正交编码器的输出波形,常用编码电机测速。

输入捕获常用函数

照旧先介绍一些输入捕获常用函数

TIM_ICInit(选择哪个定时器,包含各个配置的结构体):用结构体配置输入捕获单元的函数

和输出比较的初始化不同,TIM_ICInit的同一个定时器4个通道是共用一个函数的

void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);

和上个函数相似,都是用于初始化输入捕获单元的,但是TIM_ICInit函数只是单一地配置一个通道,而这个函数,可以快速配置两个通道。就是把外设电路配置成PWMI模式

void TIM_PWMIConfig(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);

可以给输入捕获结构体赋一个初始值,

void TIM_ICStructInit(TIM_ICInitTypeDef* TIM_ICInitStruct);

 选择输入触发源TRGI,对应从模式的触发源选择,比如用来选择TI1FP1

void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);

  选择输出触发源TRGO,对应主模式的触发源选择

void TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_TRGOSource);

 选择从模式

void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode);

 

分别单独配置通道1、2、3、4的分频器,这个参数结构体里也可以配置,是一样的效果

void TIM_SetIC1Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);
void TIM_SetIC2Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);
void TIM_SetIC3Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);
void TIM_SetIC4Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);

 分别读取4个通道的CCR,输入捕获模式下,CCR是只读的,要用GetCapture读出

uint16_t TIM_GetCapture1(TIM_TypeDef* TIMx);
uint16_t TIM_GetCapture2(TIM_TypeDef* TIMx);
uint16_t TIM_GetCapture3(TIM_TypeDef* TIMx);
uint16_t TIM_GetCapture4(TIM_TypeDef* TIMx);

两个程序现象

第一个是输入捕获模式测频率

在这里,为了测量外部信号的频率,我们先得有个信号源,产生一个频率和占空比可调的波形。这里借用上期的代码,先用PWM模块,在PA0端口输出一个频率和占空比可调的波形。然后我们测量波形的输入口是PA6,直接用杜邦线把PA0和PA6连起来,这样就能测量自己PWM模块产生波形的频率了

接线图 

初始化操作步骤

 借用的PWM模块需要做些修改,目前这个PWM代码的逻辑是,初始化TIM2的通道1,产生一个PWM波形,输出脚是PA0,然后通过下面这个SetCompare1的函数可以调节CCR1寄存器的值,从而控制PWM的占空比,但是目前PWM的频率。是在初始化里写好了的,是固定的。运行时不方便调节,所以我们在最后再加一个函数,用来便捷地调节PWM频率。

我们知道PWM频率=更新频率=72M/(PSC+1)/(ARR+1),所以PSC和ARR都可以调节频率。但是占空比=CCR/(ARR+1),实际通过ARR调节频率,还同时会影响到占空比,而通过PSC调节频率,不会影响占空比,显然比较方便。

所以我们的计划是,固定ARR为100-1,通过调节PSC来改变PWM频率,另外ARR为100-1,CCR的数值直接就是占空比,比较直观。

一般我们可以根据分辨率的要求,先确定好ARR。比如分辨率,1%就足够了,那ARR给100-1,这样PSC决定频率,CCR决定占空比,这样就i好算。如果我想要更高的分辨率,比如0,1%,那ARR就先固定1000-1,这样频率就是72M/预分频/1000,占空比就是CCR/1000。

因此我们后面需要再写一个函数,在初始化PWM之后单独修改PSC,在这里面,我们就要调用库函数里单独写入PSC的函数了,在tim.h里找下

TIM_PrescalerConfig(TIM2,要写入PSC的值,重装模式)

重装模式:就是你写入的值,是立刻生效,还是在更新事件生效

void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode);

具体的代码步骤按照下图的基本结构来配置

1、RCC开启时钟,把GPIO和TIM的时钟打开,这里用TIM3_CH1即PA6

	/*开启时钟*/
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);			//开启TIM3的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);			//开启GPIOA的时钟

2、GPIO初始化,把GPIO配置成输入模式,一般选择上拉输入或者浮空输入模式

	/*GPIO初始化*/
	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);							//将PA6引脚初始化为上拉输入

3、配置时基单元,让CNT计数器在内部时钟的驱动下自增运行。

ARR计数重装值,设置大一些,防止计数溢出,这里取最大65536-1

PSC预分频值暂时先给72-1,这样标准频率就是72M/72=1MHz

	/*时基单元初始化*/
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;				//定义结构体变量
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;     //时钟分频,选择不分频,此参数用于配置滤波器时钟,不影响时基单元功能
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数器模式,选择向上计数
	TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1;               //计数周期,即ARR的值
	TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;               //预分频器,即PSC的值
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;            //重复计数器,高级定时器才会用到
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);             //将结构体变量交给TIM_TimeBaseInit,配置TIM3的时基单元

4、配置输入捕获功能,包括滤波器、极性、直连通道还是交叉通道、分频器这些参数,用一个结构体就可以统一进行配置了

	/*输入捕获初始化*/
	TIM_ICInitTypeDef TIM_ICInitStructure;							//定义结构体变量
	TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;				//选择配置定时器通道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;	//输入信号交叉,选择直通,不交叉
	TIM_ICInit(TIM3, &TIM_ICInitStructure);							//将结构体变量交给TIM_ICInit,配置TIM3的输入捕获通道

5、选择从模式的触发源,触发源选择为TI1FP1,这里调用一个库函数,给一个参数就行了

6、选择触发之后执行的操作,执行Reset操作,这里也是调用一个库函数就行了

	/*选择触发源及从模式*/
	TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);					//触发源选择TI1FP1
	TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);					//从模式选择复位
																	//即TI1产生上升沿时,会触发CNT归零

7、最后,当这些电路都配置好之后,调用TIM_Cmd函数,开启定时器。

	/*TIM使能*/
	TIM_Cmd(TIM3, ENABLE);			//使能TIM3,定时器开始运行

这样所有的电路就能配合起来,按照我们的要求工作了。当我们需要读取最新一个周期的频率时,直接读取CCR寄存器,然后按照fc/N。计算一下就行了,这就是整个程序的思路。

/**
  * 函    数:获取输入捕获的频率
  * 参    数:无
  * 返 回 值:捕获得到的频率
  */
uint32_t IC_GetFreq(void)
{
	return 1000000 / (TIM_GetCapture1(TIM3) + 1);		//测周法得到频率fx = fc / N,这里不执行+1的操作也可
}

完整代码展示

和之前一样,先在Hardware下新建输入捕获文件夹(IC),添加对应的.h、.c文件

main函数
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "PWM.h"
#include "IC.h"

int main(void)
{
	/*模块初始化*/
	OLED_Init();		//OLED初始化
	PWM_Init();			//PWM初始化
	IC_Init();			//输入捕获初始化
	
	/*显示静态字符串*/
	OLED_ShowString(1, 1, "Freq:00000Hz");		//1行1列显示字符串Freq:00000Hz
	
	/*使用PWM模块提供输入捕获的测试信号*/
	PWM_SetPrescaler(720 - 1);					//PWM频率Freq = 72M / (PSC + 1) / 100
	PWM_SetCompare1(50);						//PWM占空比Duty = CCR / 100
	
	while (1)
	{
		OLED_ShowNum(1, 6, IC_GetFreq(), 5);	//不断刷新显示输入捕获测得的频率
	}
}
 IC.h文件
#ifndef __IC_H
#define __IC_H

void IC_Init(void);
uint32_t IC_GetFreq(void);

#endif
 IC.c文件
#include "stm32f10x.h"                  // Device header

/**
  * 函    数:输入捕获初始化
  * 参    数:无
  * 返 回 值:无
  */
void IC_Init(void)
{
	/*开启时钟*/
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);			//开启TIM3的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);			//开启GPIOA的时钟
	
	/*GPIO初始化*/
	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);							//将PA6引脚初始化为上拉输入
	
	/*配置时钟源*/
	TIM_InternalClockConfig(TIM3);		//选择TIM3为内部时钟,若不调用此函数,TIM默认也为内部时钟
	
	/*时基单元初始化*/
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;				//定义结构体变量
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;     //时钟分频,选择不分频,此参数用于配置滤波器时钟,不影响时基单元功能
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数器模式,选择向上计数
	TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1;               //计数周期,即ARR的值
	TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;               //预分频器,即PSC的值
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;            //重复计数器,高级定时器才会用到
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);             //将结构体变量交给TIM_TimeBaseInit,配置TIM3的时基单元
	
	/*输入捕获初始化*/
	TIM_ICInitTypeDef TIM_ICInitStructure;							//定义结构体变量
	TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;				//选择配置定时器通道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;	//输入信号交叉,选择直通,不交叉
	TIM_ICInit(TIM3, &TIM_ICInitStructure);							//将结构体变量交给TIM_ICInit,配置TIM3的输入捕获通道
	
	/*选择触发源及从模式*/
	TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);					//触发源选择TI1FP1
	TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);					//从模式选择复位
																	//即TI1产生上升沿时,会触发CNT归零
	
	/*TIM使能*/
	TIM_Cmd(TIM3, ENABLE);			//使能TIM3,定时器开始运行
}

/**
  * 函    数:获取输入捕获的频率
  * 参    数:无
  * 返 回 值:捕获得到的频率
  */
uint32_t IC_GetFreq(void)
{
	return 1000000 / (TIM_GetCapture1(TIM3) + 1);		//测周法得到频率fx = fc / N,这里不执行+1的操作也可
}

第二个是PWMI模式测频率和占空比

STM32的输入捕获还设计了一个PWMI模式,即PWM输入模式,

OLED第一行显示频率,当前是1000Hz;第二行显示占空比,当前是50%

 接线图 

这两个程序的接线图是一样的

初始化操作步骤

首先,开启时钟、GPIO和时基单元,都不需要更改,和测频率一样。然后输入捕获初始化的部分,需要升级,配置成两个通道同时捕获同一个引脚的模式。

 怎么配置?

方法一:把这个通道初始化的部分,复制一份,这个结构体定义的不要复制了,通道1改为通道2、直连输入改为交叉输入、上升沿触发改为下降沿触发。

方法二:方法一太繁琐,所以可用之前说的TIM_PWMIConfig函数,

	/*PWMI模式初始化*/
	TIM_ICInitTypeDef TIM_ICInitStructure;							//定义结构体变量
	TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;				//选择配置定时器通道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;	//输入信号交叉,选择直通,不交叉
	TIM_PWMIConfig(TIM3, &TIM_ICInitStructure);						//将结构体变量交给TIM_PWMIConfig,配置TIM3的输入捕获通道
																	//此函数同时会把另一个通道配置为相反的配置,实现PWMI模式

然后再新加一个获取占空比的函数即可,高电平的计数值存在CCR2里,整个周期的数值存在CCR1里,我们用CCR2/CCR1,就能得到占空比了

/**
  * 函    数:获取输入捕获的占空比
  * 参    数:无
  * 返 回 值:捕获得到的占空比
  */
uint32_t IC_GetDuty(void)
{
	return (TIM_GetCapture2(TIM3) + 1) * 100 / (TIM_GetCapture1(TIM3) + 1);	//占空比Duty = CCR2 / CCR1 * 100,这里不执行+1的操作也可
}

完整代码就不展示了,就在main函数中加了显示占空比的函数,和显示频率的函数没什么区别。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

狄仁杰审判周二杀妻案,这种推理办案效果果然神奇!

狄仁杰审判周二杀妻案,这种推理办案效果果然神奇! 江西彭泽县小南村,是一个只有几十户人家的小山村,背靠大山,面对腾水。在一户人家门前,站满了衙役捕快和看热闹的村民。 这家的男主人叫周二。狄仁杰走进…

通过KVM虚拟机部署磐维2.0数据库

一、安装KVM环境 1.1查看cpu是否支持虚拟化 Bash 服务安装查看机器是否支持虚拟化# cat /proc/cpuinfo | egrep vmx|svm flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe sys…

苹果 WWDC 24 将举行;高通、谷歌、英特尔等联合开发 AI 软件;艺术家谈及使用 Sora 创作视频体验

▶ 苹果WWDC 24 将于当地时间 6 月 10 日召开 3 月 27 日凌晨,苹果官宣将于当地时间 6 月 10 日举行今年的全球开发者发布大会。 苹果全球营销高级副总裁 Greg Joswiak 在社交媒体上表示:「在您的日历标记上 WWDC24 吧。这场活动无疑会令人惊喜&#xf…

BUUCTF刷题十一道(11)

文章目录 [羊城杯2020]easyphp[安洵杯 2019]不是文件上传bestphps revenge[SUCTF 2018]annonymous[GXYCTF2019]BabysqliV3.0 打开BUU排行榜仰望各位大佬&#xff0c;想来我所谓的努力还是微不足道 [羊城杯2020]easyphp <?php$files scandir(./); foreach($files as $file…

LNMP架构之mysql数据库实战

mysql安装 到官网www.mysql.com下载源码版本 实验室使用5.7.40版本 tar xf mysql-boost-5.7.40.tar.gz #解压 cd mysql-boost-5.7.40/ yum install -y cmake gcc-c bison #安装依赖性 cmake -DCMAKE_INSTALL_PREFIX/usr/local/mysql -DMYSQL_DATADIR/data/mysql -DMYSQL_…

【力扣刷题日记】1083.销售分析II

前言 练习sql语句&#xff0c;所有题目来自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免费数据库练习题。 今日题目&#xff1a; 1083.销售分析II 表&#xff1a;Product 列名类型product_idintproduct_namevarcharunit_priceint Product…

BRICK POP展示了有趣的链上游戏玩法与奖励机制

新游戏BRICK POP将Sui区块链技术与低Gas费用&#xff0c;以及其在Web3游戏开发方面的专业知识无缝结合。通过充分利用Sui和ONBUFF的INNO平台优势&#xff0c;BRICK POP为玩家提供了一个融合了前沿技术和引人入胜游戏的沉浸式游戏体验。BRICK POP游戏设计为实时交易和高用户参与…

迅雷拉新申请入口,官方如何对接?

星子助推迅雷网盘拉新一个多少钱&#xff1f;迅雷拉新推广5块钱的那个怎么做申请&#xff1f; 1、迅雷网盘拉新一个5元左右40%会员佣金&#xff0c;一天净几百上千&#xff0c;团队能做到几十万。 2、通过 星子助推这样的一级代理机构来对接申请&#xff0c;邀请码8x25k 星子助…

It takes two (搜索)

本题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 题目&#xff1a; 样例&#xff1a; 输入 3 4 AAAO AAAA AAAA 输出 NO 思路&#xff1a; 根据题目意思&#xff0c;如果存在的 A 联通不可以成为 矩形&#xff0c;输出 NO&#xff0c;否则输出 YES 这道题看数据范…

惠海 H6218L 降压芯片 支持宽压24V30V36V48V60V72V120V输入,转3.3V5V12V4A 大电流

降压芯片&#xff08;也称为DC-DC转换器或电压调节器&#xff09;是一种电子设备&#xff0c;用于将较高的输入电压降低到所需的输出电压。根据您提供的信息&#xff0c;这种降压芯片支持多种宽范围输入电压&#xff0c;包括24V、30V、36V、48V、60V、72V和120V&#xff0c;并能…

perf出现SIGBUS的coredump

coredump信息 (gdb) bt full #0 0x000055c37fa62c00 in perf_evsel__parse_sample (evsel0x55c381223b00, event0x7f144843ab30, data0x7ffcbbcf6540) at util/evsel.c:1939 type <optimized out> swapped <optimized out> array <optimized out> ma…

数字化转型核心:实现业务与技术深度融合的运维数字化管理之道

写在前面 数字化转型已经成为大势所趋&#xff0c;各行各业正朝着数字化方向转型&#xff0c;利用数字化转型方法论和前沿科学技术实现降本、提质、增效&#xff0c;从而提升竞争力。 数字化转型是一项长期工作&#xff0c;包含的要素非常丰富&#xff0c;如数字化转型顶层设…

工时表软件:提高工时审批效率,从消除手动操作开始

在记录员工的工作时间以及他们在工作时间内投入的劳动量方面&#xff0c;工时表确实发挥着重要作用。 不过&#xff0c;越来越多的企业发现手动工时表审批的局限性。手动审批往往需要领导或管理人员投入大量时间和精力&#xff0c;容易出错&#xff0c;并且缺乏明确的跟踪记录…

Java 学习和实践笔记(48):怎样用二维数组来存储表格数据?

怎样用数组的方式&#xff0c;来存储下面这个表格的数据&#xff1f; 示例代码如下&#xff1a; import java.util.Arrays;public class Test001 {public static void main(String[] args) {/*object类对象是类层次结构的根。每个类都有Object作为超类。所有对象&#xff0c;包…

财务收支系统怎么做,财务收支记账软件管理系统教程

财务收支系统怎么做&#xff0c;财务收支记账软件管理系统教程 一、前言 以下软件操作教程以 佳易王财务收支记账软件V17.0为例说明 件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 财务收支记账管理系统软件可按需定制 1、权限设置&#xff1a;管理员账…

被指华而不实的小罐茶:为广告营销豪掷亿元,谁来为其“买单”?

“酒壮英雄胆,茶引文人思”&#xff0c;茶与酒作为中国传统文化的代表,不仅承载着深厚的历史文化底蕴&#xff0c;也以其普遍性和共通性&#xff0c;逐渐成为现代生活中不可或缺的沟通媒介&#xff0c;被赋予独特的文化内涵与社交属性。 但不同于酒类本身具备的收藏价值&#…

QT_day4:对话框

1、完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密码不匹配&…

MATLAB:微分方程(组)数值解

一、显式微分方程 clc,clear tspan [0:10]; y0 2; [t1,y1] ode23(odefun_1,tspan,y0); %求数值解&#xff0c;精度相对低 [t2,y2] ode113(odefun_1,tspan,y0); %求数值解&#xff0c;精度相对高 yt sqrt(tspan1)1; %求精确解 subplot(1,2,1) plot(t1,y1,bo,t2,y2,r*,tspa…

Python学习:函数

函数定义 在Python中&#xff0c;函数&#xff08;Function&#xff09;是一组用于完成特定任务或计算的语句块。定义函数可以让我们将一段代码重用多次&#xff0c;提高代码的可读性和可维护性。以下是定义函数的基本语法和结构&#xff1a; def function_name(parameters):&…

Web3:探索区块链与物联网的融合

引言 随着科技的不断发展&#xff0c;区块链技术和物联网技术都成为了近年来备受瞩目的前沿技术。而当这两者结合在一起&#xff0c;将产生怎样的化学反应呢&#xff1f;本文将深入探讨Web3时代中区块链与物联网的融合&#xff0c;探索其意义、应用场景以及未来发展趋势。 1. …