嵌入式分享合集104

news2024/10/6 7:50:33

一、不用串口,如何打印STM32单片机log

本文主要介绍在嵌入式开发中用来输出log的方法。

    最常用的是通过串口输出uart log,这种方法实现简单,大部分嵌入式芯片都有串口功能。但是这样简单的功能有时候却不是那么好用,比如:

  • 一款新拿到的芯片,没有串口驱动时如何打印log

  • 某些应用下对时序要求比较高,串口输出log占用时间太长怎么办?比如USB枚举。

  •  某些bug正常运行时会出现,当打开串口log时又不再复现怎么办

  • 一些封装中没有串口,或者串口已经被用作其他用途,要如何输出log 

    下文来讨论这些问题。

1 输出log信息到SRAM

    准确来说这里并不是输出log,而是以一种方式不使用串口就可以看到log。在芯片开发阶段都可以连接仿真器调试,可以使用打断点的方法调试,但是有些操作如果不能被打断就没法使用断点调试了。

    这时候可以考虑将log打印到SRAM中,整个操作结束后再通过仿真器查看SRAM中的log buffer,这样就实现了间接的log输出。

    本文使用的测试平台是STM32F407 discovery,基于usb host实验代码,对于其他嵌入式平台原理也是通用的。首先定义一个结构体用于打印log,如下:

  定义一段SRAM空间作为log buffer:

static u8 log_buffer[LOG_MAX_LEN];

    log buffer是环形缓冲区,在小的buffer就可以无限打印log,缺点也很明显,如果log没有及时输出就会被新的覆盖。Buffer大小根据SRAM大小分配,这里使用1kB。为了方便输出参数,使用printf函数来格式化输出,需要做如下配置(Keil):

并包含头文件#include <stdio.h>, 在代码中实现函数fputc(): 

写入数据到SRAM: 

为了方便控制log打印格式,在头文件中再添加自定义的打印函数。 

在需要打印log的地方直接调用DEBUG()即可,最终效果如下,从Memory窗口可以看到打印的log: 

2 通过SWO输出log

    通过打印log到SRAM的方式可以看到log,但是数据量多的时候可能来不及查看就被覆盖了。为了解决这个问题,可以使用St-link的SWO输出log,这样就不用担心log被覆盖。查看原理图f407 discovery的SWO已经连接了,否则需要自己飞线连接:

在log结构体中添加SWO的操作函数集:

