PWM输出的仿真例子

上传人:仙*** 文档编号:31652628 上传时间:2021-10-12 格式:DOC 页数:22 大小:302.50KB
收藏 版权申诉 举报 下载
PWM输出的仿真例子_第1页
第1页 / 共22页
PWM输出的仿真例子_第2页
第2页 / 共22页
PWM输出的仿真例子_第3页
第3页 / 共22页
资源描述:

《PWM输出的仿真例子》由会员分享,可在线阅读,更多相关《PWM输出的仿真例子(22页珍藏版)》请在装配图网上搜索。

1、万事开头难啊!本来说写一个简单的例子想着想着就复杂了,算了为了初学者学习,还是先从简单的说起吧!先来给大家说一下什么是脉冲宽度调制(PWM)。脉冲宽度调制(PWM)是英文“Pulse Width Modulation”的缩写,简称脉宽调制。它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用于测量,通信,功率控制与变换等许多领域。一种模拟控制方式,根据相应载荷的变化来调制晶体管栅极或基极的偏置,来实现开关稳压电源输出晶 体管或晶体管导通时间的改变,这种方式能使电源的输出电压在工作条件变化时保持恒定。脉冲宽度调制(PWM)是一种对模拟信号电平进行数字编码的方法。通过高分辨

2、率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。多数负载(无论是电感性负载还是电容性负载)需要的调制频率高于10Hz,通常调制频率为1kHz到200kHz之间。许多微控制器内部都包含有PWM控制器。例如,Microchip公司的PIC16C67内含两个PWM控制器,每一个

3、都可以选择接通时间和周期。占空比是接通时间与周期之比;调制频率为周期的倒数。执行PWM操作之前,这种微处理器要求在软件中完成以下工作: * 设置提供调制方波的片上定时器/计数器的周期 * 在PWM控制寄存器中设置接通时间 * 设置PWM输出的方向,这个输出是一个通用I/O管脚 * 启动定时器* 使能PWM控制器 PWM的一个优点是从处理器到被控系统信号都是数字形式的,无需进行数模转换。让信号保持为数字形式可将噪声影响降到最小。噪声只有在强到足以将逻辑1改变为逻辑0或将逻辑0改变为逻辑1时,也才能对数字信号产生影响。 对噪声抵抗能力的增强是PWM相对于模拟控制的另外一个优点,而且这也是在某些时候

4、将PWM用于通信的主要原因。从模拟信号转向PWM可以极大地延长通信距离。在接收端,通过适当的RC或LC网络可以滤除调制高频方波并将信号还原为模拟形式。 总之,PWM既经济、节约空间、抗噪性能强,是一种值得广大工程师在许多设计应用中使用的有效技术。 几种PWM控制方法采样控制理论中有一个重要结论:冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同.PWM控制技术就是以该结论为理论基础,对半导体开关器件的导通和关断进行控制,使输出端得到一系列幅值相等而宽度不相等的脉冲,用这些脉冲来代替正弦波或其他所需要的波形.按一定的规则对各脉冲的宽度进行调制,既可改变逆变电路输出电压的大小,也可改

5、变输出频率.PWM控制的基本原理很早就已经提出,但是受电力电子器件发展水平的制约,在上世纪80年代以前一直未能实现.直到进入上世纪80年代,随着全控型电力电子器件的出现和迅速发展,PWM控制技术才真正得到应用.随着电力电子技术,微电子技术和自动控制技术的发展以及各种新的理论方法,如现代控制理论,非线性系统控制思想的应用,PWM控制技术获得了空前的发展.到目前为止,已出现了多种PWM控制技术,根据PWM控制技术的特点,到目前为止主要有以下8类方法. 1 .相电压控制PWM 1.1 等脉宽PWM法1 VVVF(Variable Voltage Variable Frequency)装置在早期是采用

