三相正弦变频电源的软件设计论文 - 图文

更新时间:2024-01-28 23:29:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

题目:本科毕业设计

三相正弦变频电源的软件设计

院 (系): 电子信息工程学院 专 业: 电气工程及其自动化 班 级: 学 生: 学 号: 指导教师:

2009年 06月

三相正弦变频电源的软件设计

摘 要

本文设计了一个AD/DC/AC变频电源系统。该系统利用XC164单片机, 采用SPWM变频控制技术,将直流电压逆变成电压、频率可变的交流输出,电源输出波形近似于正弦波,实现了三相正弦波变频输出。并采用双闭环PID控制,使其输出线电压有效值为36 V,最大输出电流有效值达3 A。此外系统还具有良好的稳压性能和很小的波形失真,并且能够进行自检测、过流、过压、过热和短路保护等功能。

关键字:正弦波脉宽调制;PID; A/D转换;变频电源

I

Sinusoidal Three-phase Inverter Power Software Design

Abstract

In this paper, we designed a AD / DC / AC inverter power system. The system uses XC164 microcontroller, using SPWM inverter control technology, reverse DC voltage into a voltage, variable frequency AC output waveform similar to sine wave power output to achieve the three-phase sine wave output inverter. And the use of double-loop PID control, so that the output line voltage RMS to 36 V, the maximum effective value of output current 3 A. System, the regulator also has a good performance and very small waveform distortion, and to carry out self-inspection, over-current, over-voltage, overheating and short circuit protection.

Keywords:sinusoidal pulse width modulation; PID control; A/D transformation; frequency-variable power supplier

II

目 录

摘 要 ............................................. I ABSTRACT .......................................... II 1 绪论 ............................................. 2

1.1前 言 ........................................................... 2 1.2课题研究背景及意义 .............................................. 2 1.3 国内外相关研究情况.............................................. 2 1.4本文主要研究工作 ................................................ 2

2 三相正弦变频技术相关理论研究 ........................ 4

2.1 正弦波生成方案的研究............................................ 4 2.1.1 PWM控制的基本原理 .......................................... 4 2.1.2 SPWM的产生过程 ............................................. 7 2.2 PID控制技术研究 ................................................ 8

3 系统硬件简述 ..................................... 12

3.1系统结构框图 ................................................... 12 3.2 XC164单片机简介 ............................................... 12 3.2.1 简介....................................................... 12 3.2.2 常用单元介绍............................................... 12 3.2.3 A/D转换器 ................................................. 13

4系统软件设计 ..................................... 12

4.1 软件开发环境................................................... 12 4.1.1 单片机编程开发语言......................................... 12

i

4.1.2 Keil C编辑器 ............................................. 12 4.2 系统软件设计................................................... 15 4.2.1 主程序设计................................................. 15 4.2.2中断程序 ................................................... 17 4.2.3 SPWM的编程实现 ............................................ 18 4.2.4 输出电压和电流有效值的计算................................. 20 4.2.5 PID控制 ................................................... 22

5结论 ............................................ 28 参考文献 .......................................... 29 致 谢 ............................................ 30 毕业设计(论文)知识产权声明 ......................... 31 毕业设计(论文)独创性声明........................... 32 附录 ............................................. 33

ii

1 绪论 1 绪论

1.1前 言

近来,变频电源在各行各业的应用日益广泛。变频器电源主要用于交流电机的变频调速,其在电气传动系统中占据的地位日趋重要,已获得巨大的节能效果。由于世界各国电网指标不统一,生产出口产品都需要电网模拟不同国家的电网状况,并保证稳定性。过去采用调压器调压,稳压器稳压,发电机进行二次变频,耗电量大,躁声大,稳定性差逐渐被变频电源所代替,所以市场上需求输出电压,频率无级数字可调,波形稳定纯净的电源。本文是设计一个新型工业用缝纫机三相正弦波变频电源,用以实现缝纫机的无级调速。该产品的设计是根据市场的需求而确定的,可填补该产品市场的空白,满足国内制衣业的急需。

1.2课题研究背景及意义

该题目是设计一个新型工业用缝纫机三相正弦波变频电源,用以实现缝纫机的无级调速。该产品的设计是根据市场的需求而确定的,可填补该产品市场的空白,满足国内制衣业的急需。

现代电源技术是应用电力电子半导体器件,综合自动控制、计算机(微处理器)技术和电磁技术的多学科边缘交叉技术。在各种高质量、高效、高可靠性的电源中起关键作用,是现代电力电子技术的具体应用。

当前,电力电子作为节能、节材、自动化、智能化、机电一体化的基础,正朝着应用技术高频化、硬件结构模块化、产品性能绿色化的方向发展。在不远的将来,电力电子技术将使电源技术更加成熟、经济、实用,实现高效率和高品质用电相结合。

技术的发展

现代电力电子技术的发展方向,是从以低频技术处理问题为主的传统电力电子学,向以高频技术处理问题为主的现代电力电子学方向转变。八十年代末期和九十年代初期发展起来的、以功率MOSFET和IGBT为代表的、集高频、高压和大电流于一身的功率半导体复合器件,表明传统电力电子技术已经进入现代电力电子时代。

(1) 整流器时代

大功率的工业用电由工频(50Hz)交流发电机提供,但是大约20%的电能是以直流形式消费的,其中最典型的是电解、牵引和直流传动三大领域。因此在六十年代和七十年代,大功率硅整流管和晶闸管的开发与应用得以很大发展。当时国内曾经

1

西安工业大学毕业设计(论文)

掀起了-股各地大办硅整流器厂的热潮。

(2) 逆变器时代

七十年代出现了世界范围的能源危机,交流电机变频调速因节能效果显著而迅速发展。变频调速的关键技术是将直流电逆变为0~100Hz的交流电。在七十年代到八十年代,随着变频调速装置的普及,大功率逆变用的晶闸管、巨型功率晶体管(GTR)和门极可关断晶闸管(GT0)成为当时电力电子器件的主角。这时的电力电子技术已经能够实现整流和逆变,但工作频率较低,仅局限在中低频范围内。

(3) 变频器时代

八十年代,大规模和超大规模集成电路技术的迅猛发展将集成电路技术的精细加工技术和高压大电流技术有机结合,出现了一批全新的全控型功率器件、首先是功率M0SFET的问世,导致了中小功率电源向高频化发展,而后绝缘门极双极晶体管(IGBT)的出现,又为大中型功率电源向高频发展带来机遇。MOSFET和IGBT的相继问世,是传统的电力电子向现代电力电子转化的标志。

1.3 国内外相关研究情况

20世纪70年代后,大规模集成电路和计算机控制技术的发展,以及现代控制理论的应用,推动了变频电源技术的发展,使得交流电力拖动系统逐步具备了宽的调速范围、高的稳速范围、高的稳速精度、快的动态响应以及在四象限作可逆运行等良好的技术性能,在调速性能方面可以与直流电力拖动媲美。

在交流调速技术中,变频调速具有绝对优势,并且它的调速性能与可靠性不断完善,价格不断降低,特别是变频调速节电效果明显,而且易于实现过程自动化,深受工业行业的青睐。

变频电源是运动控制系统中的功率变换器。当今的运动控制系统是包含多种学科的技术领域,总的发展趋势是:驱动的交流化,功率变换器的高频化,控制的数字化、智能化和网络化。因此,变频电源作为系统的重要功率变换部件,提供可控的高性能变压变频的交流电源而得到迅猛发展。

经历大约30年的研发与应用实践,随着新型电力电子器件和高性能微处理器的应用以及控制技术的发展,变频电源的性能价格比越来越高,体积越来越小,而厂家仍然在不断地提高可靠性实现变频电源的进一步小型轻量化、高性能化和多功能化以及无公害化而做着新的努力。