typedef struct{    u8 (*init)(void* arg);    u8 (*print)(u8 ch);    u8 (*print_dma)(u8* buffer, u32 len);}log_func;
typedef struct{volatile u8     type;    u8*             buffer;volatile u32    write_idx;volatile u32    read_idx;//SWO    log_func*       swo_log_func;}log_dev;

    SWO只需要print操作函数,实现如下:

u8 swo_print_ch(u8 ch){    ITM_SendChar(ch);return 0;}

    使用SWO输出log同样先输出到log buffer,然后在系统空闲时再输出,当然也可以直接输出。log延迟输出会影响log的实时性,而直接输出会影响到对时间敏感的代码运行,所以如何取舍取决于需要输出log的情形。

    在while循环中调用output_ch()函数,就可以实现在系统空闲时输出log。

/*output log buffer to I/O*/void output_ch(void){       u8 ch;    volatile u32 tmp_write,tmp_read;    tmp_write = log_dev_ptr->write_idx;    tmp_read = log_dev_ptr->read_idx;
if(tmp_write != tmp_read)    {        ch = log_dev_ptr->buffer[tmp_read++];//swoif(log_dev_ptr->swo_log_func)            log_dev_ptr->swo_log_func->print(ch);if(tmp_read >= LOG_MAX_LEN)        {            log_dev_ptr->read_idx = 0;        }else        {            log_dev_ptr->read_idx = tmp_read;        }    }}

2.1 通过IDE输出

    使用IDE中SWO输出功能需要做如下配置(Keil):

 

在窗口可以看到输出的log:

 

2.2 通过STM32 ST-LINK Utility输出

    使用STM32 ST-LINK Utility不需要做特别的设置,直接打开ST-LINK菜单下的Printf via SWO viewer,然后按start:

3 通过串口输出log

    以上都是在串口log暂时无法使用,或者只是临时用一下的方法,而适合长期使用的还是需要通过串口输出log,毕竟大部分时候没法连接仿真器。添加串口输出log只需要添加串口的操作函数集即可:

typedef struct{volatile u8     type;    u8*             buffer;volatile u32    write_idx;volatile u32    read_idx;volatile u32    dma_read_idx;//uart    log_func*       uart_log_func;//SWO    log_func*       swo_log_func;}log_dev;

    实现串口驱动函数:

 

 添加串口输出log与通过SWO过程类似,不再多叙述。而下面要讨论的问题是,串口的速率较低,输出数据需要较长时间,严重影响系统运行。

虽然可以通过先打印到SRAM再延时输出的办法来减轻影响,但是如果系统中断频繁,或者需要做耗时运算,则可能会丢失log。要解决这个问题,就是要解决CPU与输出数据到串口同时进行的问题,嵌入式工程师立马可以想到DMA正是好的解决途径。

    使用DMA搬运log数据到串口输出,同时又不影响CPU运行,这样就可以解决输出串口log耗时影响系统的问题。串口及DMA初始化函数如下:

u8 uart_log_init(void* arg){    DMA_InitTypeDef DMA_InitStructure;    u32* bound = (u32*)arg;//GPIO端口设置    GPIO_InitTypeDef GPIO_InitStructure;    USART_InitTypeDef USART_InitStructure;
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA时钟    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART2时钟//串口2对应引脚复用映射    GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_USART2);//USART2端口配置    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //速度50MHz    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉    GPIO_Init(GPIOA,&GPIO_InitStructure);//USART2初始化设置    USART_InitStructure.USART_BaudRate = *bound;//波特率设置    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式    USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位    USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制    USART_InitStructure.USART_Mode = USART_Mode_Tx; //收发模式    USART_Init(USART2, &USART_InitStructure); //初始化串口1#ifdef LOG_UART_DMA_EN      USART_DMACmd(USART2,USART_DMAReq_Tx,ENABLE);#endif    USART_Cmd(USART2, ENABLE);  //使能串口1     USART_ClearFlag(USART2, USART_FLAG_TC);while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);#ifdef LOG_UART_DMA_EN    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);//Config DMA channel, uart2 TX usb DMA1 Stream6 Channel    DMA_DeInit(DMA1_Stream6);    DMA_InitStructure.DMA_Channel = DMA_Channel_4;    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&USART2->DR);    DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;    DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;    DMA_InitStructure.DMA_Priority = DMA_Priority_High;    DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;     DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;    DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;    DMA_Init(DMA1_Stream6, &DMA_InitStructure);    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);#endifreturn 0;}

    DMA输出到串口的函数如下:

 

这里为了方便直接使用了查询DMA状态寄存器,有需要可以修改为DMA中断方式,查Datasheet可以找到串口2使用DMA1 channel4的stream6: 

 

最后在PC端串口助手可以看到log输出: 

使用DMA搬运log buffer中数据到串口,同时CPU可以处理其他事情,这种方式对系统影响最小,并且输出log及时,是实际使用中用的最多的方式。并且不仅可以用串口,其他可以用DMA操作的接口(如SPI、USB)都可以使用这种方法来打印log。

4 使用IO口模拟串口输出log

    最后要讨论的是在一些封装中没有串口,或者串口已经被用作其他用途时如何输出log,这时可以找一个空闲的普通IO,模拟UART协议输出log到上位机的串口工具。常用的UART协议如下:

 

 只要在确定的时间在IO上输出高低电平就可以模拟出波形,这个确定的时间就是串口波特率。为了得到精确延时,这里使用TIM4定时器产生1us的延时。注意:定时器不能重复用,在测试工程中TIM2、3都被用了,如果重复用就错乱了。初始化函数如下:

u8 simu_log_init(void* arg){    TIM_TimeBaseInitTypeDef TIM_InitStructure;      u32* bound = (u32*)arg;//GPIO端口设置    GPIO_InitTypeDef GPIO_InitStructure;    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA时钟    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //速度50MHz    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉    GPIO_Init(GPIOA,&GPIO_InitStructure);    GPIO_SetBits(GPIOA, GPIO_Pin_2);//Config TIM    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE); //使能TIM4时钟    TIM_DeInit(TIM4);    TIM_InitStructure.TIM_Prescaler = 1;        //2分频    TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;    TIM_InitStructure.TIM_Period = 41;          //1us timer    TIM_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;    TIM_TimeBaseInit(TIM4, &TIM_InitStructure);    TIM_ClearFlag(TIM4, TIM_FLAG_Update);    baud_delay = 1000000/(*bound);          //根据波特率计算每个bit延时return 0;}

    使用定时器的delay函数为:

 

    最后是模拟输出函数,注意:输出前必须要关闭中断,一个byte输出完再打开,否则会出现乱码:

u8 simu_print_ch(u8 ch){volatile u8 i=8;    __asm("cpsid i");//start bit    GPIO_ResetBits(GPIOA, GPIO_Pin_2);    simu_delay(baud_delay);while(i--)    {if(ch & 0x01)        GPIO_SetBits(GPIOA, GPIO_Pin_2);else        GPIO_ResetBits(GPIOA, GPIO_Pin_2);        ch >>= 1;        simu_delay(baud_delay);    }//stop bit    GPIO_SetBits(GPIOA, GPIO_Pin_2);    simu_delay(baud_delay);    simu_delay(baud_delay);    __asm("cpsie i");return 0;}

    使用IO模拟可以达到与真实串口类似的效果,并且只需要一个普通IO,在小封装芯片上比较使用。                        whaosoft aiot http://143ai.com

二、画PCB板时阻抗设计的重要性

什么是阻抗

    在电学中,常把对电路中电流所起的阻碍作用叫做阻抗。阻抗单位为欧姆,常用Z表示,是一个复数:

Z= R+i( ωL–1/(ωC))

    具体说来阻抗可分为两个部分,电阻(实部)和电抗(虚部)。

    其中电抗又包括容抗和感抗,由电容引起的电流阻碍称为容抗,由电感引起的电流阻碍称为感抗。

阻抗匹配的理想模型

    射频工程师大都遇到过匹配阻抗的问题,通俗的讲,阻抗匹配的目的是确保能实现信号或能量从“信号源”到“负载”的有效传送。

    其最最理想模型当然是希望Source端的输出阻抗为50欧姆,传输线的阻抗为50欧姆,Load端的输入阻抗也是50欧姆,一路50欧姆下去,这是最理想的。

 然而实际情况是:源端阻抗不会是50ohm,负载端阻抗也不会是50ohm,这个时候就需要若干个阻抗匹配电路。

    而匹配电路就是由电感和电容所构成,这个时候我们就需要使用电容和电感来进行阻抗匹配电路调试,以达到RF性能最优。

阻抗匹配的方法

    阻抗匹配的方法主要有两个,一是改变阻抗力,二是调整传输线。

    改变阻抗力就是通过电容、电感与负载的串并联调整负载阻抗值,以达到源和负载阻抗匹配。

调整传输线是加长源和负载间的距离,配合电容和电感把阻抗力调整为零。

    此时信号不会发生发射,能量都能被负载吸收。

    高速PCB布线中,一般把数字信号的走线阻抗设计为50欧姆。一般规定同轴电缆基带50欧姆,频带75欧姆,对绞线(差分)为85-100欧姆。

阻抗匹配应用举例——振铃现象

    曾经做一个项目,在电信号测量时,遇到过振铃这种问题,。

    由于任何传输线都不可避免地存在着引线电阻、引线电感和杂散电容,因此,一个标准的脉冲信号在经过较长的传输线后,极易产生上冲和振铃现象。大量的实验表明,引线电阻可使脉冲的平均振幅减小;而杂散电容和引线电感的存在,则是产生上冲和振铃的根本原因。在脉冲前沿上升时间相同的条件下,引线电感越大,上冲及振铃现象就越严重;杂散电容越大,则是波形的上升时间越长;而引线电阻的增加,将使脉冲振幅减小。

    如果信号传输过程中感受到阻抗的变化,就会发生信号的反射。这个信号可能是驱动端发出的信号,也可能是远端反射回来的反射信号。根据反射系数的公式,当信号感受到阻抗变小,就会发生负反射,反射的负电压会使信号产生下冲。信号在驱动端和远端负载之间多次反射,其结果就是信号振铃。大多数芯片的输出阻抗都很低,如果输出阻抗小于PCB走线的特性阻抗,那么在没有源端端接的情况下,必然产生信号振铃。

在实际电路中,采用下列几种方法来来减小和抑制上冲及振铃。

    (1)串联电阻。利用具有较大电阻的传输线或是人为地串入适当的阻尼电阻,可以减小脉冲的振幅,从而达到减小上冲和振铃程度的目的。但当传入电阻的数值过大时,不仅脉冲幅度减小过多,而且使脉冲的前沿产生延迟。因此,串入的阻尼电阻值应适当,并且应选用无感电阻,电阻的连接位置应靠近接收端。

    (2)减小引线电感。设法减小线路及传输线的引线电感是最基本的方法,总的原则是:

  • 尽量缩短引线长度

  • 加粗导线和印制铜箔的宽度

  • 减小信号的传输距离

  • 采用引线电感小的元器件,尤其是传输前沿很陡的脉冲信号时更应注意这些问题

    (3)由于负载电路的等效电感和等效电容同样可以影响发送端,使之脉冲波形产生上冲和振铃,因此,应尽量减小负载电路的等效电感和电容。尤其是负载电路的接地线过长时,形成的地线电感和杂散电容相当可观,其影响不容忽视。

    (4)逻辑数字电路中的信号线可增加上拉电阻和交流终端负载,如图6所示。上拉电阻(可取)的接入,可将信号的逻辑高电平上拉到5V。交流终端负载电路的接入不影响支流驱动能力,也不会增加信号线的负载,而高频振铃现象却可得到有效的抑制。

    上述振铃除了与电路条件有关外,还与脉冲前沿的上升时间密切相关。即使电路条件相同,当脉冲前沿上升时间很短时,上冲的峰值将大大增加。一般对于前沿上升时间在1以下的脉冲,均考虑产生上冲及振铃的可能。因此,在脉冲信号频率的选择问题上,应考虑在满足系统速度要求的前提下,能选用较低频率的信号绝不选用高频信号;如无必要,也不应过分要求脉冲的前沿非常陡峭。这对从根本上消除上冲和振铃视听有利的。

Smith圆图在RF匹配电路调试中的应用

    Smith圆图上可以反映出如下信息: 阻抗参数Z,导纳参数Y,品质因子Q,反射系数,驻波系数,噪声系数,增益,稳定因子,功率,效率,频率信息等抗等参数。

是不是一脸懵,我们还是来看阻抗圆图吧: 

 

阻抗圆图的构图原理是利用输入阻抗与电压反射系数之间的一一对应关系,将归一化输入阻抗表示在反射系数极坐标系中,其特点归纳如下:

  • 上半圆阻抗为感抗,下半圆阻抗为容抗

  • 实轴为纯电阻,单位圆为纯电抗

  • 实轴的右半轴皆为电压波腹点(除开路点),左半轴皆为电压波节点(除短路点)

  • 匹配点(1,0),开路点(∞,∞)和短路点(0,0)

  • 两个特殊圆:最大的为纯电抗圆,与虚轴相切的为匹配圆

  • 两个旋转方向:逆时针转为向负载移动,顺时针转为向波源移动

    导纳圆图与阻抗圆图互为中心对称,同一张圆图,即可以当作阻抗圆图来用,也可以当作导纳圆图来用,但是在进行每一次操作时,若作为阻抗圆图用则不能作为导纳圆图。

    Smith圆图中,能表示出一些很有意思的特征:

    在负载之前串联或并联一个可变电感/电容,电路图如下图左侧4个图所示,将得到Smith圆图上右侧的几条曲线。

    对应Smith阻抗圆及导纳圆,其运动轨迹如下:

  • 使用Smith阻抗圆时,串联电感顺时针转,串联电容逆时针转

  • 使用Smith导纳圆时,并联电感,逆时针转,并联电容顺时针转

 

 

三、总结10种复杂电路分析方法

电路问题计算的先决条件是正确识别电路,搞清楚各部分之间的连接关系。对较复杂的电路应先将原电路简化为等效电路,以便分析和计算。识别电路的方法很多,现结合具体实例介绍十种方法。

一、特征识别法

    串并联电路的特征是;串联电路中电流不分叉,各点电势逐次降低,并联电路中电流分叉,各支路两端分别是等电势,两端之间等电压。根据串并联电路的特征识别电路是简化电路的一种最基本的方法。

    例1.试画出图1所示的等效电路。

   解:设电流由A端流入,在a点分叉,b点汇合,由B端流出。支路a—R1—b和a—R2—R3(R4)—b各点电势逐次降低,两条支路的a、b两点之间电压相等,故知R3和R4并联后与R2串联,再与R1并联,等效电路如图2所示。

二、伸缩翻转法

    在实验室接电路时常常可以这样操作,无阻导线可以延长或缩短,也可以翻过来转过去,或将一支路翻到别处,翻转时支路的两端保持不动;导线也可以从其所在节点上沿其它导线滑动,但不能越过元件。这样就提供了简化电路的一种方法,我们把这种方法称为伸缩翻转法。

    例2.画出图3的等效电路。

 解:先将连接a、c节点的导线缩短,并把连接b、d节点的导线伸长翻转到R3—C—R4支路外边去,如图4。

    再把连接a、C节点的导线缩成一点,把连接b、d节点的导线也缩成一点,并把R5连到节点d的导线伸长线上(图5)。由此可看出R2、R3与R4并联,再与R1和R5串联,接到电源上。

三、电流走向法

    我们一直寻找的,却是自己原本早已拥有的;我们总是东张西望,唯独漏了自己想要的,这就是我们至今难以如愿以偿的原因。

    电流是分析电路的核心。从电源正极出发(无源电路可假设电流由一端流入另一端流出)顺着电流的走向,经各电阻绕外电路巡行一周至电源的负极,凡是电流无分叉地依次流过的电阻均为串联,凡是电流有分叉地分别流过的电阻均为并联。

    例3.试画出图6所示的等效电路。

    解:电流从电源正极流出过A点分为三路(AB导线可缩为一点),经外电路巡行一周,由D点流入电源负极。第一路经R1直达D点,第二路经R2到达C点,第三路经R3也到达C点,显然R2和R3接联在AC两点之间为并联。二、三络电流同汇于c点经R4到达D点,可知R2、R3并联后与R4串联,再与R1并联,如图7所示。

四、等电势法

    在较复杂的电路中往往能找到电势相等的点,把所有电势相等的点归结为一点,或画在一条线段上。当两等势点之间有非电源元件时,可将之去掉不考虑;当某条支路既无电源又无电流时,可取消这一支路。我们将这种简比电路的方法称为等电势法。

    例4.如图8所示,已知 R1 = R2 = R3 = R4 = 2Ω ,求A、B两点间的总电阻。

  解:设想把A、B两点分别接到电源的正负极上进行分析,A、D两点电势相等,B、C两点电势也相等,分别画成两条线段。电阻R1接在A、C两点,也即接在A、B两点;R2接在C、D两点,也即接在B、A两点;R3接在D、B两点,也即接在A、B两点,R4也接在A、B两点,可见四个电阻都接在A、B两点之间均为并联(图9)。所以,PAB=3Ω。  

五、支路节点法

    节点就是电路中几条支路的汇合点。所谓支路节点法就是将各节点编号(约定;电源正极为第1节点,从电源正极到负极,按先后次序经过的节点分别为1、2、3……),从第1节点开始的支路,向电源负极画。可能有多条支路(规定:不同支路不能重复通过同一电阻)能达到电源负极,画的原则是先画节点数少的支路,再画节点数多的支路。然后照此原则,画出第2节点开始的支路。余次类推,最后将剩余的电阻按其两端的位置补画出来。

    例5.画出图10所示的等效电路。

 

 解:图10中有1、2、3、4、5五个节点,按照支路节点法原则,从电源正极(第1节点)出来,节点数少的支路有两条:R1、R2、R5支路和R1、R5、R4支路。取其中一条R1、R2、R5支路,画出如图11。

    再由第2节点开始,有两条支路可达负极,一条是R5、R4,节点数是3,另一条是R5、R3、R5,节点数是4,且已有R6重复不可取。所以应再画出R5、R4支路,最后把剩余电阻R3画出,如图12所示。

六、几何变形法

    几何变形法就是根据电路中的导线可以任意伸长、缩短、旋转或平移等特点,将给定的电路进行几何变形,进一步确定电路元件的连接关系,画出等效电路图。

    例6.画出图13的等效电路。

    解:使ac支路的导线缩短,电路进行几何变形可得图14,再使ac缩为一点,bd也缩为一点,明显地看出R1、R2和R5三者为并联,再与R4串联(图15)。

七、撤去电阻法

    根据串并联电路特点知,在串联电路中,撤去任何一个电阻,其它电阻无电流通过,则这些电阻是串联连接;在并联电路中,撤去任何一个电阻,其它电阻仍有电流通过,则这些电阻是并联连接。

仍以图13为例,设电流由A端流入,B端流出,先撤去R2,由图16可知R1、R3有电流通过。再撤去电阻R1,由图17可知R2、R3仍有电流通过。同理撤去电阻R3时,R1、R2也有电流通过由并联电路的特点可知,R1、R2和R3并联,再与R4串联。

八、独立支路法

    让电流从电源正极流出,在不重复经过同一元件的原则下,看其中有几条路流回电源的负极,则有几条独立支路。未包含在独立支路内的剩余电阻按其两端的位置补上。应用这种方法时,选取独立支路要将导线包含进去。

    例7.画出图18的等效电路。

    方案一:选取A—R2—R3—C—B为一条独立支路,A—R1—R5—B为另一条独立支路,剩余电阻R4接在D、C之间,如图19所示。

  方案二:选取A—R1—D—R4—C—B为一条独立支路,再分别安排R2、R3和R5,的位置,构成等效电路图20。

    方案三:选取A—R2—R3—C—R4—D—R5—B为一条独立支路,再把R1接到AD之间,导线接在C、B之间,如图21所示,结果仍无法直观判断电阻的串并联关系,所以选取独立支路时一定要将无阻导线包含进去。

九、节点跨接法

    将已知电路中各节点编号,按电势由高到低的顺序依次用1、2、3……数码标出来(接于电源正极的节点电势最高,接于电源负极的节点电势最低,等电势的节点用同一数码,并合并为一点)。然后按电势的高低将各节点重新排布,再将各元件跨接到相对应的两节点之间,即可画出等效电路。

    例8.画出图22所示的等效电路。

 解:节点编号:如图22中所示。

    节点排列:将1、23节点依次间隔地排列在一条直线上,如图23。

    元件归位:对照图22,将R1、R2、R3、R4分别跨接在排列好的1、2得等效电路如图24。

十、电表摘补法

    若复杂的电路接有电表,在不计电流表A和电压表V的内阻影响时,由于电流表内阻为零,可摘去用一根无阻导线代替;由于电压表内阻极大,可摘去视为开路。用上述方法画出等效电 搞清连接关系后,再把电表补到电路对应的位置上。

   例9.如图25的电路中,电表内阻的影响忽略不计,试画出它的等效电路。

    解:先将电流去,用一根导线代摘替,再摘去电压表视为开路,得图26。然后根据图25把电流表和电压表补接到电路中的对应位置上,如图27所示。

 

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

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

相关文章

入门 Activiti 工作流,通俗易懂

概念 工作流。通过计算机对业务流程自动化执行管理&#xff0c;主要解决的是“使在多个参与者之间按照某种预定义的规则自动进行传递文档、信息或任务的过程&#xff0c;从而实现某个预期的业务目标&#xff0c;或者促使此目标的实现”。 Activiti7 介绍 Activiti是一个工作…

Spring启动流程

Spring启动流程 按Bean状态描述&#xff1a; 创建Bean工厂对Bean工厂后置处理通过Component和Import扫描BeanDefinition&#xff0c;加入到Bean工厂注册Bean后置处理器&#xff0c;用于拦截Bean创建实例化填充属性初始化 调用aware方法BeanPostProcessor实例化前执行调用初始…

【java进阶01:final关键字】final修饰的变量只能赋一次值

目录 final修饰的类无法继承。 final修饰的引用一旦指向某个对象&#xff0c;则不能再指向其他对象&#xff0c;但该引用指向的对象内部的数据是可以修改的。​编辑 final修饰的实例变量必须手动初始化&#xff0c;因为系统不会赋默认值&#xff0c;强制手动赋值&#xff0c…

【router-view】切换组件 深刻理解用法 vue的设计思想

之前学的时候没学明白&#xff0c;导致写项目有些功能的实现上走了歪路。 今天询问了学长&#xff0c;更加深刻的理解的Vue的设计思想。 因为vue是单页面应用&#xff0c;所以学会用router-view来切换频繁变化的地方的组件是非常重要的。 之前&#xff0c;我的一个主页组件由…

Xshell远程连接配置 Ubuntu 18.04.6 + Anaconda + CUDA + Cudnn + Pytorch(GPU+CPU)

Xshell远程连接进行Ubuntu的Pytorch配置写在最前面参考Xshell常用命令Ubantu检查系统的各项配置查看ubuntu系统的版本信息查看Linux的内核版本和系统是多少位的Ubuntu版本各种验证禁用nouveau安装显卡驱动卸载显卡驱动安装显卡驱动加入PPA&#xff0c;然后更新库方法一&#xf…

maven离线模式及设置

maven离线模式及设置 maven离线模式使用场景&#xff1f; 遇到的问题&#xff1a; 最近遇到个项目支持&#xff0c;他在打jar包的时候&#xff0c;总是去网上下载 maven依赖&#xff0c;不去找我本地仓库的&#xff0c;就比较头大&#xff0c;原因不明 现在需求&#xff1a;就…

SpringBoot 玩一玩代码混淆,防止反编译代码泄露

编译 简单就是把代码跑一哈&#xff0c;然后我们的代码 .java文件 就被编译成了 .class 文件 反编译 就是针对编译生成的 jar/war 包 里面的 .class 文件 逆向还原回来&#xff0c;可以看到你的代码写的啥。 比较常用的反编译工具 JD-GUI &#xff0c;直接把编译好的jar丢进…

java项目-第144期ssm农产品供销服务系统-java毕业设计_计算机毕业设计

java项目-第144期ssm农产品供销服务系统-java毕业设计_计算机毕业设计 【源码请到资源专栏下载】 今天分享的项目是《ssm农产品供销服务系统》 该项目分为2个角色&#xff0c;管理员和用户。 用户可以浏览前台,包含功能有&#xff1a; 首页、农产品、农产品资讯、我的、跳转到后…

JavaScript DOM中获取元素、事件基础、操作元素、节点操作

目录 JavaScript事件三要素 常见的事件​编辑 2、执行事件的步骤&#xff1a; 1. 获取元素 1.1 方式 1.1.1 根据ID获取 1.1.2 根据标签名获取 1.1.3 通过html5新增的方法获取 1.1.4 特殊元素获取 2. 事件基础 2.1 事件三要素 2.1.1 事件源 2.1.2 事件类型 2.1.3…

如何使用Spring Security控制会话

在 Spring 安全教程的这篇文章中&#xff0c;我们将讨论Spring 安全会话管理。我们将讨论 Spring 安全性的独特功能&#xff0c;这有助于我们高效和安全的会话管理。 春季安全会议 本文将讨论安全会话管理以及 spring 安全性如何帮助我们控制 HTTP 会话。Spring 安全性使用以…

1.4_29 Axure RP 9 for mac 高保真原型图 - 案例28【中继器-后台管理系统6】功能-原位修改数据

相关链接 目录Axure中文学习网AxureShopAxureShop-QA 案例目标1. 了解使用中继器&#xff0c;弹窗修改数据的实现方式 一、成品效果 Axure Cloud 案例28【中继器 - 后台管理系统6】功能-原位修改数据 版本更新一、修改功能   1.1 文本框&#xff1a;点击数据位置&#xff…

InternImage

终于有对抗Transformer 的了~~ 来自浦江实验室、清华等机构的研究人员提出了一种新的基于卷积的基础模型&#xff0c;称为 InternImage&#xff0c;与基于 Transformer 的网络不同&#xff0c;InternImage 以可变形卷积作为核心算子&#xff0c;使模型不仅具有检测和分割等下游…

MySQL删除表数据总结(DELETE、TRUNCATE、DROP)

&#xff08;1&#xff09;当我们不再需要该表时&#xff0c;使用DROP&#xff0c;会连表一起删掉&#xff0c;无法找回。速度很快。 DROP TABLE web_tbl_search;&#xff08;2&#xff09;保留表结构&#xff0c;只删除表数据&#xff0c;使用TRUNCATE&#xff0c;数据删除后…

【unCloud】在使用uni-admin时遇到的问题(原uniCloud-admin)

目录一、前言二、遇到的几个小问题问题一&#xff1a;可登录应用解决方法、步骤一、前言 这是我跟着官方的教学视频学习时遇到的一切小问题&#xff0c;由于我是初学&#xff0c;也没什么很多Vue一类的基础&#xff0c;所以学起来可能才会觉得这些是问题&#xff0c;但是也暂做…

得物视频编辑工具优化全指南

一、背景介绍 随着5G网络的推广和网络带宽的提升&#xff0c;视频成为互联网用户主要的消费载体&#xff0c;用户通过短视频来分享和浏览信息。由此视频的编辑功能越来越重要、越来越普遍。视频编辑的APP也如雨后春笋般涌现。 更好地推动得物App社区业务的发展&#xff0c;得…

测试日常工作中需要具备哪些知识和能力,在需求评审时需要考虑哪些方面,在技术方面评审时需要考虑哪些方面,从什么方面进行设计测试用例

前几天同事分享了一波作为测试需要具备哪些能力&#xff0c;测试用例需要从哪些方面进行设计&#xff0c;我把他分享的内容拷贝了一波&#xff0c;作为以后在测试过程中的参考。 首先需求评审、技术方案评审、测试用例评审三者的关系 一开始&#xff0c;我每次设计测试用例都是…

操作系统 | 实验八 文件管理

一、实验目的 掌握文件的存取方法&#xff1b;掌握文件的逻辑结构和物理结构&#xff1b;掌握存储空间的分配和回收&#xff1b;掌握磁盘管理与调度。 二、实验内容 用程序模拟磁盘的调度过程&#xff0c;并计算各磁盘调度算法包括先来先服务算法、最短寻道时间优先算法、扫…

【大根堆 Java】使用优先队列+HashMap 解决前 K 个高频元素问题

一、题目描述 给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例 二、思路 本题我们主要完成两个步骤&#xff1a; 统计出每个元素出现的次数找出出现次数最多的前 K 个元素 对第一个步骤&#xf…

IPWorks S/MIME Delphi Edition

IPWorks S/MIME是一套用于电子邮件加密和文档安全的综合组件。IPWorks S/MIME使用公钥密码标准&#xff08;PKCS&#xff09;实现加密和解密的S/MIME标准。 IPWorks S/MIME包括通用的S/MIME组件以及支持S/MIME的IPWorks POP3、IMAP、SMTP、FileMailer和HTMLMailer组件版本。还…

【MMDet】提交PR的学习笔记

官方文档 关于如何向MMDet提交PR&#xff0c;请参考mmcv的文档《拉取请求 — mmcv 1.6.1 文档》 1. Fork最新代码库 当第一次提PR时&#xff0c;需要复刻OpenMMLab代码库&#xff0c;点击 GitHub 页面右上角的Fork按钮即可 将复刻的代码库克隆到本地 git clone fork_mmdet…