6、PAM(Pulse Amplitude Modulation)控制技术来实现的,其逆变器部分只能输出频率可调的方波电压而不能调压.等脉宽PWM法正是为了克服PAM法的这个缺点发展而来的,是PWM法中最为简单的一种.它是把每一脉冲的宽度均相等的脉冲列作为PWM波,通过改变脉冲列的周期可以调频,改变脉冲的宽度或占空比可以调压,采用适当控制方法即可使电压与频率协调变化.相对于PAM法,该方法的优点是简化了电路结构,提高了输入端的功率因数,但同时也存在输出电压中除基波外,还包含较大的谐波分量. 1.2 随机PWM 在上世纪70年代开始至上世纪80年代初,由于当时大功率晶体管主要为双极性达林顿三极管,载

7、波频率一般不超过5kHz,电机绕组的电磁噪音及谐波造成的振动引起了人们的关注.为求得改善,随机PWM方法应运而生.其原理是随机改变开关频率使电机电磁噪音近似为限带白噪声(在线性频率坐标系中,各频率能量分布是均匀的),尽管噪音的总分贝数未变,但以固定开关频率为特征的有色噪音强度大大削弱.正因为如此,即使在IGBT已被广泛应用的今天,对于载波频率必须限制在较低频率的场合,随机PWM仍然有其特殊的价值;另一方面则说明了消除机械和电磁噪音的最佳方法不是盲目地提高工作频率,随机PWM技术正是提供了一个分析,解决这种问题的全新思路. 1.3 SPWM法 SPWM(Sinusoidal PWM)法是一种比较

8、成熟的,目前使用较广泛的PWM法.前面提到的采样控制理论中的一个重要结论:冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同.SPWM法就是以该结论为理论基础,用脉冲宽度按正弦规律变化而和正弦波等效的PWM波形即SPWM波形控制逆变电路中开关器件的通断,使其输出的脉冲电压的面积与所希望输出的正弦波在相应区间内的面积相等,通过改变调制波的频率和幅值则可调节逆变电路输出电压的频率和幅值.该方法的实现有以下几种方案. 1.3.1 等面积法 该方案实际上就是SPWM法原理的直接阐释,用同样数量的等幅而不等宽的矩形脉冲序列代替正弦波,然后计算各脉冲的宽度和间隔,并把这些数据存于微机中,通过

9、查表的方式生成PWM信号控制开关器件的通断,以达到预期的目的.由于此方法是以SPWM控制的基本原理为出发点,可以准确地计算出各开关器件的通断时刻,其所得的的波形很接近正弦波,但其存在计算繁琐,数据占用内存大,不能实时控制的缺点. 1.3.2 硬件调制法 硬件调制法是为解决等面积法计算繁琐的缺点而提出的,其原理就是把所希望的波形作为调制信号,把接受调制的信号作为载波,通过对载波的调制得到所期望的PWM波形.通常采用等腰三角波作为载波,当调制信号波为正弦波时,所得到的就是SPWM波形.其实现方法简单,可以用模拟电路构成三角波载波和正弦调制波发生电路,用比较器来确定它们的交点,在交点时刻对开关器件的

10、通断进行控制,就可以生成SPWM波.但是,这种模拟电路结构复杂,难以实现精确的控制. 1.3.3 软件生成法 由于微机技术的发展使得用软件生成SPWM波形变得比较容易,因此,软件生成法也就应运而生.软件生成法其实就是用软件来实现调制的方法,其有两种基本算法,即自然采样法和规则采样法.1.3.3.1 自然采样法2 以正弦波为调制波,等腰三角波为载波进行比较,在两个波形的自然交点时刻控制开关器件的通断,这就是自然采样法.其优点是所得SPWM波形最接近正弦波,但由于三角波与正弦波交点有任意性,脉冲中心在一个周期内不等距,从而脉宽表达式是一个超越方程,计算繁琐,难以实时控制. 1.3.3.2 规则采样

11、法3 规则采样法是一种应用较广的工程实用方法,一般采用三角波作为载波.其原理就是用三角波对正弦波进行采样得到阶梯波,再以阶梯波与三角波的交点时刻控制开关器件的通断,从而实现SPWM法.当三角波只在其顶点(或底点)位置对正弦波进行采样时,由阶梯波与三角波的交点所确定的脉宽,在一个载波周期(即采样周期)内的位置是对称的,这种方法称为对称规则采样.当三角波既在其顶点又在底点时刻对正弦波进行采样时,由阶梯波与三角波的交点所确定的脉宽,在一个载波周期(此时为采样周期的两倍)内的位置一般并不对称,这种方法称为非对称规则采样. 规则采样法是对自然采样法的改进,其主要优点就是是计算简单,便于在线实时运算,其中

