当前位置:首页 > 壁挂炉 > 文章正文

非正弦波PLECSIARSTM32技能文章分享

编辑:[db:作者] 时间:2024-08-25 01:09:40

那么如果利用相同频率,不同相位/不同幅值的正弦波叠加会不会产生非正弦波的波形呢?

答案:不会,只要频率一样,无论是改变相位还是改变幅值,终极叠加的波形还是正弦波。

相同频率正弦波叠加情形下,正弦波相位的不同,会导致终极合成的正弦波波形的幅值有可能增大,也可能减小,大致如下图,相位相差0,幅值相加;相位相差180度,幅值相减,这个还是蛮好理解的:

那么如果相位不是0和180而是其他的呢?实在我们早已学过这个结论,第一次打仗的时候,该当还是在上高中,三角函数的和差化积公式:

这个公式很好的诠释了末了天生的波形的样子,按照这个来实际数学推导也可以得到这个结论:

以是说,相同频率的正弦波叠加,终极产生的波形还是正弦波。

例如如下仿真,两个正弦波,下图的V1和V2,频率相同(均为1khz),相位不相同(相差45)和幅值不相同(2V和3V),叠加到一起,终极得到的还是正弦波。
(V3作为V2的参考)终极合成的波形是蓝色的正弦波,频率仍旧是1khz,幅值为4.6V,相位为17旁边。

同样,也可以利用向量的思想去思考这个问题,就比如幅值均为1V,相位相差120的正弦波,可以用如下图去剖析:

通过仿真也可以验证结论是精确的:

结论:同频率正弦波叠加无法产生新的波形。

查看原文:https://www.dianyuan.com/eestar/article-8282.html

IPOSIM的引擎——PLECS

常常利用英飞凌器件的小伙伴一定对IPOSIM不陌生。
IPOSIM是英飞凌功率器件在线热仿真工具。
它无需下载安装,只需在网页大略输入几个参数,即可得到器件的损耗与结温。

利用IPOSIM的上风有:

✓IPOSIM可以帮助工程师快速选择英飞凌最佳的功率半导体元件,无需耗费大量韶光与经费去准备干系测试平台与等待样品的制作,就能快速验证与剖析该元件的效能,例如稳态剖析与损耗,以及在该运用上的效果。

✓用户可以自由的变动部分参数,例如负载行为、组件额定值或掌握方案。
仿真结果通过波形和表格呈现。
访问者选取多个元件,并直接比较不同选取元件之间的参数变革的影响。

✓IPOSIM的仿真结果可以通过文档形式进行下载,也可以通过结果页面的深度链接进行保存。
通过深度链接,工程师可以非常方便地与同事互换分享他们的仿真成果。

如此方便快速的工具,背后自然有功能强大的引擎推动。
IPOSIM背后的引擎便是PLECS,一个专业而强大的电力电子系统仿真平台。

什么是PLECS?

PLECS是一款用于电路和掌握结合的多功能仿真软件,尤实在用于电力电子和传动系统。
它来自瑞士Plexim GmbH公司,在欧美非常盛行。
PLECS被环球浩瀚有名公司的研发工程师誉为“环球最专业的系统级电力电子电路仿真软件”。
PLECS的上风来源于前辈的编程技能,以及领悟了非常规建模观点的仿真算法。
从2002年开始,PLECS已经在浩瀚工业领域成为电力电子仿真的标准。
范例运用涵盖新能源,车辆电子。

PLECS为英飞凌供应借助基于Web的仿真(Web-Based Simulation,简称WBS),英飞凌可以与广大工程师在线共享PLECS模型。
通过IPOSIM,工程师而无需购买与安装PLECS软件,即可利用该软件的强大功能。
PLECS为英飞凌供应借助基于 Web的仿真(Web-Based Simulation,简称WBS),英飞凌可以与广大工程师在线共享 PLECS模型。
通过IPOSIM,工程师而无需购买与安装PLECS软件,即可利用该软件的强大功能。

PLECS在热仿真方面的上风