1.4本文主要研究工作

本文采用交流-直流-交流,即先整流后逆变的方法, 制作一个频率可调的三相正弦波变频电源。先通过自耦变压器和隔离变压器将220V的市电转化为所需要的电压,再通过电容滤波的不可控整流电路,将交流整为直流,然后通过软件产生的SPWM控制。本电路有电流电压的检测和缓冲电路,具有过流保护,负载缺相保护及负载不对称保护功能,使电路安全稳定工作。用单片机的编程,以生成SPWM

2

西安工业大学毕业设计(论文)

脉冲;对输出电压和电流进行采样、A/D转换,并计算出输出线电压和相电流;实现电压、电流、频率和功率的LCD显示;对输出电压进行PID控制;以及根据输出电流实现过流保护、负载缺相保护及负载不对称保护。根据课题要求,通过比较,采用德国Infineon公司生产的XC164单片机作为核心控制模块,利用单片机生成的SPWM脉冲经过逆变电路的驱动电路(核心器件为IR2136),加在由MOS管构成的逆变驱动电路上,再对逆变电路的输出信号进行LC低通滤波,从而产生合乎要求的正弦波,是一种基于SPWM控制的变频电源的设计方法。

该变频电源的输出频率范围为20Hz~100Hz的三相对称交流电,各相电压有效值之差小于0.5V;输出电压波形接近正弦波,用示波器观察无明显失真;在输入电压为198V~242V,负载电流有效值为0.5A~3A时,输出线电压有效值应保持在36V,误差的绝对值小于5%;当输出电流有效值达3.6A时过流保护动作、当三相电流中任意两相电流之差大于0.5A时,自动实施负载缺相保护及负载不对称保护功能,保护时自动切断输入交流电源。

本人在该课题中所承担的任务主要是单片机的编程,以生成SPWM脉冲;对输出电压和电流进行采样、A/D转换,并计算出输出线电压和相电流;实现电压、电流、频率和功率的LCD显示;对输出电压进行PID控制;以及根据输出电流实现过流保护、负载缺相保护及负载不对称保护。另外,我还参与系统方案的选取与部分电路的设计。根据课题要求,通过比较,我们决定采用SPWM技术,并且将XC164单片机作为该变频电源系统的核心控制器。

3

2 三相正弦变频技术相关理论研究

2 三相正弦变频技术相关理论研究

2.1 正弦波生成方案的研究

2.1.1 PWM控制的基本原理

在采样控制理论中有一个重要的结论:冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同,冲量即指窄脉冲的面积。这里所说的效果基本相同,是指环节的输出响应波形基本相同。如果把各输出波形用傅立叶变换进行频谱分析,可发现它们的低频段特性非常接近,仅在高频段略有差异。例如图2.1中a、b、c 所示的三个窄脉冲形状不同,图2.1a 为矩形脉冲,图2.1b 为三角形脉冲,图2.1c 为正弦半波脉冲,但它们的面积(即冲量)都等于1,那么,当它们分别加在具有惯性的同一个环节上时,其输出响应基本相同。脉冲越窄,其输出的差异越小,当窄脉冲变为图2.1d 的单脉冲函数δ (t)时,环节的响应即为该环节的脉冲过渡函数。

a b

c d 图2.1形状不同而冲量相同的各种窄脉冲

4

西安工业大学毕业设计(论文)

上述结论是PWM 控制的重要理论基础。下面分析一下如何用一系列等幅而不等宽的脉冲代替一个正弦半波。把图2.2a 所示的正弦半波波形分成N 等份,就可把正弦半波看成由N个彼此相连的脉冲所组成的波形。这些脉冲宽度相等,都等于π/N,但幅值不等,且脉冲顶部不是水平直线,而是曲线,各脉冲的幅值按正弦规律变化。如果把上述脉冲序列用同样数量的等幅而不等宽的矩形脉冲序列代替,使矩形脉冲的中点和相应正弦等分的中点重合,且使矩形脉冲和相应正弦部分面积(冲量)相等,就得到图2.2b 所示的脉冲序列。这就是PWM 波形。根据冲量相等效果相同的原理,PWM 波形和正弦波是等效的。对于正弦波的负半周,也可以用同样的方法得到PWM 波形。像这种脉冲的宽度按正弦规律变化而和正弦波等效的PWM 波形,也称为SPWM(Sinusoidal PWM)波形。

图2.2 PWM 控制的基本原理示意图

以上介绍的是PWM 控制的基本原理,按照上述原理,在给出了正弦波频率、幅值和半个周期内的脉冲数后,PWM 波形各脉冲的宽度和间隔就可以准确计算出来。按照计算结果控制电路中各开关器件的通断,就可以得到所需要的PWM 波形。

5

西安工业大学毕业设计(论文)

图2.3 单极性SPWM 控制原理图

图2.4 双极性SPWM 控制原理

但是,这种计算是很烦琐的,正弦波的频率、幅值变化时,结果都要变化。较为实用的方法是采用调制的方法,即把所希望的波形作为调制信号,把接受调制的信号作为载波,通过对载波的调制得到所期望的PWM 波形。通常采用等腰三角形作为载波,因为等腰三角形上下宽度与高度成线性关系且左右对称,当它与任何一个平缓变化的调制信号波形相交时,如在交点时刻控制电路中开关器件的通断,就可以得到宽度正比于信号波幅值的脉冲,这正好符合PWM控制的要求。当调制信号波为正弦波时,所得到的就是SPWM 波形。一般根据三角波载波在半个周

6

西安工业大学毕业设计(论文)

期内方向的变化,又可以分为两种情况。三角波载波在半个周期内的方向只在一个方向变化,所得到的SPWM 波形也只在一个方向变化的控制方式成为单极性SPWM 控制方式,如图2.3 所示。如果三角波载波在半个周期内的方向是在正负两个方向变化的,所得到的SPWM 波形也是在两个方向变化的,这时成为双极性SPWM 控制方式如图2.4 所示。 2.1.2 SPWM的产生过程

脉宽调制(PWM)技术是用脉冲宽度不等的一系列矩形脉冲去逼近一个所需要的电压或电流信号。它是利用三角波电压与参考电压相比较,一旦三角波电压和参考电压相比配,输出电平翻转,否则输出电平保持不变,这样就确定了各分段矩形脉冲的宽度。

从脉宽调制的极性看,PWM波又可分为单极性和双极性控制模式两种。由于单极性的PWM脉冲信号还要与特定的倒相信号相乘才能得到正负半波对称的PWM脉冲信号,与单极性模式相比,尽管双极性PWM脉冲信号输出电压中高次谐波分量较多,但其电路简单且易于单片机编程,因此本文采用双极性的PWM。

采用对称的三相正弦波电源供电,有利于减小谐波影响,因此,PWM的参考电压一般为正弦波,参考电压为正弦波的PWM即为SPWM。其具体方法如下:

正弦波脉宽调制技术就是利用三角波电压(载波)和正弦波(调制波)相比较,以确定个分段矩形脉冲的宽度,使输出矩形脉冲逼近正弦波。为了得到三相SPWM脉冲,需要用三个相位两两相差120°的正弦波同时调制一个三角波,如图 2.5所示:

图2.5 三相SPWM产生示意图

在该变频电源系统中,SPWM脉冲是由单片机产生的,SPWM信号要求脉宽按正弦规律变化,因此每一个PWM周期脉宽都要改变,由单片机产生SPWM波就是在初始化时将PWM周期值设定,然后用定时器定时,每个周期产生一次中断,来调整脉宽,从而得到脉宽不断变化的SPWM脉冲。