12、非对称规则采样法因阶数多而更接近正弦.其缺点是直流电压利用率较低,线性控制范围较小. 以上两种方法均只适用于同步调制方式中. 1.3.4 低次谐波消去法2 低次谐波消去法是以消去PWM波形中某些主要的低次谐波为目的的方法.其原理是对输出电压波形按傅氏级数展开,表示为u(t)=ansinnt,首先确定基波分量a1的值,再令两个不同的an=0,就可以建立三个方程,联立求解得a1,a2及a3,这样就可以消去两个频率的谐波. 该方法虽然可以很好地消除所指定的低次谐波,但是,剩余未消去的较低次谐波的幅值可能会相当大,而且同样存在计算复杂的缺点.该方法同样只适用于同步调制方式中. 1.4 梯形波与三角波比

13、较法2 前面所介绍的各种方法主要是以输出波形尽量接近正弦波为目的,从而忽视了直流电压的利用率,如SPWM法,其直流电压利用率仅为86.6%.因此,为了提高直流电压利用率,提出了一种新的方法-梯形波与三角波比较法.该方法是采用梯形波作为调制信号,三角波为载波,且使两波幅值相等,以两波的交点时刻控制开关器件的通断实现PWM控制. 由于当梯形波幅值和三角波幅值相等时,其所含的基波分量幅值已超过了三角波幅值,从而可以有效地提高直流电压利用率.但由于梯形波本身含有低次谐波,所以输出波形中含有5次,7次等低次谐波. 2 .线电压控制PWM 前面所介绍的各种PWM控制方法用于三相逆变电路时,都是对三相输出相

14、电压分别进行控制的,使其输出接近正弦波,但是,对于像三相异步电动机这样的三相无中线对称负载,逆变器输出不必追求相电压接近正弦,而可着眼于使线电压趋于正弦.因此,提出了线电压控制PWM,主要有以下两种方法. 2.1 马鞍形波与三角波比较法 马鞍形波与三角波比较法也就是谐波注入PWM方式(HIPWM),其原理是在正弦波中加入一定比例的三次谐波,调制信号便呈现出马鞍形,而且幅值明显降低,于是在调制信号的幅值不超过载波幅值的情况下,可以使基波幅值超过三角波幅值,提高了直流电压利用率.在三相无中线系统中,由于三次谐波电流无通路,所以三个线电压和线电流中均不含三次谐波4. 除了可以注入三次谐波以外,还可以

15、注入其他3倍频于正弦波信号的其他波形,这些信号都不会影响线 电压.这是因为,经过PWM调制后逆变电路输出的相电压也必然包含相应的3倍频于正弦波信号的谐波,但在合成线电压时,各相电压中的这些谐波将互相抵消,从而使线电压仍为正弦波. 2.2 单元脉宽调制法5 因为,三相对称线电压有Uuv+Uvw+Uwu=0的关系,所以,某一线电压任何时刻都等于另外两个线电压负值之和.现在把一个周期等分为6个区间,每区间60,对于某一线电压例如Uuv,半个周期两边60区间用Uuv本身表示,中间60区间用-(Uvw+Uwu)表示,当将Uvw和Uwu作同样处理时,就可以得到三相线电压波形只有半周内两边60区间的两种波形

16、形状,并且有正有负.把这样的电压波形作为脉宽调制的参考信号,载波仍用三角波,并把各区间的曲线用直线近似(实践表明,这样做引起的误差不大,完全可行),就可以得到线电压的脉冲波形,该波形是完全对称,且规律性很强,负半周是正半周相应脉冲列的反相,因此,只要半个周期两边60区间的脉冲列一经确定,线电压的调制脉冲波形就唯一地确定了.这个脉冲并不是开关器件的驱动脉冲信号,但由于已知三相线电压的脉冲工作模式,就可以确定开关器件的驱动脉冲信号了. 该方法不仅能抑制较多的低次谐波,还可减小开关损耗和加宽线性控制区,同时还能带来用微机控制的方便,但该方法只适用于异步电动机,应用范围较小. 3 .电流控制PWM 电