散热和损耗评估是电力电子系统设计的主要方面,由于近年来对付高功率密度和紧凑封装的需求使得这方面的问题尤为突出。
利用PLECS可以在设计的低级阶段同时仿照电路和散热部分,为终极特定运行环境的系统供应适当的散热方案。

为了快速得到开关损耗,PLECS不仿真半导体开关瞬间的电压电流波形,而是记录下开关时候之前和之后的工况(如导通电流,截止电压,结温等)。
接下来利用这些数据从三维查表中读出损耗能量值。

PLECS在热仿真的上风在于PLECS利用查表的办法从厂商或利用者量测的真实损耗资讯来打算,而非传统软件例如Spice模型以元器件的多项参数来建模试算的办法来打算,有两个紧张上风:

1 PLECS以查表办法打算损耗,对电脑的处理器打算资源较为节约,因此能更快速地取得热仿真结果,纵然该电路模型有大量的开关元件也较不会造成仿真发散的情形。
因此更适宜用于複杂与大型模型的热仿真。

2 其余以查表办法打算的损耗较靠近真实的工况, 由于开关元件的热损耗资料来源是从厂商或是利用者透过仪器实地量测,或是从厂商的datasheet或是产品出厂的检测报告取得。

查看原文:https://www.dianyuan.com/eestar/article-8236.html

不同复位类型设置对IAR在线调试有何影响?

做Cortex-M内核MCU嵌入式软件开拓,可用的集成开拓环境(IDE)非常多。
经典的GCC咱们就不提了,选择不同MCU主控,如果MCU来自有名大厂,厂商也会配套推出专用IDE(比如恩智浦半导体的MCUXpresso IDE,意法半导体的TrueSTUDIO、STM32CubeIDE)。
除此以外,还有几个来自专门软件公司的独立IDE,比如Keil MDK、IAR EWARM。
由于独立IDE不与详细MCU厂商捆绑,并且为了保持商业上的竞争力,每每在性能和易用性上表现得更好,以是市场霸占率居高不下。

痞子衡求学期间紧张利用Keil MDK,参加事情后一贯在用IAR EWARM,刚毕业的时候用的IAR版本是v6.50,七年过去了,如今IAR也发展到了v8.50,界面变得更俊秀了,功能也加倍强大,以是底下痞子衡会陆续先容IAR利用履历小细节。
痞子衡本日要讲的是在线调试时的复位类型设置对i.MXRT调试实行的影响。

一、IAR调试机制

在讲IAR调试中复位类型设置小细节前先给大家大略先容一下IAR的调试机制,下图是范例的嵌入式开拓调试硬件连接,首先你得有一块MCU主控板,板子上要引出调试口(JTAG/SWD),然后你得有一个硬件仿真器(比如J-Link/DAPLink),通过仿真器将你的PC和MCU板连接起来,PC上用IAR打开你的运用程序工程,然后你就可以愉快地调试解bug了。

你该当知道MCU里内置了Cortex-M调试模块,IAR借助硬件仿真器可以通过调试口与MCU调试模块互动,收发调试数据。
但是你知道IAR里是谁在卖力调试功能吗?是C-SPY,它是IAR内置的专用调试组件,你在调试时查看汇编代码,修正变量数据,设断点,单步,检讨call stack等功能全是它在后台默默完成的。
下图是C-SPY与所有潜在目标系统的联合事情简图,个中蓝色框标出来的办法适用我们常见的与J-Link/DAPLink联合利用的场景:

C-SPY支持的硬件仿真器类型非常全,这都是通过设计对应的C-SPY驱动来实现的,不同的仿真器下支持的调试特性不同,详细可以查看 \IAR Systems\Embedded Workbench x.xx.x\arm\doc\EWARM_DebuggingGuide.ENU 文档中的"Driver differences, I-jet, J-Link/J-Trace and ST-LINK"一表。

二、两种调试分类(在Flash/在RAM)

在i.MXRT上根据运用程序代码(read only段)链接位置所属的存储器性子,在线调试紧张分为两类:在外部Flash调试和在内部SRAM调试(在外部SDRAM/HyperRAM调试暂不在考虑范畴)。