所谓SPWM正弦脉宽调制法是调制波为正弦波载波为三角波或锯齿波的一种脉

7

西安工业大学毕业设计(论文)

宽调制法.它原理简单,控制和调节性能好,具有消除谐波、调节和稳定输出电压等多种作用,是一种较好的波形改善法。电源的稳定关键是SPWM波形产生的稳定性。现在通用的SPWM实现方法是,通过用单片机查正弦函数表得到SPWM波形;本文把单片机的智能化和控制技术与开关电源的高效率相结合,设计出一款高性能的三相正弦波变频稳压电源。该变频电源可利用反馈电压对输出电压每个周期内采样20个点,据此计算出输出线电压有效值,对其进行PID控制,以实现良好的稳幅特性。 同时通过电流传感器对电流每个周期内采样20个点,并反馈到控制模块,以计算出电流的有效值从而对其进行监控,以实现过流保护、负载缺相保护和负载不对称保护,使该变频电源更加安全可靠。另外,该变频电源还具有液晶显示功能,可以显示输出正弦波的频率、电压、电流和功率,使其操作简单方便。

2.2 PID控制技术研究

PID控制就是根据系统的误差,利用比例、 积分、微分计算出控制量进行控制的,在PID控制中,比例控制能迅速反应误差,从而减小稳态误差。但是,比例控制不能消除稳态误差。比例放大系数的加大,会引起系统的不稳定。积分控制的作用是,只要系统有误差存在,积分控制器就不断地积累,输出控制量,以消除误差。因而,只要有足够的时间,积分控制将能完全消除误差,使系统误差为零,从而消除稳态误差。积分作用太强会使系统超调加大,甚至使系统出现振荡。微分控制可以减小超调量,克服振荡,使系统的稳定性提高,同时加快系统的动态响应速度,减小调整时间,从而改善系统的动态性能。

PID控制是一种比较成熟的控制理论,它通过比例、积分、微分三部分的合理组合可以用比较简单的方法获得令人满意的控制效果。PID的数学模型如图2.6表示:

图2.6 PID数学模型

给定值R(t)与实际值Y(t)构成控制误差:

E(t)=R(t)-Y(t) (2.1) PID控制器根据E(t)将误差的比例(P)、积分(I)、和微分(D)通过线性组合构成控制量,对受控对象进行控制,其控制规律如式2.2所示:

8

西安工业大学毕业设计(论文)

U(t)=KP[e(t)+

1Ti?t0E(t)dt?Tdde(t)dt] (2.2)

U(t)一控制器输出函数;E(t)一控制器误差函数; KP一比例系数;Ti一积分时间常数;Td一微分时间常数;

PID控制算法又分为位置型和增量型两种,分别如下面式(2.3)、式(2.4)所示:

u(n)=KC{e(n)+T/Tre(i)+

TD/T[e(n)-e(n-1)]} (2.3) Δu(n)=u(n)-u(n-1)

=KC{[e(n)-e(n-1)]+T/Tre(n)+

TD/T[e(n)-2e(n-1)+e(n-2)]} (2.4)

式中,u(n)为第n次采样时刻计算机的输出;Δu(n)为第n次采样时刻计算机输出的增量;e(n)为第n次采样时刻的偏差信号;T为采样周期;KC为调节器的比例增益;Tr为调节器的积分时间;TD为调节器的微分时间。

由上面两式可知,数字PID控制是一种采样控制,它只能根据采样时刻的偏差值计算控制量。由于偏差信号e(n)是由测量环节输出的测量信号S(t)和设定值r相比较后采样而得到的[e(n)=r(n)-S(n)],而测量信号中总是存在一些干扰、噪声或者畸变,这些因素都影响上述控制算法的精度,从而使整个控制系统的性能下降。但是,利用数字滤波和动态补偿技术能够有效地对偏差信号(测量信号)中的干扰、噪声进行滤波或者对其畸变进行动态补偿,从而提高数字PID控制算式的精度,改进控制系统的性能。 本设计用的是增量式PID控制算法:

增量式PID是指数字控制器的输出只是控制量的增量Δu(k)。采用增量式算法时,计算机输出的控制量Δu(k)对应的是本次执行机构位置的增量,而不是对应执行机构的实际位置,因此要求执行机构必须具有对控制量增量的累积功能,才能完成对被控对象的控制操作。执行机构的累积功能可以采用硬件的方法实现;也可以采用软件来实现,如利用算式 程序化来完成。 由式(2.6)可得增量式PID控制算式

(2.5)

式中

进一步可以改写成

式中

(2.6)

一般计算机控制系统的采样周期T在选定后就不再改变,所以,一旦确定了

9

西安工业大学毕业设计(论文)

Kp、Ti、Td,只要使用前后3次测量的偏差值即可由式(2.5)或式(2.6)求出控制增量。

增量式算法优点:①算式中不需要累加。控制增量Δu(k)的确定仅与最近3次的采样值有关,容易通过加权处理获得比较好的控制效果;②计算机每次只输出控制增量,即对应执行机构位置的变化量,故机器发生故障时影响范围小、不会严重影响生产过程;③手动—自动切换时冲击小。当控制从手动向自动切换时,可以作到无扰动切换。

10

3 系统硬件简述 3 系统硬件简述

3.1系统结构框图

本论文采用交—直—交变频技术,首先将220V,50Hz交流电通过隔离变压器变压后再整流滤波,形成90V左右的直流电压,然后再由单片机产生三相SPWM波,经驱动放大后加到逆变电路上,将直流电转化为36V的正弦波交流电。该变频电源系统的开关,输出频率的增减可通过与单片机相连的键盘控制。同时,为了输出波形的稳定、安全,并且显示输出频率、电压、电流和功率,本系统同时采用电压反馈电路和电流反馈电路,分别将输出电压和电流反馈至XC164单片机,然后该单片机利用其内部的模数转换器对反馈电压和电流进行A/D转换,再根据转换的数字量结果计算出电压、电流的有效值以及功率,连同输出频率一并显示;同时单片机根据计算出的电压有效值对输出电压进行宏观PID控制,以实现稳幅。 三相正弦变频电源的系统原理框图如图3.1所示:

液晶显示逆变驱动电路 电压反馈电路 电流反馈电路 隔离变压器 整流滤波电路 逆变电路 滤波电路 三相负载 单片机 图3.1 系统原理框图

键盘 11

西安工业大学毕业设计(论文)

3.2 XC164单片机简介

3.2.1 简介

本论文中的单片机选用了德国Infineon公司生产的XC164单片机。它属于Infineon XC166系列的单片机,是Infineon 16位单片机的第四代产品。该系列的单片机是为了适应实时嵌入式应用的高性能要求所设计的。整个系统的结构根据高速指令输出与对外部激励的快速响应进行了最优化的设计。为了最大程度的减小CPU中断的需要,它把外围智能子系统结合成一个整体,这样同时也使外部总线接口的通信需求减到最小。XC164型单片机的功率管理机理有效地控制了单片机在特定状态下的能耗,使单片机工作时的能耗达到最小。它的MAC单元具有数字信号处理功能,使其具有处理数字滤波算法的能力,并且极大地减小了乘法和除法运算的执行时间。

作为该变频电源系统核心控制模块的XC164单片机控制着SPWM脉冲的生成,LCD的显示,变频电源的输出频率,输出电压的稳幅以及电路的保护,可以说是整个变频电源系统的心脏。该变频电源系统的软件设计——单片机编程的任务是在实现硬件平台正常工作的基础上,设计相应的控制软件,完成SPWM脉冲的生成、对输出电压的PID控制、输出电压和电流检测、液晶显示、按键控制,过流保护负载不对称或缺相保护等功能。 3.2.2 常用单元介绍