17、流控制PWM的基本思想是把希望输出的电流波形作为指令信号,把实际的电流波形作为反馈信号,通过两者瞬时值的比较来决定各开关器件的通断,使实际输出随指令信号的改变而改变.其实现方案主要有以下3种. 3.1 滞环比较法4 这是一种带反馈的PWM控制方式,即每相电流反馈回来与电流给定值经滞环比较器,得出相应桥臂开关器件的开关状态,使得实际电流跟踪给定电流的变化.该方法的优点是电路简单,动态性能好,输出电压不含特定频率的谐波分量.其缺点是开关频率不固定造成较为严重的噪音,和其他方法相比,在同一开关频率下输出电流中所含的谐波较多. 3.2 三角波比较法2 该方法与SPWM法中的三角波比较方式不同,这里是把

18、指令电流与实际输出电流进行比较,求出偏差电流,通过放大器放大后再和三角波进行比较,产生PWM波.此时开关频率一定,因而克服了滞环比较法频率不固定的缺点.但是,这种方式电流响应不如滞环比较法快. 3.3 预测电流控制法6 预测电流控制是在每个调节周期开始时,根据实际电流误差,负载参数及其它负载变量,来预测电流误差矢量趋势,因此,下一个调节周期由PWM产生的电压矢量必将减小所预测的误差.该方法的优点是,若给调节器除误差外更多的信息,则可获得比较快速,准确的响应.目前,这类调节器的局限性是响应速度及过程模型系数参数的准确性.4 .空间电压矢量控制PWM 7 空间电压矢量控制PWM(SVPWM)也叫磁

19、通正弦PWM法.它以三相波形整体生成效果为前提,以逼近电机气隙的理想圆形旋转磁场轨迹为目的,用逆变器不同的开关模式所产生的实际磁通去逼近基准圆磁通,由它们的比较结果决定逆变器的开关,形成PWM波形.此法从电动机的角度出发,把逆变器和电机看作一个整体,以内切多边形逼近圆的方式进行控制,使电机获得幅值恒定的圆形磁场(正弦磁通). 具体方法又分为磁通开环式和磁通闭环式.磁通开环法用两个非零矢量和一个零矢量合成一个等效的电压矢量,若采样时间足够小,可合成任意电压矢量.此法输出电压比正弦波调制时提高15%,谐波电流有效值之和接近最小.磁通闭环式引 入磁通反馈,控制磁通的大小和变化的速度.在比较估算磁通和

20、给定磁通后,根据误差决定产生下一个电压矢量,形成PWM波形.这种方法克服了磁通开环法的不足,解决了电机低速时,定子电阻影响大的问题,减小了电机的脉动和噪音.但由于未引入转矩的调节,系统性能没有得到根本性的改善. 5 .矢量控制PWM8 矢量控制也称磁场定向控制,其原理是将异步电动机在三相坐标系下的定子电流Ia,Ib及Ic,通过三相/二相变换,等效成两相静止坐标系下的交流电流Ia1及Ib1,再通过按转子磁场定向旋转变换,等效成同步旋转坐标系下的直流电流Im1及It1(Im1相当于直流电动机的励磁电流;It1相当于与转矩成正比的电枢电流),然后模仿对直流电动机的控制方法,实现对交流电动机的控制.其