由于外部Flash数据不能像内部SRAM上那样直接写入,须要调用额外的Flash下载算法才能写入,因此C-SPY处理在Flash调试和在SRAM调试的流程有一些差异。

首先来看C-SPY处理在内部SRAM调试的流程,C-SPY调试器启动后设置好得当的JTAG速率后便开始挂起目标板上的CPU(即MCU中Cortex-M内核),然后直接通过JTAG口和AHB总线往目标板上的MCU内部SRAM里写入运用程序镜像数据,写完再进行可选的数据校验和用户Reset/Setup后便可以操控CPU开始实行SRAM里的运用程序。

再来看C-SPY处理在外部Flash调试的流程,C-SPY调试器挂起CPU后先是往MCU内部SRAM里加载了一个Flashloader程序(即Flash下载算法),然后让CPU实行Flashloader来完成运用程序镜像数据的Flash烧写,烧写完成之后再次挂起CPU,进行可选的数据校验和用户Reset/Setup后便操控CPU开始实行Flash里的运用程序。

你须要特殊留神一下这两张流程图里可选的CPU reset动作,我们看到在SRAM调试流程中仅在写入运用程序镜像前有一次CPU reset,而在Flash调试流程中烧写运用程序镜像前后均有一次CPU reset动作,为什么在Flash调试须要多一次CPU reset?这是由于Flashloader程序会初始化MCU外设模块(比如Clock,GPIO,FlexSPI等),这些初始化过的MCU外设模块如果不复位到初始状态可能会对后面运用程序的实行产生一定影响。

三、复位类型全解析

好了,现在我们进入正题,开始先容复位类型,上一节讲的CPU reset实在只是一个笼统的说法,其详细复位行为在IAR里是可配的。
不同硬件仿真器下复位类型命名有差异,痞子衡紧张先容i.MXRT上两种最常用的仿真器:J-Link和DAPLink。

3.1 Cortex-M7复位功能

不管是哪种仿真器,其都借助了Cortex-M7内核功能,内核在SCB模块的AIRCR寄存器中集成了复位的支持。
打开CM7的Generic User Guide手册,可以找到如下AIRCR寄存器定义:

VECTRESET:这种复位的浸染范围覆盖全体CM7处理器中,除了调试逻辑之外的所有角落,但是它不会影响到CM7处理器外部的任何电路,以是MCU上的片上外设和其它电路都不受影响。

SYSRESETREQ:这种复位则会波及全体芯片上的电路:它会使CM7处理器把送往系统复位发生器的要求线置为有效。
但是系统复位发生器不是CM7的一部分,而是由芯片厂商实现,因此不同的芯片对此复位的相应也不同。

3.2 J-Link复位类型

Normal(复位编号0):默认的复位策略,对付i.MXRT来说等同于Core and peripherals办法

Core(复位编号1):借助Cortex-M内核模块SCB中的AIRCR寄存器的VECTRESET位功能来复位Core

Core and peripherals(复位编号8):借助Cortex-M内核模块SCB中的AIRCR寄存器的VECTRESET位和SYSRESETREQ位来同时复位Core和MCU外设模块

Reset Pin(复位编号2):通过拉低J-Link的RESET引脚(一样平常也会接到MCU reset脚)来复位MCU

剩下几种复位类型不适用i.MXRT,暂不先容。

3.3 DAPLink复位类型

Disabled (no reset):顾名思义,没有reset动作

Software:直接将CPU的PC指针重置到运用程序入口函数,相称于软复位

Hardware:通过翻转DAPLink的nSRST/nRESET引脚(一样平常也会接到MCU reset脚)来复位MCU

Core:借助Cortex-M内核模块SCB中的AIRCR寄存器的VECTRESET位功能来复位Core

System:借助Cortex-M内核模块SCB中的AIRCR寄存器的VECTRESET位和SYSRESETREQ位来同时复位Core和MCU外设模块

剩下几种复位类型在i.MXRT上意义不大,暂不先容。