下面本文将对单片机编程中最常用的单元进行介绍。

XC164单片机具有128KB的闪存,6KB的内存,14个模拟输入通道,6个串行接口,可以实现信号的采集、处理、控制和显示功能,并且内部含有AD转换器,灵活性好,外围设备简单,可以在线编程,易于调试,执行速度快、存储容量大。在该变频电源系统的单片机编程中,用到最多的是XC164中CAPCOM6(Capture/Compare Unit6)单元。CAPCOM6由T12计时器模块和T13计时器模块组成,由于本文只用到T12计数器,因此这里只对T12进行介绍。

T12计时器有三个捕获/比较通道,它们可以独立的产生PWM信号或者接受捕获触发,也可以共同产生控制信号模式,以驱动交流电动机或逆变器。当CAPCOM6处于比较模式时,T12计时器模块主要是用来产生三相PWM脉冲的。一个16位的计数器通过比较器与三个通道寄存器相连,当计数器计数值与通道寄存器的值相匹配时,就产生一个信号。T12计时器通过可编程比例因子从模块时钟fcc6获得其输入时钟fT12。它可以向上或向下计数,其计数方向用一个方向标志——CDIR来

12

西安工业大学毕业设计(论文)

表示。通过比较器还和周期寄存器T12PR相连,T12PR决定了T12的最大计数值。当选择边缘对齐模式时,T12计数到最大值后被重新赋0;当选择中心对齐模式时,T12计数到最大值后计数方向变为向下计数。可以通过软件控制T12的工作状态:对T12RS赋1,T12R置一,T12开始计数;对T12RR赋1,T12R清零,T12停止计数。

对单相信号来说,一个通道会产生高电平(当T12计数值大于比较值时)和低电平(当T12计数值小于比较值时)。然而在实际操作中,开关电源的开关特性关于开关时间往往是不对称的。当电源的开启时间小于关闭时间时,逆变器的上下桥臂将短路,产生的巨大电流可能损坏整个系统。为避免这种情况的发生,必须建立死区时间。CAPCOM6内包含一个可编程的死区控制模块,可以通过对其控制以延迟开关信号由低电平向高电平转变的时间,从而避免逆变器上下桥臂“直通”。 运用软件对单片机内部寄存器进行相应的设置可以得到三相SPWM脉冲。在单片机内部,通过查表的方式来得到正弦信号的幅值,该幅值乘以调制度后与CAPCOM6-T12的计数值相比较,若匹配则输出端产生跳变,否则输出端保持原电平,这样在输出端便产生SPWM脉冲。为得到三相SPWM脉冲, 可设置三个不同的指针,每相邻的两个指针间距为正弦表长度的1/3(即相差120°),并且三个指针同步变化,这样,每一个指针对应一路SPWM脉冲。当三个指针同时采样时,便产生了相位相差120°三相SPWM脉冲。 3.2.3 A/D转换器

XC164单片机内部还包含一个具有10位或8位精度的A/D转换器以及一个采样/保持电路。(本文的A/D转换模式选为增强模式,对应10位的模数转换精度。)A/D转换器相当于一个容性网络,采用逐次逼近的方式进行模数转换,其工作过程分为三个阶段:

(1)在采样阶段,该容性网络与选定的输入通道相连,通过电容的充放电来逼近输入信号的电压。

(2)在转换阶段,该容性网络与选定的输入通道断开,在逐次逼近过程中,通过参考电压进行充放电。

(3)转换器根据网络外部环境(如温度)的变化进行校准,并将结果送入结果寄存器,同时产生一个中断。

13

4 系统软件设计 4系统软件设计

4.1 软件开发环境

4.1.1 单片机编程开发语言

汇编语言作为一个符号化的机器语言,其代码执行效率高,运行速度快,非常适合于编写实时性要求较高的控制程序。但其开发的工作量大,程序的可读性差。汇编语言比机器语言易于读写、易于调试和修改,同时也具有机器语言执行速度快,占内存空间少等优点,但在编写复杂程序时具有明显的局限性,汇编语言依赖于具体的机型,不能通用,也不能在不同机型之间移植。对于不同型号的计算机,有着不同的结构的汇编语言。相比之下,作为高级语言的c具有可读性强、编程简单和调试方便的特点。C语言是目前非常流行的一种编程语言,除具有高级语言使用方便灵活、数据处理能力强、 编程简单等优点外,还可实现汇编语言的大部分功能,如可直接对硬件进行操作、生成的 目标代码质量较高且执行的速度较快等。所以在工程上对硬件处理速度要求不很高的情况下, 基本可以用C代替汇编语言,编写接口电路的控制软件。与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,易学易用,所以本设计选用C语言作为单片机的开发语言。 4.1.2 Keil C编辑器

本文的XC164单片机的编程是在Keil-Uvision3开发软件环境下进行的。Keil-Uvision3 是美国Software公司推出的单片机C语言软件开发系统。用它生成的目标代码效率非常高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。单片机程序是在Keil-Uvision3软件下调试、编译通过后,通过伟福仿真机烧到XC164单片机里的。标准编译器为单片机微控制器的软件开发提供了语言环境,它可以支持所有的衍生产品,也支持所有兼容的仿真器,同时支持其它第三方开发工具。它的基本特点有:

Keil强大的编辑功能。允许在编辑器内调试程序,可以更快速的检查和修改程序;允许在编辑时设置程序断点,当启动调试器后,断点被激活;可以在编辑器中观察其取值。

灵活的工程管理功能。在一个工程中建立多个源文件(包括汇编、C)以及其它文件,并可以随时添加、修改和删除文件,通过对工程的操作完成编译和链接。

14

西安工业大学毕业设计(论文)

高效的代码优化功能。具有通用代码优化、特殊优化、寄存器优化等。

利用Keil软件开发的一般步骤:

a.根据所选择的器件以及调试方式创建新的任务。

b.创建新的工程,把已编好的源程序、头文件等加入工程中。 c.编译连接工程,·进行在线调试。

d.调试完成后,在工程中选择加载类型,重新编译连接,生成可以用于加载的文件。

图4.1 Keil主界面介绍

4.2 系统软件设计

4.2.1 主程序设计

在程序设计时,为简化程序流程,本文采用了T12中断(控制生成SPWM脉冲)和T3中断(控制反馈电压和电流的A/D转换),将按键状态的判断,输出电压的PI控制,电压、电流有效值的计算,以及过流保护、负载不对称和缺相保护等放在主程序循环中。主程序下分:显示子程序,采样子程序和SPWM子程序,主程序运行时,不断调用这三个子程序。

15

西安工业大学毕业设计(论文)

主程序流程图如图4.2所示:

开 始 系统初始化 按键选择 Up键 Down键 Run/stop键 输出频率加1 输出频率减1 否 运行状态? 设置相关寄存器 设置相关寄存器 是 关T12中断 关 T3中断 开T12中断 开 T3中断 显示结果

图4.2 程序流程图

主程序除了一些初始化设置外,整个处在一个大循环中,判断按键状态从而做出相应的响应。当变频电源处于工作状态时,按下开关键,电源停止工作;按频率增加键,输出频率以1为步长增加;按频率减小键,输出频率以1为步长减小。当电源处于停止状态时,按下开关键,电源开始工作;按频率增加键或频率减小键,系统都不会响应。当电源工作并且A/D转换不工作时,系统不停地计算输出线电压有效值,并对输出电压进行PI控制,以使输出线电压稳定在36V。电源工作时,每隔一段时间计算各相电流的有效值,单片机据此对电路进行过流保护、负载不对称和缺相保护。LCD则根据计算的电压、电流值自动更新显示。