21、实质是将交流电动机等效为直流电动机,分别对速度,磁场两个分量进行独立控制.通过控制转子磁链,然后分解定子电流而获得转矩和磁场两个分量,经坐标变换,实现正交或解耦控制. 但是,由于转子磁链难以准确观测,以及矢量变换的复杂性,使得实际控制效果往往难以达到理论分析的效果,这是矢量控制技术在实践上的不足.此外.它必须直接或间接地得到转子磁链在空间上的位置才能实现定子电流解耦控制,在这种矢量控制系统中需要配置转子位置或速度传感器,这显然给许多应用场合带来不便. 6 .直接转矩控制PWM8 1985年德国鲁尔大学Depenbrock教授首先提出直接转矩控制理论(Direct Torque Control简

22、称DTC).直接转矩控制与矢量控制不同,它不是通过控制电流,磁链等量来间接控制转矩,而是把转矩直接作为被控量来控制,它也不需要解耦电机模型,而是在静止的坐标系中计算电机磁通和转矩的实际值,然后,经磁链和转矩的Band-Band控制产生PWM信号对逆变器的开关状态进行最佳控制,从而在很大程度上解决了上述矢量控制的不足,能方便地实现无速度传感器化,有很快的转矩响应速度和很高的速度及转矩控制精度,并以新颖的控制思想,简洁明了的系统结构,优良的动静态性能得到了迅速发展. 但直接转矩控制也存在缺点,如逆变器开关频率的提高有限制. 7. 非线性控制PWM 单周控制法7又称积分复位控制(Integratio

23、n Reset Control,简称IRC),是一种新型非线性控制技术,其基本思想是控制开关占空比,在每个周期使开关变量的平均值与控制参考电压相等或成一定比例.该技术同时具有调制和控制的双重性,通过复位开关,积分器,触发电路,比较器达到跟踪指令信号的目的.单周控制器由控制器,比较器,积分器及时钟组成,其中控制器可以是RS触发器,其控制原理如图1所示.图中K可以是任何物理开关,也可是其它可转化为开关变量形式的抽象信号. 单周控制在控制电路中不需要误差综合,它能在一个周期内自动消除稳态,瞬态误差,使前一周期的误差不会带到下一周期.虽然硬件电路较复杂,但其克服了传统的PWM控制方法的不足,适用于各种

24、脉宽调制软开关逆变器,具有反应快,开关频率恒定,鲁棒性强等优点,此外,单周控制还能优化系统响应,减小畸变和抑制电源干扰,是一种很有前途的控制方法. 8 .谐振软开关PWM 传统的PWM逆变电路中,电力电子开关器件硬开关的工作方式,大的开关电压电流应力以及高的du/dt和di/dt限制了开关器件工作频率的提高,而高频化是电力电子主要发展趋势之一,它能使变换器体积减小,重量减轻,成本下降,性能提高,特别当开关频率在18kHz以上时,噪声将已超过人类听觉范围,使无噪声传动系统成为可能. 谐振软开关PWM的基本思想是在常规PWM变换器拓扑的基础上,附加一个谐振网络,谐振网络一般由谐振电感,谐振电容 和

25、功率开关组成.开关转换时,谐振网络工作使电力电子器件在开关点上实现软开关过程,谐振过程极短,基本不影响PWM技术的实现.从而既保持了PWM技术的特点,又实现了软开关技术.但由于谐振网络在电路中的存在必然会产生谐振损耗,并使电路受固有问题的影响,从而限制了该方法的应用. 总结PWM控制技术以其控制简单,灵活和动态响应好的优点而成为电力电子技术最广泛应用的控制方式,也是人们研究的热点.由于当今科学技术的发展已经没有了学科之间的界限,结合现代控制理论思想或实现无谐振软开关技术将会成为PWM控制技术发展的主要方向之一.相关应用领域:PWM控制结束主要应用在电力电子技术行业,具体讲,包括风力发电、电机调

26、速、直流供电等领域,由于其四象限变流的特点,可以反馈再生制动的能量,对于目前国家提出的节能减排具有积极意义。这个设计采用基于AVR内核的MEGA8单片机,该单片机集成了相当丰富的片上资源,其中就包含有三路独立的PWM输出,在8MHz的晶振频率下,最高可以输出31.25KHz的8位分辨率脉宽,设计中主要是利用MEGA8的PWM输出功能来完成三路PWM波形的输出,其中两路是同步反向输出,频率、脉宽均可调,另外一路单独输出,脉宽可调。希望对那些不太懂PWM知识的朋友一些小小的帮助,本例是通过PROTEUS软件仿真通过的。一、设计电路图如下 图 1.1二、设计程序 本程序在GCC中编译通过并在PROT

