

《姬家寨村单片机黑客程序》
#ifndef __A_B___S__LIB_____2___
#include "mything3.h"
#include "mything4.h
#include "lib/bicycle.h"
#include "lib/noodle.h"
#endif
#ifndef __A_B___S__LIB______4__
#include "mything1.h"
#include "mything2.h"
#include "lib/mything3.h"
#include "lib/spaghetti.h"
#endi
而黑客的代码:
#include "myhack.c"
二《从单片机指针说到黑客程序》:
2004年7月的一天,在电子BBS讨论区上溜达,看到一个有趣的帖子,整个帖子内容如下:
纯C51复位功能函数:一个大三学生,让人又爱又怕
现单列复位部分如下:
main()
{
unsigned char code rst[]={0xe4,0xc0,0xe0,0xc0,0xe0,0x32}; // 复位代码
(*((void (*)())(rst)))(); // 执行上一行代码,将rst数组当函数调用
}
本来我告诉他嵌入如下代码:
clr a
push acc
push acc
reti
结果他却玩了前面哪一段,而数组rst[]中的内容恰恰是上面的汇编机器码,他的做法是将rst数组的数据当作代码保存,然后采用绝对地址方式指向该数组,将该数组中的代码当作函数来运行。居然通过了!我觉得有问题,我说即使如此,那绝对地址调用也应该写成(*((void (*)())(&rst)))() 才对呀,结果他反驳说,那样的话,rst的地址就会当成参数传递给这个绝对地址函数,而实际LJMP调用的地址并非rst的地址,而是一个不确定的地址。于是我按照自己的说法尝试了一下,看看汇编结果,还真的是将rst的地址传递给了R1 R2,而绝对函数最终LJMP到了一个莫名其妙的地址上去了,死翘!看来C真是一匹不容易驾驭的野马,这个大三学生理解力在我之上,我30多岁的人了,干了这么多年还没他的境界呢,唉,人家才学了几天啊,翻了几天书就这么厉害了,服了!首先分析帖子的C语言代码第一句定义一个数组rst[],数组内数据就是完成复位功能的汇编机器码,具体对应关系
为:clr a == 0xe4、push acc == 0xc0,0xe0、reti ==0x32
第二句是一个函数指针的用法,函数指针用法稍微有点复杂,可参看本人著的书,:),以下为快速入门讲解。
定义一个返回值是空函数指针的定义形式如下:
void (*p) ( )
当把函数指针赋值后,就能通过函数指针调用函数,调用形式如下,
(*p) ( );
或等价的简化形式:
p ( );
假设rst就是函数指针,则如下调用形式就可以令单片机复位再起。
(*rst ) ( );
但可惜,rst不是函数指针,而是数组名,虽然两者都是地址,但不可直接调用数组名。
如同把char型变量a赋值给int型变量b,(int) 表示强制类型转换:
b = (int) a
函数指针的强制类型转换公式如下(C语言的哲学是定义形式和使用一致):
( (void (*)() ) rst
这样经过转换后的rst就可以当作函数指针使用了,简单的调用形式如下:
#define K ( (void (*)( ) ) rst
(*K) ( )
或:
( * ( void (*)( ) )rst ) ( );
这样的语句就完成复位再启功能了。类型转换符()的优先级跟指针运算符*的优先级相同,二者的结合方向是自右至左,所以上述语句就能完成复位功能了。保险起见有些程序员常常喜欢再加个括号:
#define K ( ( (void (*)( ) ) rst )
(*K) ( )
或
( *( ( void (*)( ) )rst ) ) ( );
由于没有输入参数,上述复位代码更严谨的写法是:
#define K ( ( (void (*)(void ) ) rst )
(*K) ( )
或
( *( ( void (*)(void ) )rst ) ) ( );
l 关于帖子作者的解释
千万不要犯“&rst”形式的错误,对于一维数组而言,数组名rst就代表地址。以下二者等
价,更常用的是等式左边的形式:
rst == &rst[0]
整个函数指针无所谓参数传递,只是把rst当作程序执行地址调用而已,那个学生的解释也有问题。还有一点必须提及,不是说能通过编译,甚至生成正确代码,就表示某语句一定是对的。对很复杂的语句,要考虑到编译器不严格甚至出错的可能性。哈佛结构和一个蠕虫病毒请注意,定义数组rst[]时用了关键字code,这是C51特有的关键字,意味着把数组定义到程序空间。标准C是没有关键字code的。哈佛结构和普林斯顿结构:哈佛结构——程序空间和存储空间分开的。C51算是不太严格的哈佛结构——虽地址线分开,但数据线没有分开。DSP是增强的哈佛结构。PC电脑上奔腾CPU是普林斯顿结构——数据空间和程序空间统一编址。如果数组rst[]数据的汇编机器码是删除文件的机器码,这算不算是病毒?曾经流行过一种蠕虫病毒,其发作机理采取的就是将恶意代码保存成文本文件,然后通过指针调用执行这个文本,很多杀毒程序也不会查询文本文件。程序也罢,数据也罢都是二进制形式,如果数据空间和程序空间是统一编码的, 数据当然可以当作程序运行。在这一点上,相对而言,哈佛结构的CPU安全性会好一点点。但嵌入式应用少有病毒,一般不用关心。
l 单片机复位的更好方法
帖子中汇编语言解释如下:
clr a //清除ACC=0
push acc //压0到堆栈——8位
push acc //再压0到堆栈——再8位
reti //返回到0地址,从而执行。
帖子作者的这种复位方法比较麻烦,更加简单的复位写法是(摘自《C缺陷与陷阱》):
( * ( void (*)( ) )0 ) ( );
本句的分析方法同上,但更加精炼,没有多余的汇编语句。
上述复位的方法可称为软件复位。软件复位跟真正上电复位有很大差别:上电复位时大部分寄存器都有确定的复位值;软件复位则只相当于从0地址开始执行而已,寄存器不会变为确定的复位值。如果用户要编程实现上电复位这种情况,在程序中不要踢看门狗即可。大部分单片机都有看门狗吧。
附录笔者精于DSP C24xx,但不太懂C51;读者应能从函数指针的定义和引用中看出来,C语言的设计哲学是使用形式和定义形式一致,虽然这一点饱受质疑。如果你觉得鸡蛋好吃时,不必认识那只母鸡;但如果你觉得本文不错,请来笔者网站坐坐吧www.1piao.com/wlg.asp。2004年7月看到这个有意思的帖子,也干了一件蠢事——买了飞利浦的一款拍照手机,屏幕有强烈闪烁感,飞利浦拒换,服务意识真是不敢恭维。可来信免费转载本文,请保持整篇文章的完整性,包括本句。
----------2---------------
汇编中的ORG 0X0000H 在C51中如何实现.
一般是在连接定位模块中来进行地址分配
1、选择"options fo target "
2、选择“BL51 Locate”
3、在code 栏填入 ?PR?MAIN?SS(0x800)
其中MAIN是你要定位的函数名,SS是函数所在的文件名,要是有多个函数需要定位,则在中间加逗号。功能强大的时钟中断
在单片机程序设计中,设置一个好的时钟中断,将能使一个CPU发挥两个CPU的功效,大大方便和简化程序的编制,提高系统的效率与可操作性。我们可以把一些例行的及需要定时执行的程序放在时钟中断中,还可以利用时钟中断协助主程序完成定时、延时等操作。
下面以6MHz时钟的AT89C51系统为例,说明时钟中断的应用。
定时器初值与中断周期 时钟中断无需过于频繁,一般取20mS(50Hz)即可。如需要百分之一秒的时基信号,可取10mS(100Hz)。这里取20mS,用定时器T0工作于16位定时器方式(方式1)。T0的工作方式为:每过一个机器周期自动加1,当计满0FFFFh,要溢出时,便会产生中断,并由硬件设置相应的标志位供软件查询。即中断时比启动时经过了N+1个机器周期。所以,我们只要在T0中预先存入一个比满值0FFFFh小N的数,然后启动定时器,便会在N个机器周期后产生中断。这个值便是所谓的“初值”。下面计算我们需要的初值:时钟为6MHz,12个时钟周期为一个机器周期,20mS中有10000个机器周期。(10000)10=(2710)16,0FFFFh-2710h+1=0D8F0h。由于响应中断、保护现场及重装初值还需要7~8个机器周期,把这个值再加上7,即T0应装入的初值是0D8F7h。每次中断进入后,先把A及PSW的值压入堆栈,然后即把0D8F7h装入T0。
设置一个单元,每次中断加1 我们可以取内部RAM中一个单元,取名为INCPI(Increase Per Interrupt),在中断中,装完T0初值后,用INC INCPI指令将其加一。从这个单元中,无论中断程序还是主程序,都可以从中获得20mS的1~256之间任意整数倍的信号。例如:有一段向数码管送显的程序,需要每0.5秒执行一次以便刷新显示器,便可以设一单元(称为等待单元)W_DISP,用/MOV A,INCPI/ADD A,#25/MOV W_DISP,A/语句让其比当前的INCPI值大25,然后在每次中断中检查是否于INCPI值相等。若相等,说明已过了25个中断周期,便执行送显程序,并且让W_DISP再加上25,等待下个0.5秒。我们可以设置多个等待单元,以便取出多个不同的时基信号。让中断程序在每次中断时依次查询各个等待单元是否与INCPI相等,若相等,则执行相应的处理,并重新设置该等待单元的值,否则跳过。例如:用0.5秒信号刷新或闪烁显示器,用1秒信号产生实时时钟,或输出一定频率的方波,以一定间隔查询输入设备等。
在中断中读键 通常,我们在主程序中读键盘,步骤为:扫描键盘,若有键按下,则延时几十毫秒去抖动,再次确认此键确实按下,然后处理该键对应的工作,完成后再次重上述步骤。但这有两点不足:1.处理相应工作时无法锁存按键的输入,即可能漏键。2.延时去抖时CPU无法做其它事情,效率不高。如果把读键放入时钟中断中,则可避免上述不足。方法为:如果两次相邻的中断中都读到同一个键按下,则这个键是有效的(达到了去抖目的),并将其锁存到先入先出(队列)的键盘缓冲区,等主程序来处理。这样,主程序处理按键的同时,仍可响应键盘的输入。缓冲区深度通常可设为8级,若锁存的键数多于8个,则忽略新的按键,并报警提示用户新的按键将无效。若键盘缓冲队列停滞的时间大大长于主程序处理按键所需要的最大时间,说明主程序已出错或跑飞,可以在中断用指令将系统复位,起到了看门狗的目的。
主程序中的延时 由于有常开的时钟中断,所以当主程序中有需要时间较短、精度较高的延时时,应暂时把时钟中断关闭。而程序中需要时间较长、精度不高的延时时,便可仿照下需的写法,避免多层嵌套的循环延时。
例:在P1.1输出1秒的高电平脉冲
MOV A,INCPI
INC A
CJNE A,INCPI$ ;等待一次中断处理完成
SETB P1.1 ;设P1.1为H,脉冲开始
ADD A,#50 ;50个20mS为1秒
CJNE A,INCPI,$ ;等中断将INCPI加一50次
CLR P1.1 ;设P1.1为L,脉冲结束
结束语:从上看出,要灵活地应用时钟中断,将任务合理分配给中断和主程序,并且二者要分工明确,接口简单。这其中的技巧还需要大家在实践中多多摸索与体会。另外要注意:应尽量缩短中断处理程序的执行时间,更不要长于20mS。
三《端口阻截黑客入侵及单片机的应用》:
Windows中如何手动关闭端口和阻止非法入侵,我们一般采用一些功能强大的反黑软件和防火墙来保证我们的系统安全,但是有些用户不具备上述条件。怎么办呢?下面就介绍一种简易的办法——通过限制端口来帮助大家防止非法入侵。非法入侵的方式简单说来,非法入侵的方式可粗略分为4种:1、扫描端口,通过已知的系统Bug攻入主机。2、种植木马,利用木马开辟的后门进入主机。3、采用数据溢出的手段,迫使主机提供后门进入主机。4、利用某些软件设计的漏洞,直接或间接控制主机。非法入侵的主要方式是前两种,尤其是利用一些流行的黑客工具,通过第一种方式攻击主机的情况最多、也最普遍;而对后两种方式来说,只有一些手段高超的黑客才利用,波及面并不广泛,而且只要这两种问题一出现,软件服务商很快就会提供补丁,及时修复系统。因此,如果能限制前两种非法入侵方式,就能有效防止利用黑客工具的非法入侵。而且前两种非法入侵方式有一个共同点,就是通过端口进入主机。端口就像一所房子(服务器)的几个门一样,不同的门通向不同的房间(服务器提供的不同服务)。我们常用的FTP默认端口为21,而WWW网页一般默认端口是80。但是有些马虎的网络管理员常常打开一些容易被侵入的端口服务,比如139等;还有一些木马程序,比如冰河、BO、广外等都是自动开辟一个您不察觉的端口。那么,只要我们把自己用不到的端口全部封锁起来,不就杜绝了这两种非法入侵吗?限制端口的方法对于个人用户来说,您可以限制所有的端口,因为您根本不必让您的机器对外提供任何服务;而对于对外提供网络服务的服务器,我们需把必须利用的端口(比如WWW端口80、FTP端口21、邮件服务端口25、110等)开放,其他的端口则全部关闭。
这里,对于采用Windows2000/XP/2003的用户来说,不需要安装任何其他软件,可以利用"修改组策略"或"TCP/IP筛选功能"限制服务器的端口。具体设置如下:第一种方法——“修改组策略”:第一步,在“运行”输入gpedit.msc,回车打开“组策略”,在组策略中的windows设置-安全设置中选中“IP 安全策略,在本地计算机”,在右边窗格的空白位置右击鼠标,弹出快捷菜单,选择“创建 IP 安全策略”,于是弹出一个向导。在向导中点击“下一步”按钮,为新的安全策略命名;再按“下一步”,则显示“安全通信请求”画面,在画面上把“激活默认相应规则”左边的钩去掉,点击“完成”按钮就创建了一个新的IP 安全策略。 第二步,右击该IP安全策略,在“属性”对话框中,把“使用添加向导”左边的钩去掉,然后单击“添加”按钮添加新的规则,随后弹出“新规则属性”对话框,在画面上点击“添加”按钮,弹出IP筛选器列表窗口;在列表中,首先把“使用添加向导”左边的钩去掉,然后再点击右边的“添加”按钮添加新的筛选器。 第三步,进入“筛选器属性”对话框,首先看到的是寻址,源地址选“任何 IP 地址”,目标地址选“我的 IP 地址”;点击“协议”选项卡,在“选择协议类型”的下拉列表中选择“TCP”,然后在“到此端口”下的文本框中输入“135”,点击“确定”按钮,这样就添加了一个屏蔽 TCP 135(RPC)端口的筛选器,它可以防止外界通过135端口连上你的电脑。 点击“确定”后回到筛选器列表的对话框,可以看到已经添加了一条策略,重复以上步骤继续添加 TCP 137、139、445、593 端口和 UDP 135、139、445 端口,为它们建立相应的筛选器。 重复以上步骤添加TCP 1025、2745、3127、6129、3389 端口的屏蔽策略,建立好上述端口的筛选器,最后点击“确定”按钮。 第四步,在“新规则属性”对话框中,选择“新 IP 筛选器列表”,然后点击其左边的圆圈上加一个点,表示已经激活,最后点击“筛选器操作”选项卡。在“筛选器操作”选项卡中,把“使用添加向导”左边的钩去掉,点击“添加”按钮,添加“阻止”操作:在“新筛选器操作属性”的“安全措施”选项卡中,选择“阻止”,然后点击“确定”按钮。
第五步,进入“新规则属性”对话框,点击“新筛选器操作”,其左边的圆圈会加了一个点,表示已经激活,点击“关闭”按钮,关闭对话框;最后回到“新IP安全策略属性”对话框,在“新的IP筛选器列表”左边打钩,按“确定”按钮关闭对话框。在“本地安全策略”窗口,用鼠标右击新添加的 IP 安全策略,然后选择“指派”。
于是重新启动后,电脑中上述网络端口就被关闭了,病毒和黑客再也不能连上这些端口,从而保护了你的电脑。
Ping命令的常用参数选项
ping IP -t--连续对IP地址执行Ping命令,直到被用户以Ctrl+C中断。
ping IP -l 2000--指定Ping命令中的数据长度为2000字节,而不是缺省的32字节。
ping IP -n--执行特定次数的Ping命令
4.Ping DNS IP
这一命令用于检查内部网的DNS是否工作正常,如果您可以正常联网,但是输入域名却无法解析时请尝试该命令“ping 202.204.112.66”
域名映射为IP地址的过程就称为“域名解析”
国内外有不少提供免费DNS服务的提供商,其中国内著名的有DNSPod
PWM控制的基本原理
2010-03-24 20:19
PWM控制的基本原理
2010-03-24 20:19
PWM(Pulse Width Modulation)控制——脉冲宽度调制技术,通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形(含形状和幅值)。 PWM控制技术在逆变电路中应用最广,应用的逆变电路绝大部分是PWM型,PWM控制技术正是有赖于在逆 变电路中的应用,才确定了它在电力电子技术中的重要地位。 理论基础: 冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同。冲量指窄脉冲的面积。效果基本相同,是指环节的输出响应波形基本相同。低频段非常接近,仅在高频段略有差异。
面积等效原理:
分别将如图1所示的电压窄脉冲加在一阶惯性环节(R-L电路)上,如图2a所示。其输出电流i(t)对不同窄脉冲时的响应波形如图2b所示。从波形可以看出,在i(t)的上升段,i(t)的形状也略有不同,但其下降段则几乎完全相同。脉冲越窄,各i(t)响应波形的差异也越小。如果周期性地施加上述脉冲,则响应i(t)也是周期性的。用傅里叶级数分解后将可看出,各i(t)在低频段的特性将非常接近,仅在高频段有所不同。用一系列等幅不等宽的脉冲来代替一个正弦半波,正弦半波N等分,看成N个相连的脉冲序列,宽度相等,但幅值不等;用矩形脉冲代替,等幅,不等宽,中点重合,面积(冲量)相等,宽度按正弦规律变化。 SPWM波形——脉冲宽度按正弦规律变化而和正弦波等效的PWM波形。要改变等效输出正弦波幅值,按同一比例改变各脉冲宽度即可。 PWM电流波: 电流型逆变电路进行PWM控制,得到的就是PWM电流波。 PWM波形可等效的各种波形: 直流斩波电路:等效直流波形 SPWM波:等效正弦波形,还可以等效成其他所需波形,如等效所需非正弦交流波形等,其基本原理和SPWM控制相同,也基于等效面积原理。随着电子技术的发展,出现了多种PWM技术,其中包括:相电压控制PWM、脉宽PWM法、随机PWM、SPWM法、线电压控制PWM等,而本文介绍的是在镍氢电池智能充电器中采用的脉宽PWM法。它是把每一脉冲宽度均相等的脉冲列作为PWM波形,通过改变脉冲列的周期可以调频,改变脉冲的宽度或占空比可以调压,采用适当控制方法即可使电压与频率协调变化。可以通过调整PWM的周期、PWM的占空比而达到控制充电电流的目的。 PWM技术的具体应用, PWM软件法控制充电电流, 本方法的基本思想就是利用单片机具有的PWM端口,在不改变PWM方波周期的前提下,通过软件的方法调整单片机的PWM控制寄存器来调整PWM的占空比,从而控制充电电流。本方法所要求的单片机必须具有ADC端口和PWM端口这两个必须条件,另外ADC的位数尽量高,单片机的工作速度尽量快。在调整充电电流前,单片机先快速读取充电电流的大小,然后把设定的充电电流与实际读取到的充电电流进行比较,若实际电流偏小则向增加充电电流的方向调整PWM 的占空比;若实际电流偏大则向减小充电电流的方向调整PWM的占空比。在软件PWM的调整过程中要注意ADC的读数偏差和电源工作电压等引入的纹波干扰,合理采用算术平均法等数字滤波技术。软件PWM法具有以下优缺点。
优点:
简化了PWM的硬件电路,降低了硬件的成本。利用软件PWM不用外部的硬件PWM和电压比较器,只需要功率MOSFET、续流磁芯、储能电容等元器件,大大简化了外围电路。 可控制涓流大小。在PWM控制充电的过程中,单片机可实时检测ADC端口上充电电流的大小,并根据充电电流大小与设定的涓流进行比较,以决定PWM占空比的调整方向。 电池唤醒充电。单片机利用ADC端口与PWM的寄存器可以任意设定充电电流的大小,所以,对于电池电压比较低的电池,在上电后,可以采取小电流充一段时间的方式进行充电唤醒,并且在小电流的情况下可以近似认为恒流,对电池的冲击破坏也较小。
缺点:
电流控制精度低。充电电流的大小的感知是通过电流采样电阻来实现的,采样电阻上的压降传到单片机的ADC输入端口,单片机读取本端口的电压就可以知道充电电流的大小。若设定采样电阻为Rsample(单位为Ω),采样电阻的压降为Vsample(单位为mV), 10位ADC的参考电压为5.0V。则ADC的1 LSB对应的电压值为 5000mV/1024≈5mV。一个5mV的数值转换成电流值就是50mA,所以软件PWM电流控制精度最大为50mA。若想增加软件PWM的电流控制精度,可以法降低ADC的参考电压或采用10位以上ADC的单片机。 PWM采用软启动的方式。在进行大电流快速充电的过程中,充电从停止到重新启动的过程中,由于磁芯上的反电动势的存在,所以在重新充电时必须降低PWM的有效占空比,以克服由于软件调整PWM的速度比较慢而带来的无法控制充电电流的问题。 充电效率不是很高。在快速充电时,因为采用了充电软启动,再加上单片机的PWM调整速度比较慢,所以实际上停止充电或小电流慢速上升充电的时间是比较大的。 为了克服2和3缺点带来的充电效率低的问题,我们可以采用充电时间比较长,而停止充电时间比较短的充电方式,例如充2s停50ms,再加上软启动时的电流慢速启动折合成的停止充电时间,设定为50ms,则实际充电效率为(2000ms-100ms)/2000ms=95%,这样也可以保证充电效率在90%以上。 纯硬件PWM法控制充电电流 由于单片机的工作频率一般都在4MHz左右,由单片机产生的PWM的工作频率是很低的,再加上单片机用ADC方式读取充电电流需要的时间,因此用软件PWM的方式调整充电电流的频率是比较低的,为了克服以上的缺陷,可以采用外部高速PWM的方法来控制充电电流。现在智能充电器中采用的PWM控制芯片主要有TL494等,本PWM控制芯片的工作频率可以达到300kHz以上,外加阻容元件就可以实现对电池充电过程中的恒流限压作用,单片机只须用一个普通的I/O端口控制TL494使能即可。另外也可以采用电压比较器替代TL494,如LM393和LM358等。采用纯硬件PWM具有以下优缺点。
优点:
电流精度高。充电电流的控制精度只与电流采样电阻的精度有关,与单片机没有关系。不受软件PWM的调整速度和ADC的精度限制。 充电效率高。不存在软件PWM的慢启动问题,所以在相同的恒流充电和相同的充电时间内,充到电池中的能量高。 对电池损害小。由于充电时的电流比较稳定,波动幅度很小,所以对电池的冲击很小,另外TL494还具有限压作用,可以很好地保护电池。
缺点:
硬件的价格比较贵。TL494的使用在带来以上优点的同时,增加了产品的成本,可以采用LM358或LM393的方式进行克服。 涓流控制简单,并且是脉动的。电池充电结束后,一般采用涓流充电的方式对电池维护充电,以克服电池的自放电效应带来的容量损耗。单片机的普通I/O控制端口无法实现PWM端口的功能,即使可以用软件模拟的方法实现简单的PWM功能,但由于单片机工作的实时性要求,其软件模拟的PWM频率也比较低,所以最终采用的还是脉冲充电的方式,例如在10%的时间是充电的,在另外90%时间内不进行充电。这样对充满电的电池的冲击较小。 单片机 PWM控制端口与硬件PWM融合 对于单纯硬件PWM的涓流充电的脉动问题,可以采用具有PWM端口的单片机,再结合外部PWM芯片即可解决涓流的脉动性。 在充电过程中可以这样控制充电电流:采用恒流大电流快速充电时,可以把单片机的PWM输出全部为高电平(PWM控制芯片高电平使能)或低电平(PWM控制芯片低电平使能);当进行涓流充电时,可以把单片机的PWM控制端口输出PWM信号,然后通过测试电流采样电阻上的压降来调整PWM的占空比,直到符合要求为止。PWM一般选用电压控制型逆变器,是通过改变功率晶体管交替导通的时间来改变逆变器输出波形的频率,改变每半周期内晶体管的通断时间比,也就是说通过改变脉冲宽度来改变逆变器输出电压副值的大小. 其整流部分与逆变部分基本是对称的. 唉,几句话说不清楚啦! 总之,最后的输出波形可调,副值可调,甚至功率因数也可调,不过,好象都是用正弦波做为基波的啦.