16

西安工业大学毕业设计(论文)

4.2.2中断程序

其中,T12、T3中断服务程序流程图分别如图4.3、4.4所示

17

进入T12中断 计算A/D转换后的有效值 计算电压偏差e(k) e(k)=Ug 对e(k)的增量进行PID运算 查正弦表,并利用计算 结果修正调制度 将修正结果送入T12寄存器 输出SPWM信号 中断返回 图4.3 T12中断服务程序流程图

西安工业大学毕业设计(论文)

进入中断 启动A/D转换器 对六路反馈信号进行采集存储 中断返回

图4.4 T3中断程序流程图

XC164中的T12计时器按中心对齐方式进行计数,其效果相当于在单片机内部产生了一个三角波,同时,三个正弦指针分别以输出频率从正弦表中读取正弦值,得到的正弦值乘以调制度后赋给寄存器CC60SR,该寄存器与T12计时器相比较,一旦匹配,单片机输出电平翻转,否则保持不变,这样SPWM脉冲就产生了。当程序进入T12中断时,转到T3中断程序,启动A/D转换器,对六路反馈信号进行采集存储,程序由T3返回到T12,对A/D转换后的有效值进行计算,计算电压偏差

Ue(k)e(k)=g,对e(k)的增量进行PID运算,查正弦表,并利用计算结果修正调制度,将修正结果送入T12寄存器存储,输出SPWM信号,中断返回。 4.2.3 SPWM的编程实现

SPWM脉冲是由XC164单片机内部的CAPCOM6实现的。T12中断程序用三相正弦波共同调制一个三角波,三相SPWM脉冲产生的软件实现基本一致,因此,下面以任意一相SPWM脉冲产生的流程图(如图4.5所示)为例进行说明,其流程图如下:

18

西安工业大学毕业设计(论文)

开 始 是 θ < 否 θ?θ-180° 比较寄存器?1000+Msinθ 比较寄存器?1000-Msinθ θ?θ+△θ 否 θ>360° 是 θ?θ-180° 结 束 图4.5 SPWM脉冲产生流程图

首先,对CAPCOM6内部的T12计时器进行初始化设定:

CCU6_T12=0; //首先将T12的计数器值赋0

CCU6_T12PR=1999; //将T12的最大计数值设为1999 CCU6_T12MSEL=0x0333; //激活三个通道,选用比较模式

CCU6_T12DTC=0x073f; //使能死区时间控制,最大死区时间定为1.5us CCU6_TCTR0=0x0080; //计数采用中心对齐模式,fT12?fcc6

19

西安工业大学毕业设计(论文)

CCU6_ISR=0xffff; //中断状态清零 CCU6_IEN=0x0040; //使能T12OM中断 CCU6_T12IC=0x015f; //中断级别设为7

CCU6_CC60SR=1000; // 分别给三个比较寄存器赋1000 CCU6_CC61SR=1000; CCU6_CC62SR=1000;

CCU6_TCTR4=0x0040; //使能影子转移 CCU6_TCTR4=0x0002; //T12开始计数

其中,T12的频率fT12等于系统频率。单片机外部晶振频率为8MHz,XC164内部的锁相环使该频率五倍频,即系统频率为40MHz,亦即fT12?40MHz。T12在一个计数周期内从0计数到1999,再从1999计数到0,共计数4000次。因此SPWM的频率

fpwm?40MHz4000?10kHz。

至于其它两相SPWM脉冲的产生,其差别只在正弦表指针上。在具体编程实现时,我们分别用正弦表偏移量SintabU、SintabV和SintabW来代替图3.4中的正弦角θ;对应于SPWM的频率fpwm?10kHz,应建立一个10000个点的正弦表,这样,正弦表里的一个点就相当于1Hz的频率,输出频率赋给输出步长。比如输出频率为50Hz时,正弦表取值就以步长50跳变。三个正弦表偏移量初始值设为:SintabU=0,SintabV=3333,SintabW=6666,以后,三个正弦表指针同步变化,即相当于三个正弦波相位两两相差120°。 正弦表的正弦值在-998到998之间变化,而三角波则在0到1999之间变化,因此写程序时给正弦值加了1000。另外,为节省单片机内存,建立正弦表时,只给出了前半周期(0到180°)的正弦值,后半周期的正弦值由程序算法实现,所以开始时首先判断相位的范围,若相位在后半周期,则需做相应的变换;若相位超过360°,则应先将相位减去360°。得到的正弦值乘以调制度后和三角波计数值做比较,一旦匹配,输出自动电平翻转,如此就产生了SPWM脉冲。

4.2.4 输出电压和电流有效值的计算

要实现电流过流和负载不对称或缺相电路保护需要知道输出电流有效值,要实现输出电压稳幅需要知道电压有效值,另外,LCD要显示电压、电流和功率也需要知道电压与电流值,因此在单片机的编程中输出电压和电流有效值的计算特别

20

西安工业大学毕业设计(论文)

重要。

要计算输出电压和电流的有效值,首先要将反馈电压和电流等模拟量转换成适合单片机处理的数字量,即对反馈电压和电流进行A/D转换。XC164内部的A/D转换主要由T3计时器完成,其初始化设置如下:

GPT12E_T3CON=0x0000; //T3向上计数,fT3?GPT12E_T2CON=0x1027; //T3OTL触发

fGPT8

GPT12E_T2=0xffff-(5000000/(frequency*SMOUNT)); //一个输出周期内产生20个中断 GPT12E_T3=GPT12E_T2;

GPT12E_T3IC=0x0147; //使能T3中断,中断级别为8 GPT12E_T3CON_T3R=1; //T3开始计时

其中,SMOUNT为20的宏定义,T2为T3的辅助计时器。T3从5000000/(frequency*20)开始计数,当计数到65535(0xffff)时,产生溢出,T3OTL触发使T2把0xffff-(5000000/(frequency*20))赋给T3,T3重新开始从5000000/(frequency*20)计数,如此反复。

T3

的计数频率fT3?fGPT8?40MHz?5MHz,而

8T3每计数

5000000/(frequency*20)就产生一个中断,即T3中断的频率为输出频率的20倍,亦即一个输出周期内产生20个T3中断,这样就可以在一个周期内采样20个点。 T3中断一次,对三相电压和三相电流各采样一个点,由于三相电压和电流的A/D转换程序除了通道不同之外基本一样,所以下面只写出U相电压的A/D转换:

ADC_CTR0&=0xfff0; //选择增强型模式 ADC_CTR0|=VUCH; //选择U相电压通道

ADC_CTR0_ADST=1; //开始A/D转换

Delay4us(); //调用延迟子程序,大约延迟4us vus[scount]=(ADC_DAT>>2)&0x03ff; //将A/D转换结果放入数组

其中,VUCH是U相电压通道地址的宏定义。在增强型模式下,A/D转换的精度为10位,模数转换结果存放在寄存器ADRES的第2至第11位(ADC-DAT),因此A/D转换结果在存入相应的数组前必须先右移两位;另外,增强模式下A/D转换的最大时间为2.55us,为保证A/D转换的正确性,在从ADC-DAT取值前必须有大于2.55us的延迟时间,因此我们调用了一个大约4us的延迟子程序。 A/D转换后的三相电压和电流分别存放在数组vus[20]、vvs[20]、vws[20]、ius[20]、ivs[20]和iws[20]中。三相纯阻性负载星型连接,所以线电流即等于相

21

西安工业大学毕业设计(论文)

电流,而线电压和相电压并不相等。由于电压反馈电路反馈回的电压为相电压,所以在进行有效值计算前,根据线电压的含义,我们对任意两个相电压数组求差,将差值存入另一个数组,则该数组中的值即为线电压。