27、EUS6.9.4版中调试通过。 #include#include#include#include #define BYTE unsigned char #define WORD unsigned int#define PWMOUTA PB1 #define PWMOUTB PB2#define PWMOUTC PB3int ocr_reg=0xfe;char flag=0x00;/*初始化程序*/void spwm_init(void) PORTB|=(1PWMOUTA)|(1PWMOUTB); /把PWM置为输出 DDRB |=(1PWMOUTA)|(1PWMOUTB); TIMSK=0x0

28、0; TCCR1B = 0x00; /stop TCNT1 = 0x0000; /计数器初值 OCR1A = 0x00ff; /比较寄存器的值,来控制占空比 (占空比50%) OCR1B = 0x0000; /(占空比50%) ICR1 = 0x03ff; /捕捉寄存器的值 10位分辨率 TCCR1A = (1COM1A1)|(1COM1B1)|(1COM1B0)|(1WGM11);/|(1WGM10); /设置PWM的频率及PWM工作模式 TCCR1B = (1WGM13)|(1WGM12)|(1CS10);/|(1CS11); /快速PWM模式,时钟不分频,TOP由ICR1设定 TIMSK

29、|=(1OCIE1A); /允许计数器比较匹配中断 PORTB|=(1PWMOUTC); DDRB |=(1PWMOUTC); TCCR2=0x69; /设置PWM的频率及PWM工作模式 TCNT2=0x00; /计数器初值 OCR2 =0x7f; /比较寄存器的值,来控制占空比 /*中断服务程序*/SIGNAL(SIG_OUTPUT_COMPARE1A) / memcpy_P(ocr_reg,sin_table+i,1);/从Flash中取出正弦数据 OCR1A=ocr_reg;/更新OCR1A OCR1B=ocr_reg;/更新OCR1B / OCR2 =ocr_reg;/更新OCR2 /

30、 i+;/指向下一个数据 if(flag) ocr_reg-; if(!flag) ocr_reg+; if(ocr_reg=0x03ff) / ocr_reg=0x00; flag=0x01; if(ocr_reg=0x00) / ocr_reg=0x00; flag=0x00; /*主程序*/int main(void) cli(); spwm_init(); /初始化 MCUCR = 0x00; GICR = 0x00; set_sleep_mode(SLEEP_MODE_IDLE); /设置休眠模式为空闲模式 sei(); /开总中断允许 while(1) ; sleep_mode()

31、; /进入休眠状态 return 0;三、电路仿真 本设计在PROTEUS6.9.4版中调试仿真图如下:图1.2图1.3图1.4图1.5 本设计的用途广泛,可用在各种电源的设计中、电机驱动的设计中,如果把程序稍加改动,亦可用来对三相电机进行SPWM驱动。 下面再看一个稍复杂的例子,电路图如下: 图2.1PWM波形如下所示:图2.2PWM输出经过滤波的波形: 图2.3主程序如下:/*main.c*/#define MAIN_C#include includes.h/*/*PWM*/*晶振为4MHz*/*利用Timer1的OC1A脚输出占空比可调的信号*/*通过按键控制OCR1A的值*/*/#de

32、fine PwmOut PD5 /A通道的PWM输出#define OCR OCR1A#define KeyUp PA0 /增大PWM值的按键#define KeyDown PA1 /减小PWM值的按键#define Above PA2 /设置位值过高指示#define Below PA3 /设置位值过低指示#define STEP 64 /定义按键时的步进值int OcrReg = 1024; /OCR1A初始值int Icr1Reg = 0x7ff; /PWM的计数顶部值 Icr1Reg = 2047/unsigned char *show = 0000; unsigned char te

33、mp;void init(void) /初始化函数 /比较匹配时清零,计数到最大时置位OC1A TCCR1A |= (1COM1A1)|(1WGM11); /11位分辨率,快速PWM模式,使用系统时钟作为计数时钟 TCCR1B |= (1WGM13)|(1WGM12)|(1CS10); ICR1 = Icr1Reg; OCR = 0 ; DDRD |= (1PwmOut); /置PWM为输出 DDRA |= (1Above)|(1Below); /指示灯定义为输出 DDRA &= (1KeyUp)|(1KeyDown); /按键定义为输入 PORTA |= (1KeyUp)|(1KeyDown

34、); /按键开启上拉 PORTA |= (1Above)|(1Below); /关闭两个指示灯 /TIMSK |= (1OCIE1A); /允许计数器比较匹配中断 /SREG |= (17); /开全局中断void ShowValue(int value) unsigned char *temp = 0000; temp0 = value/1000 + 0x30; value = value%1000; temp1 = value/100 +0x30; value = value%100; temp2 = value/10 + 0x30; value = value%10; temp3 = v

