一、不用串口,如何打印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++];
//swo
if(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);
#endif
return 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所示。