线电压和电流有效值的计算可以由其均方根近似,具体公式如下:

U有效?120120i?20?Uii?20i (4.1)

I有效??Iii (4.2)

当然采样的点数越多,计算的电压和电流的均方根值越接近其有效值,但是,相应的A/D转换总次数也增加,会占用相当可观的执行时间;采用点数减小,虽然A/D转换的总时间减少,但由此计算的均方根值与有效值之间的偏差势必增大,因此,采用点数必须折中选取。该变频电源系统的采用点数定为20,根据实验,这样选取完全满足课题要求。 4.2.5 PID控制

PID控制属于闭环控制,是指将被控量的检测信号反馈,并与被控量的目标信号相比较,以判断是否已经达到预定的控制目标。如果尚未达到,则根据两者的差值进行调整,直到达到预定的控制目标为止。

PID控制分为比例控制(Proportional Control),积分控制(Integral Control)和微分控制(Differential Control)。从系统框图可以看出,稳压环节属于闭环控制系统,为了提高系统整体的性能,该系统采用了工程中常用的PID控制中的PI控制,具体地说,是增量式PI控制。采用增量PI既有利于加快系统的控制过程,又便于对系统进行实时控制,同时也提高了系统的可靠性。 其中,比例控制能迅速反映误差,从而减小误差,但是不能消除静态误差;为了消除静态误差,我们还必须采用积分控制,但是积分作用太强会使系统超调量过大,甚至出现振荡,因此积分常数的选取一定不能过大。

22

西安工业大学毕业设计(论文)

PID增量型控制算法流程如图4.6:

高线计算q0,q1,q2置

e(k-1)=e(k-2)=0

e(k-2)=e(k-1) e(k-2)=e(k) 将△u(k)输出给D/A D/A 将A/D结果赋给y(k) A/D 求e(k)=r(k)-y(k) 计算控制增量△u(k) 被控对象

N 采样时刻到 否?

Y

图4.6 PID增量型控制算法流程如图

PID参数选择:

以下是利用Matalb里的Simulink部件,构建的一个PID反馈控制方框图(如图4.7所示),其中比例常数Kp=20,积分常数Ki=5,微分常数Kd=0(PI控制)。输入正弦波与反馈一起经过PID控制模块,由硬件部分的PID仿真可知,即比例常数为20,积分常数为5的PI控制可以的到较好的稳幅效果。

23

西安工业大学毕业设计(论文)

图4.7 PID反馈控制方框图

其中,LC低通滤波器的传递函数的推导过程如下:

X(s)1Ls2Y(s)1/Cs

0

图4.8 LC低通滤波器的s域表示

图3.2.2为s域下LC低通滤波器的示意图,其中电感值为3mH,电容值为2uF(两个1uF的电容并联),该滤波器的传递函数为:

1H(s)?Y(s)X(s)?Cs1Cs?Ls?1LCs2?1?16?10?9s?12 (4.3)

24

西安工业大学毕业设计(论文)

图4.9 积分常数为5时Scope窗口输出的波形

当PI控制中的积分常数在5附近取时,Scope窗口的输出波形和图4.9差不多。 但是,当比例常数不变,积分常数增大到10时,由Scope窗口可以看出,PI控制将有产生震荡的趋势。如图4.10所示:

25

西安工业大学毕业设计(论文)

图4.10 积分常数为10时Scope输出的波形

因此,PI控制中积分常数的取值不宜大于10。

必须承认,用该方法得到的PI的参数只能提供一个粗略的参数范围。因为在实际仿真中,当比例常数和积分常数在一定范围内变化时,由MATLAB中的Scope窗口看到的输入与输出正弦波的吻合程度相差无几。图4.11为比例常数Kp=20,积分常数Ki=3,微分常数Kd=0时,由Scope窗口看到的波形。可以看出,此时单纯用软件没有办法判断PI参数取何值时PI控制效果最好。

26

西安工业大学毕业设计(论文)

图4.11 积分常数为3时Scope输出波形

因此,只能在硬件调试中,通过反复实验才能得到PI参数的最佳值。一开始,我在程序中把比例常数定为20,积分常数定为3,微分常数为0。此时,从LCD和示波器可以观察到,PID控制可以使输出线电压有效值较快的锁定在36.0V左右,但是输出线电压跳变较厉害。根据PID控制原理,可以知道产生该现象的原因是积分控制的作用偏小。于是,我逐渐把积分常数调大,电压跳变的幅度随之减小,但是当积分常数增大的同时,输出电压稳幅的响应速度也明显减慢。实验表明,PI参数应该折中选取。所以,我把PID参数最终定为比例常数Kp=20,积分常数Ki=5,微分常数Kd=0。

27

5 结论 5结论

本文设计的三相正弦波变频稳压电源以变频电源技术和开关电源技术为基础电路,以高性能XC164单片机为控制核心,组成数据处理和控制电路,在检测与控制软件支持下,通过对变频电源输出电压、输出电流进行数据采样、计算并与给定数据比较,从而调整变频电源的工作状态,同时配备有完善的保护电路。 以XC164单片机为核心设计的监控系统,对输出电压、输出电流进行采集与显示,并且对输出电压进行PID控制,使其稳定在36V;当输出电流过大(超过3.6A时),三相电流中任两相电流相差超过0.5A或是负载缺相时,单片机停止输出并进入保护状态(LCD上显示“Protect”);另外,通过键盘控制调节输出频率,可以使其在20Hz到100Hz内变化。

28

参考文献

参考文献

[1] 马小亮.大功率脚-交变频调速系统及其应用.武汉:华中理工大学出社,1992 [2] 李宏.电力电子设备用器件与集成电路应用指南[M].机械工业出版社,2001 [3] 刘志刚.电力电子学.清华大学出版社,2004

[4] 张燕宾.SPWM变频调速应用技术. 机械工业出版社,2005 [5] 杨旭,裴云庆,王兆安.开关电源技术.机械工业出版社,2004 [6] 薛弘晔.计算机控制技术.西安电子科技大学出版社,2003 [7] 李永平, 董欣.PSpice电路设计与实现 .国防工业出版社,2005

[8] 施阳.MATLAB语言精要及动态仿真工具SIMULINK.西北工业大学出版社, 1997 [9] XC164-16 Derivatives (User’Manual),2004

[10] 陆涵,胡磊,何湘宁等. 一种基于单片机的正弦波输出逆变电源的设计[J]. 电源技术

应用 , 2005,(10)

[11] 李玉玲,于长胜,魏华雄. 基于SPWM的变压变频电源设计[J]. 哈尔滨理工大学学报 ,

2005,(01)

[12] 陈晓明,羊彦,景占荣等.基于XC164单片机的智能化三相正弦波变频电源. 电源技术

应用,2003年09期

[13] 刘茂荣,郭佐,姚中元.三相PWM产生器,产生气SA8282 [14] Rashid M H.Power Electrnics.Prentice-Hall,Inc,1988

[15] GuichaoChao Hua,Fred C.Lee.Evauations of Switched-Mode Power Conversion

Technologies of IPEMC’94,Beijing

[16] 舒为亮,张昌盛,段善旭等. 逆变电源PI双环数字控制技术研究[J]. 电工电能新技术 ,

2005,(02)

[17] 孟庆云,吴瑕,耿士广等. 一种简单实用的车载正弦波逆变电源[J]. 电源技术应用 ,

2005,(05)

[18] 蔡黎,郑棐. 基于单片机的数字化交-交变频低频电源设计[J]. 仪器仪表用户,2006, (01)

[19] 张青,龚俊新,陈坚. 使用EPROM和D/A的新型逆变电源控制电路[J]电力电子技术 , 1994,(01)