35、alue + 0x30; ClearLine(2); LCD_DisplayString(2,1,OCR1A = ); LCD_DisplayString(2,9,temp); void main(void) unsigned char i; init(); Init_LCD(); OCR = OcrReg; LCD_DisplayString(1,1,PWM test); LCD_DisplayString(2,1,OCR1A = ); ShowValue(OcrReg); while(1) if(!(PINA&(1KeyUp) delay_nms(10); /按键消抖 if(!(PINA&

36、(1KeyUp) while(!(PINA&(1= (Icr1Reg+1) for(i=0;i5;i+) PORTA = (1Above); delay_nms(200); ClearLine(2); LCD_DisplayString(2,1,Value MAX!); else PORTA |= (1Above); OcrReg += STEP; OCR = OcrReg; ShowValue(OcrReg); if(!(PINA&(1KeyDown) delay_nms(10); /按键消抖 if(!(PINA&(1KeyDown) while(!(PINA&(1KeyDown); /等待

37、按键释放 if(OcrReg = 0) for(i=0;i5;i+) PORTA = (1Below); delay_nms(200); ClearLine(2); LCD_DisplayString(2,1,Value MIN!); else PORTA |= (188) j = 0; */延时程序:/*delay.c*/#define DELAY_C#include includes.h#define XTAL 4 /晶振频率,单位MHzvoid delay_1us(void) /1us延时函数 asm(nop); void delay_nus(unsigned int n) /N us延

38、时函数 unsigned int i=0; for (i=0;in;i+) delay_1us(); void delay_1ms(void) /1ms延时函数 unsigned int i; for (i=0;i(unsigned int)(XTAL*143-2);i+); void delay_nms(unsigned int n) /N ms延时函数 unsigned int i=0; for (i=0;in;i+) delay_1ms(); 采用4位数据线的1602液晶驱动程序/* LCD.C */#define ENABLE_BIT_DEFINITIONS#define LCD_C#

39、include includes.h/ * Define I/O pins * /#define BIT7 0x80#define BIT6 0x40#define BIT5 0x20#define BIT4 0x10#define BIT3 0x08#define BIT2 0x04#define BIT1 0x02#define BIT0 0x01/ * Set port for LCD Data Bus 8 bit mode * /#define LCD_OP_PORT PORTB#define LCD_IP_PORT PINB#define LCD_DIR_PORT DDRB/ * S

40、et LCD Enable Port and Bit values * /#define LCD_EN LCD_OP_PORT.2/ * Set LCD Register Select Port and Bit values * /#define LCD_RS LCD_OP_PORT.0/ * Set LCD Read/Write Port and Bit values * /#define LCD_RW LCD_OP_PORT.1/*/ #define LCD_EN (1 2) /引脚定义 #define LCD_RS (1 0) #define LCD_RW (1 1) #define l

41、cd_set_e() (LCD_OP_PORT |= LCD_EN) /置位与清零 #define lcd_set_rs() (LCD_OP_PORT |= LCD_RS) #define lcd_set_rw() (LCD_OP_PORT |= LCD_RW) #define lcd_clear_e() (LCD_OP_PORT &= LCD_EN) #define lcd_clear_rs() (LCD_OP_PORT &= LCD_RS) #define lcd_clear_rw() (LCD_OP_PORT &= LCD_RW)/*/#define LCD_ON 0x0C#define

42、 LCD_CURS_ON 0x0D#define LCD_OFF 0x08#define LCD_HOME 0x02#define LCD_CLEAR 0x01#define LCD_NEW_LINE 0xC0#define LCD_FUNCTION_SET 0x28#define LCD_MODE_SET 0x06void LCD_INIT(void)LCD_DIR_PORT = 0xff; / LCD port outputLCD_OP_PORT = 0x30; / Load high-data to portlcd_clear_rw(); / Set LCD to writelcd_cl

43、ear_rs(); / Set LCD to commandlcd_set_e(); / Write data to LCDasm(nop);asm(nop);lcd_clear_e(); / Disable LCDdelay_nus(40);lcd_clear_rw() ; / Set LCD to writelcd_clear_rs(); / Set LCD to commandlcd_set_e(); / Write data to LCDasm(nop);asm(nop);lcd_clear_e(); / Disable LCDdelay_nus(40);lcd_set_e(); /

44、Write data to LCDasm(nop);asm(nop);lcd_clear_e(); / Disable LCDdelay_nus(40);LCD_OP_PORT = 0x20;lcd_set_e(); / Write data to LCDasm(nop);asm(nop);lcd_clear_e(); / Disable LCDdelay_nus(40);/*/ This routine will return the busy flag from the LCD /*/void LCD_Busy ( void )unsigned char temp,high;unsigne

45、d char low;LCD_DIR_PORT = 0x0f; / Make I/O Port inputdotemp=LCD_OP_PORT;temp=temp&BIT3;LCD_OP_PORT=temp;lcd_set_rw(); / Set LCD to READlcd_clear_rs();lcd_set_e();delay_nus(3);high = LCD_IP_PORT; / read the high nibble.lcd_clear_e(); / Disable LCDlcd_set_e();asm(nop);asm(nop);low = LCD_IP_PORT; / rea

46、d the low nibble.lcd_clear_e(); / Disable LCD while(high & 0x80);delay_nus(20);/ * / * Write a control instruction to the LCD * / * /void LCD_WriteControl (unsigned char CMD)char temp;LCD_Busy(); / Test if LCD busyLCD_DIR_PORT = 0xff; / LCD port outputtemp=LCD_OP_PORT;temp=temp&BIT3;LCD_OP_PORT =(CM

47、D & 0xf0)|temp; / Load high-data to portlcd_clear_rw(); / Set LCD to writelcd_clear_rs(); / Set LCD to commandlcd_set_e(); / Write data to LCDasm(nop);asm(nop);lcd_clear_e(); / Disable LCDLCD_OP_PORT =(CMD4)|temp; / Load low-data to portlcd_clear_rw(); / Set LCD to writelcd_clear_rs(); / Set LCD to

48、commandlcd_set_e(); / Write data to LCDasm(nop);asm(nop);lcd_clear_e(); / Disable LCD/ * / * Write one byte of data to the LCD * / * /void LCD_WriteData (unsigned char Data)char temp;LCD_Busy(); / Test if LCD BusyLCD_DIR_PORT = 0xFF; / LCD port outputtemp=LCD_OP_PORT;temp=temp&BIT3;LCD_OP_PORT =(Dat

49、a & 0xf0)|temp; / Load high-data to portlcd_clear_rw() ; / Set LCD to writelcd_set_rs(); / Set LCD to datalcd_set_e(); / Write data to LCDasm(nop);asm(nop);lcd_clear_e(); / Disable LCDLCD_OP_PORT = (Data 4)|temp; / Load low-data to portlcd_clear_rw() ; / Set LCD to writelcd_set_rs(); / Set LCD to da

50、talcd_set_e(); / Write data to LCDasm(nop);asm(nop);lcd_clear_e(); / Disable LCD/ * / * Initialize the LCD driver * / * /void Init_LCD(void)LCD_INIT();LCD_WriteControl (LCD_FUNCTION_SET);LCD_WriteControl (LCD_OFF);LCD_WriteControl (LCD_CLEAR);LCD_WriteControl (LCD_MODE_SET);LCD_WriteControl (LCD_ON)

51、;LCD_WriteControl (LCD_HOME);/ * / * Clear the LCD screen (also homes cursor) * / * /void LCD_Clear(void)LCD_WriteControl(0x01);/ * / * Position the LCD cursor at row 1, col 1 * / * /void LCD_Home(void)LCD_WriteControl(0x02);/ * / * Display a single character, at the current cursor location * / * /void LCD_DisplayCharacter (char Char)LCD_WriteData

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!