四、复位类型对在线调试的影响

复位类型对在线调试的影响分两种:一、是否影响运用程序正常调试;二、是否影响运用程序正常运行。
对付第二点,由于运用程序的设计差异,无法确定复位类型的不同导致的未复位模块对其产生何种影响,因此我们暂不谈论这点,我们紧张看第一点。

设置不同的复位类型是否影响运用程序正常调试(能否停在程序入口函数,能否进行单步)?痞子衡在MIMXRT1060-EVK上实测了SDK里的led_blinky例程,选取了debug(在SRAM)和flexspi_nor_debug(在Flash)两个build做了很多组测试,结果如下……

查看原文:https://www.dianyuan.com/eestar/article-8251.html

STM32的SPI外设片选只有一个怎么破?

之前用STM32的SPI须要掌握很多外部芯片,可是一个SPI的外设只有一个片选,要实现独立片选一主多从,怎么实现呢?

SPI总线拓扑

一样平常地,SPI总线按照下图办法进行连接,一主多从。

如上图:

每个从设备都有独立的片选引脚,主机同一韶光段内,与一个从设备进行通信,也即选中一个从设备。
MOSI/MISO/SCLK并联在一起MISO须是三态门,当从设备未选中时,该脚须设置为高阻态,而不能是输出态,否则会影响总线!
对付MOSI/SCLK,虽然并联在一起,但是由于仅一个输出,多输入。

但是你看STM32的SPI外设,一个SPI仅有一个NSS旗子暗记,以STM32F407的SPI2为例:

那么要实现前面说的一主多从,怎么办呢?有朋友说,直接用GPIO去仿照不就可以了。

不错,SPI总线要用GPIO仿照还是很随意马虎的,但是这样做波特率做不高,须要占用CPU韶光,效率比较低!
而用SPI外设掌握器,底层bit流的收发由外设掌握器实现,用GPIO仿照则须要CPU参与。

怎么破呢?

菊花链拓扑

这种方案,省引脚。
但是要移位掌握,相对独立片选效率还是低不少。

独立片选拓扑

SPI外设的MOSI、MISO、SCK还是照用不误,但是片选我们不用,设置成通用输出模式,再用其他的GPIO片选从芯片即可。

上代码看看:

void HAL_SPI_MspInit(SPI_HandleTypeDef hspi){ GPIO_InitTypeDef GPIO_InitStruct = {0}; if(hspi->Instance==SPI1) { __HAL_RCC_SPI1_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); /SPI1 GPIO Configuration PA5 ------> SPI1_SCK PA6 ------> SPI1_MISO PA7 ------> SPI1_MOSI PA15 ------> SPI1_NSS 但是这里不用 / GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /__HAL_RCC_GPIOC_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_1; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);/ }}

初始化SPI外设

#define SPI_CS1 GPIO_PIN_1#define SPI_CS1_PORT GPIOC#define SPI_CS2 GPIO_PIN_2#define SPI_CS2_PORT GPIOC#define SPI_CS3 GPIO_PIN_3#define SPI_CS3_PORT GPIOCstatic void init_spi(SPI_HandleTypeDef spi_handle){ / SPI1 parameter configuration/ spi_handle->Instance = SPI1; spi_handle->Init.Mode = SPI_MODE_MASTER; spi_handle->Init.Direction = SPI_DIRECTION_2LINES; spi_handle->Init.DataSize = SPI_DATASIZE_8BIT; spi_handle->Init.CLKPolarity = SPI_POLARITY_LOW; spi_handle->Init.CLKPhase = SPI_PHASE_1EDGE; spi_handle->Init.NSS = SPI_NSS_HARD_OUTPUT; spi_handle->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4; spi_handle->Init.FirstBit = SPI_FIRSTBIT_MSB; spi_handle->Init.TIMode = SPI_TIMODE_DISABLE; spi_handle->Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; spi_handle->Init.CRCPolynomial = 10; ASSERT (HAL_SPI_Init(spi_handle) != HAL_OK); GPIO_InitTypeDef GPIO_InitStructure; __HAL_RCC_GPIOC_CLK_ENABLE(); GPIO_InitStructure.Pin = SPI_CS1; GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStructure.Pull = GPIO_NOPULL; GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_MEDIUM; HAL_GPIO_Init(SPI_CS1_PORT, &GPIO_InitStructure); GPIO_InitStructure.Pin = SPI_CS2; HAL_GPIO_Init(SPI_CS2_PORT, &GPIO_InitStructure); GPIO_InitStructure.Pin = SPI_CS3; HAL_GPIO_Init(SPI_CS3_PORT, &GPIO_InitStructure); }