29

致谢

致 谢

感谢王琪导师的关心、指导和教诲。论文从查阅资料,选题,理论研究到最后的毕业论文的撰写无不渗透着恩师的心血和汗水。王老师追求真理、献身科学、严以律己、宽已待人的崇高品质对我将是永远的鞭策。老师的教诲和关怀令我终生难忘。

我的毕业设计期间的工作自始至终都是在王老师全面、具体的指导下进行的。王老师渊博的学识、敏锐的思维、民主而严谨的作风,使学生收益匪浅,终生难忘。

在论文完成之际,特向王老师表示衷心的感谢和深深的敬意。 感谢我的学友和朋友们对我的关心和帮助。

30

毕业设计(论文)知识产权声明

毕业设计(论文)知识产权声明

本人完全了解西安工业大学有关保护知识产权的规定,即:本科学生在校攻读学士学位期间毕业设计(论文)工作的知识产权属于西安工业大学。本人保证毕业离校后,使用毕业设计(论文)工作成果或用毕业设计(论文)工作成果发表论文时署名单位仍然为西安工业大学。学校有权保留送交的毕业设计(论文)的原文或复印件,允许毕业设计(论文)被查阅和借阅;学校可以公布毕业设计(论文)的全部或部分内容,可以采用影印、缩印或其他复制手段保存毕业设计(论文)。

(保密的毕业设计(论文)在解密后应遵守此规定)

毕业设计(论文)作者签名:

指导教师签名: 日期:

31

毕业设计(论文)独创性声明

毕业设计(论文)独创性声明

秉承学校严谨的学风与优良的科学道德,本人声明所呈交的毕业设计(论文)是我个人在导师指导下进行的研究工作及取得的研究成果。尽我所知,除了文中特别加以标注和致谢的地方外,毕业设计(论文)中不包含其他人已经发表或撰写过的成果,不包含他人已申请学位或其他用途使用过的成果。与我一同工作的同志对本研究所做的任何贡献均已在论文中作了明确的说明并表示了致谢。

毕业设计(论文)与资料若有不实之处,本人承担一切相关责任。

毕业设计(论文)作者签名:

指导教师签名: 日期:

32

附录

附录

主程序:

//#pragma SRC //#pragma SMALL #include #include \#include \#include \.h\#define Key_s P3_P6 #define Key_up P3_P8 #define Key_down P3_P9 //PI参数 #define kp 20 #define ki 5

extern unsigned int vus[]; int e_b=0; bit bOutStatus=0; unsigned int frequency=20; unsigned int voltage=0; unsigned int current=0; unsigned int power=0; unsigned int current_u=0; unsigned int current_v=0; unsigned int current_w=0; unsigned long Dkey_time=0;

unsigned long Dd_time=0;

/*******************************************/ /* delay of time */ /*******************************************/ void DelayTime(unsigned long time) {unsigned long delay;

for(delay=0;delay

//delay time = (time * 175)ns

33

附录

/*************************************************/ int PI(int e) {

int result;

result=(int)(((long)e*ki+(long)e_b*kp)); e_b=e;

return result; }

void OutRefresh(void) {

DisplayNumber(2,0,frequency*10); DisplayNumber(14,0,voltage);

DisplayNumber(2,1,current); DisplayNumber(14,1,power); }

void StopRefresh(void)

{

DisplayNumber(2,0,frequency*10); }

void IniOutDisplay(void) { Clear();

DisplayStr(0,0,\ ///

DisplayNumber(2,0,frequency*10); DisplayStr(7,0,\

DisplayStr(12,0,\ DisplayNumber(14,0,voltage); DisplayOneChar(19,0,'V');

DisplayStr(0,1,\ ///

DisplayNumber(2,1,current); DisplayOneChar(7,1,'A');

DisplayStr(12,1,\ DisplayNumber(14,1,power); DisplayOneChar(19,1,'W');

34

/// /// /// /// /// /// /// 附录

DisplayStr(7,3,\}

void IniStopDisplay(void) { Clear();

DisplayStr(0,0,\ ///

DisplayNumber(2,0,frequency*10); /// DisplayStr(7,0,\ /// DisplayStr(12,0,\ DisplayNumber(14,0,0); DisplayOneChar(19,0,'V'); DisplayStr(0,1,\ /// DisplayNumber(2,1,0); ///

DisplayOneChar(7,1,'A'); /// DisplayStr(12,1,\ DisplayNumber(14,1,0); DisplayOneChar(19,1,'W'); DisplayStr(8,3,\}

/*******************************************/ /* main loop */ /*******************************************/

void main()

{

P1L=0xffbf; //initial P1L DP1L=0x007f; DP1H=0x0; // DP3_P6=0; // ODP3_P13=0;

// ALTSEL0P3_P9=0;

PSW_IEN=1; //enable interrupt // DP9_P5=1; // P9_P5=0; // DP9_P4=1; // P9_P4=0; SampleInt();

35

附录

DelayTime(2142857); //delay 0.2 second P1L_P6=1; //conect power DelayTime(5714285); //delay 1 second LCD_Init(); /// IniStopDisplay(); while(1) {

if((Dkey_time++)>=500000) {

Dkey_time=500000; //out control

if(bOutStatus==0) {

if(!Key_s) {

DelayTime(1000); //delay if(!Key_s) {

SetFrequency(frequency); SetAmp(32768); e_b=0; StartOut(); bOutStatus=1; IniOutDisplay(); Dkey_time=0; } } } else

{

if(Key_s==0) {

DelayTime(1000); if(Key_s==0) {

StopOut(); bOutStatus=0;

36

附录

IniStopDisplay(); Dkey_time=0; } } }

//frequency control

if(Key_up==0)

{

DelayTime(1000); if(Key_up==0)

{

if(frequency<100) {

frequency++;

SetFrequency(frequency); if(bOutStatus==1) OutRefresh(); else StopRefresh(); Dkey_time=0; } } }

else if(Key_down==0) {

DelayTime(1000); if(Key_down==0) {

if(frequency>20) {

frequency--;

SetFrequency(frequency);

if(bOutStatus==1) OutRefresh(); else StopRefresh(); Dkey_time=0; } } } }

37

附录

//AMP control if(bOutStatus) // {

if(bsg==0) {

voltage=(unsigned long)RMS(0)*130)/85);//OutRefresh();

StartSample(frequency); } // }

//DisplayRefresh if(bOutStatus) {

if(Dd_time++>100000) {

Dd_time=100001; if(!bsg)

{

Dd_time=0;

current_u=RMS(3)/4; current_v=RMS(4)/4; current_w=RMS(5)/4; current=current_u;

power=(unsigned

int)((current_u*(unsigned

long)voltage)/10);

OutRefresh(); } } } //

if(bOutStatus)

{

if((current_u<2)||(current_v<2)||(current_w<2)) {

if((current_u>3)||(current_v>3)||(current>3))

int)(((unsigned

AdjustAmp(PI(360-(int)voltage));

{

StopOut();

38

附录

P1L_P6=0;

bOutStatus=0; IniStopDisplay(); DisplayStr(8,3,\

}

}

if((((int)current_u-(int)current_v)>5)||(((int)current_u-(int)current_v)<-5)||(((int)cur

rent_v-(int)current_w)>5)||(((int)current_v-(int)current_w)<-5)) {

StopOut();

P1L_P6=0; bOutStatus=0; IniStopDisplay();

DisplayStr(8,3,\}

if((current_u>36)||(current_v>36)||(current_w>36)) {

StopOut();

P1L_P6=0;

bOutStatus=0; IniStopDisplay();

DisplayStr(8,3,\}

}

} }

XC164单片机的SPWM生成程序:

//#pragma SRC

#include

extern unsigned int const sintab[]; unsigned int SintabU=0; unsigned int SintabV=3333; unsigned int SintabW=6666; unsigned int *pSintab=sintab; unsigned int step=100;

unsigned int modulate=0xffff;

39

附录

unsigned int step_f=20; void StartOut(void) {

DP1L=0x007f;

ALTSEL0P1L=0x0000; CCU6_T12=0;

CCU6_T12PR=1999;

CCU6_T12MSEL=0x0333; //compare mode enable

CCU6_T12DTC=0x073f; //dead time enable,maxdeadtime=1.2us

CCU6_TCTR0=0x0080; //T12 center-aligned mode;input clock=fcc6 CCU6_TCTR2=0x0000; //signed shot is disabled

CCU6_TCTR4=0x0000; ////////////////////////////////controler

CCU6_CMPSTAT=0x2a00; //CCx output drives passive level while CC6xST is 0

//COUTx output drives passive level while CC6xST is 1

CCU6_MODCTR=0x803f; //Corresponding output os modulated by T12 PWM pattern

CCU6_TRPCTR=0xbf00; //TRAP pin enable;trap state exit on a T12 Zero-Match

CCU6_PSLR=0x00ff; //the passive state level which T12 outputs is 1

CCU6_ISR=0xffff; //clear the interrupt status CCU6_IEN=0x0040; //enable T12OM interrupt CCU6_T12IC=0x015f; //priority of T12PM is 7 CCU6_CC60SR=1000; //initial compare register CCU6_CC61SR=1000;

CCU6_CC62SR=1000;

CCU6_TCTR4=0x0040; //enable shadow tranfer CCU6_TCTR4=0x0002; //start T12 counting ALTSEL0P1L=0x00bf; }

void StopOut(void) {

CCU6_MODCTR=0x8000; //disable output CCU6_TCTR4=0x0505; //stop T12 and T13 CCU6_IEN=0x0000; //disable interrupt

40

附录

}

void SetFrequency(unsigned int frequency) { if(frequency>100)frequency=100; else if(frequency<20)frequency=20; step_f=frequency;

} void SetAmp(unsigned int amp)

{ modulate=amp;

}

void AdjustAmp(int damp) {

if(damp>0)

{

if((65535-modulate)

else if(damp<0)

{

if((-damp)>modulate) modulate=0; else modulate+=damp; }

}

void T12OMINT(void) interrupt 0x4d {

step=step_f;

//U

if(SintabU<5000) {

CCU6_CC60SR=1000+(unsigned long)(*(pSintab+SintabU))*modulate)/0xffff); } else {

CCU6_CC60SR=1000-(unsigned long)(*(pSintab+(SintabU-5000)))*modulate)/0xffff); }

41

int)(((unsigned

int)(((unsigned

附录

SintabU+=step;

if(SintabU>=10000) SintabU-=10000; //V

if(SintabV<5000) {

CCU6_CC61SR=1000+(unsigned long)(*(pSintab+SintabV))*modulate)/0xffff); } else {

CCU6_CC61SR=1000-(unsigned long)(*(pSintab+(SintabV-5000)))*modulate)/0xffff); }

SintabV+=step;

if(SintabV>=10000) SintabV-=10000; //W

if(SintabW<5000) {

CCU6_CC62SR=1000+(unsigned long)(*(pSintab+SintabW))*modulate)/0xffff); } else

{

CCU6_CC62SR=1000-(unsigned long)(*(pSintab+(SintabW-5000)))*modulate)/0xffff); }

SintabW+=step;

if(SintabW>=10000) SintabW-=10000;

//common

CCU6_TCTR4=0x0040; //enable shadow tranfer }

A/D转换程序:

ADC_CTR0_ADST=1; //start adc Delay4us();

vus[scount]=(ADC_DAT>>2)&0x03ff;

42

int)(((unsigned

int)(((unsigned int)(((unsigned int)(((unsigned 附录

ADC_CTR0&=0xfff0; //channel vv is selected ADC_CTR0|=VVCH;

ADC_CTR0_ADST=1; //start adc Delay4us();

vvs[scount]=(ADC_DAT>>2)&0x03ff;

ADC_CTR0&=0xfff0; //channel vw is selected ADC_CTR0|=VWCH;

ADC_CTR0_ADST=1; //start adc Delay4us();

vws[scount]=(ADC_DAT>>2)&0x03ff;

ADC_CTR0&=0xfff0; //channel iu is selected ADC_CTR0|=IUCH;

ADC_CTR0_ADST=1; //start adc Delay4us();

ius[scount]=(ADC_DAT>>2)&0x03ff;

ADC_CTR0&=0xfff0; //channel iv is selected ADC_CTR0|=IVCH;

ADC_CTR0_ADST=1; //start adc Delay4us();

ivs[scount]=(ADC_DAT>>2)&0x03ff;

ADC_CTR0&=0xfff0; //channel iw is selected ADC_CTR0|=IWCH;

ADC_CTR0_ADST=1; //start adc Delay4us();

iws[scount]=(ADC_DAT>>2)&0x03ff;

scount++;

if(scount>=SMOUNT) {

scount=0; bsg=0;

GPT12E_T3CON_T3R=0; //stop timer T3 } }

/****************************************************************/ //initial AD

void SampleInt(void) {

P5DIDIS=0xffff; //ADC initial

43

附录

ADC_CTR0=0x8210; //injection mode disable and no trigger input; fixed channel single conversion;

//wait for read enable;Calibration cycles are executed

ADC_CTR2=0x0040; //10bit resolution }

/*****************************************************************/ //caculate voltage between a phase to another phase

void Vp_p(unsigned int *pData1,unsigned int *pData2,int *pDatap_p) { unsigned char DataCount=SMOUNT; while(DataCount>0) {

*pDatap_p=(int)(*pData1)-(int)(*pData2); pData1++;pData2++;pDatap_p++; DataCount--; } }

/****************************************************************/ void StartSample(unsigned int frequency) {

//GPT1 initial

GPT12E_T3CON=0x0000;

GPT12E_T2CON=0x1027; //reload mode ,T3OTL trigger GPT12E_T2=0xffff-(5000000/(frequency*SMOUNT)); //an interrupr server per 1ms

GPT12E_T3=GPT12E_T2;

GPT12E_T3IC=0x0147; //enable interrupt T3 GPT12E_T3CON_T3R=1; //start timer T3 bsg=1; }

/****************************************************************/ unsigned int RMS(unsigned char channel) //caculate RMS {

unsigned long sum=0; unsigned char i=0; double result=0; int Data[SMOUNT];

switch(channel) {

case 0: Vp_p(vus,vvs,Data);

44

附录

break;

case 1: Vp_p(vvs,vws,Data); break;

case 2: Vp_p(vws,vus,Data); break; case 3:

{ for(i=0;i

sum=sum+(unsigned long)(ius[i]*ius[i]); } return (unsigned int)(sqrt((double)sum/SMOUNT)); }break; case 4:

{ for(i=0;i

sum=sum+(unsigned long)(ivs[i]*ivs[i]); } return (unsigned int)(sqrt((double)sum/SMOUNT)); }break; case 5:

{ for(i=0;i

sum=sum+(unsigned long)(iws[i]*iws[i]); } return (unsigned int)(sqrt((double)sum/SMOUNT)); }break; default:break; }

for(i=0;i

sum=sum+(unsigned long)((unsigned long)Data[i]*Data[i]); }

return (unsigned int)(sqrt((double)sum/SMOUNT)); }

45

本文来源:https://www.bwwdw.com/article/l5qw.html

Top