从而原来SPI的收发函数前后加上片选旗子暗记即可:

typedef enum { SPI_CH_1=0, SPI_CH_2, SPI_CH_3, SPI_CH_LAST,} SPI_CH;static HAL_StatusTypeDef SPI_Select(SPI_CH ch){ switch (ch) { case SPI_CH_1: HAL_GPIO_WritePin(SPI_CS1_PORT,SPI_CS1,GPIO_PIN_RESET); break; case SPI_CH_2: HAL_GPIO_WritePin(SPI_CS2_PORT,SPI_CS2,GPIO_PIN_RESET); break; case SPI_CH_3: HAL_GPIO_WritePin(SPI_CS3_PORT,SPI_CS3,GPIO_PIN_RESET); break; default: return HAL_ERROR; } return HAL_OK;}static HAL_StatusTypeDef SPI_DeSelect(SPI_CH ch){ switch (ch) { case SPI_CH_1: HAL_GPIO_WritePin(SPI_CS1_PORT,SPI_CS1,GPIO_PIN_SET); break; case SPI_CH_2: HAL_GPIO_WritePin(SPI_CS2_PORT,SPI_CS2,GPIO_PIN_SET); break; case SPI_CH_3: HAL_GPIO_WritePin(SPI_CS3_PORT,SPI_CS3,GPIO_PIN_SET); break; default: return HAL_ERROR; } return HAL_OK;}HAL_StatusTypeDef SPI_TransmitReceive(SPI_CH ch, SPI_HandleTypeDef hspi, uint8_t pTxData, uint8_t pRxData, uint16_t Size, uint32_t Timeout){ HAL_StatusTypeDef ret; if(ch>=SPI_CH_LAST) return HAL_ERROR; SPI_Select(ch); ret = HAL_SPI_TransmitReceive(hspi,pTxData,pRxData,Size,Timeout); SPI_DeSelect(ch); return ret;}HAL_StatusTypeDef SPI_Transmit(SPI_CH ch, SPI_HandleTypeDef hspi, uint8_t pData, uint16_t Size, uint32_t Timeout){ HAL_StatusTypeDef ret; if(ch>=SPI_CH_LAST) return HAL_ERROR; SPI_Select(ch); ret = HAL_SPI_Transmit(hspi,pData,Size,Timeout); SPI_DeSelect(ch); return ret; }

如此一来,一个SPI外设就可以掌握多个从芯片了。
你如果有兴趣,不妨照这个思路试试看。

查看原文:https://www.dianyuan.com/eestar/article-8271.html

更多精彩内容,尽在电子星球 APP(https://www.eestar.com/)

六篇技能文章,让你秒懂电容的脾气秉性

七篇DIY技能文章献给你,让你脑洞全开

五篇文章帮你开启DSP的学习思路

汇总篇:关于PID知识,重点在此

本站所发布的文字与图片素材为非商业目的改编或整理,版权归原作者所有,如侵权或涉及违法,请联系我们删除,如需转载请保留原文地址:http://www.baanla.com/bgl/56758.html

XML地图 | 自定链接

Copyright 2005-20203 www.baidu.com 版权所有 | 琼ICP备2023011765号-4 | 统计代码

声明:本站所有内容均只可用于学习参考,信息与图片素材来源于互联网,如内容侵权与违规,请与本站联系,将在三个工作日内处理,联系邮箱:123456789@qq.com