{
SINT; OINT; CINT;
*SCSR1=0X81FE; *WDCR=0X0E8;
*IMR=0X0000; *IFR=0X0FFFF; *IMR=0X0001; WSGR=0x00;
} main() {
disable(); initial();
pwminitial(); ADINIT(); enable();
*T1CON=*T1CON|0x0040; ADSOC(); while(1) {
while(p1>p0) {
D0=D0-10; *CMPR1=D0; }
while(p1 D0=D0+10; //符号扩展位有效 //累加器结果正常溢出 //B0被配置为数据存储空间 //系统控制和状态寄存器1,4倍频,最高频率40M //不使能看门狗 //中断标志寄存器,清除全部中断标志 //中断屏蔽寄存器,允许INT1中断 //禁止所有的等待状态 //禁止总中断 //系统初始化 //PWM初始化 //AD初始化子程序 //开总中断 //启动定时器1 //启动AD转换 16 *CMPR1=D0; } while(p1=p0) { D0=D0; *CMPR1=D0; } } } 系统在复位进行C语言环境配置,配置结束后进入由C语言编写的主程序,主程序首先进行系统的配置和初始化,主要包括CPU时钟内部采用4倍频(即40MHz)、各种外设的使能、中断配置等,其中程序和数据块存储区的定位在Command文件中完成。由EVB产生DC-AC的控制信号频率。 3.2 定时器中断子程序 中断服务程序适用于处理实时性要求较高的功能,如反馈电流的测取、同步电压的发生、各种实时运算、SPWM模式发生及脉冲输出等。另外,虽然直流侧输出电压是个慢变信号,但为了与实时控制有良好的对应性,直流电压采样也应置于中断服务程序中。 系统的SPWM波是通过DSP的脉宽调制电路产生的,借助于DSP的T1定时器和比较单元CMPR1来完成,根据产生对称波形的原理,T1工作在连续增/减计数模式。由T2定时器的周期中断触发A/D转换,A/D转换结束后,触发ADC中断。在中断服务程序中进行A/D结果的读取,对结果进行线性校正、数字滤波、有效值的计算等操作,并实时更新比较单元的值。此子程序主要完成A/D采样、查正弦表、产生SPWM波、直流与交流的PI控制等功能。 //AD初始化子程序 void ADINIT() { *T2CNT=0X0000; *T2CON=0X170C; *T2PR=64; //定时器计数寄存器,T2计数器清零 //T2为连续增计数模式,128分频,用内部时钟,320K //定时器周期寄存器 17 //设置T2的周期寄存器,采样频率5K *GPTCONA=0X400; //全局通用定时器控制寄存器A //T2周期中断标志触发AD转换 *EVAIFRA=0X0FFFF; *ADCTRL1=0X10; //EVA中断标志寄存器,清除EVA中断标志,写1清0 //ADC控制寄存器1 //采样时间窗口预定标位ACQPS3-ACQPS0为0 //转换时间预定标位CPS为0,AD为启动/停止模式 //排序器为级连工作方式,且禁止特殊的两种工作模式 *ADCTRL2=0X8404; //ADC控制寄存器1 //用EVB的一个事件信号触发AD转换,用中断模式1 *MAXCONV=0X01; //最大转换通道寄存器,2通道 //ADC输入通道排序控制寄存器,选择1,2通道 *CHSELSEQ1=0x10; } //PWM初始化子程序 int pwminitial() { *MCRA=*MCRC|0x001E; //I/O口复用控制寄存器PWM1-2,2路 *ACTRA=0X0006; *T1CON=0X1000; //比较方式控制寄存器 //定时器1连续增模式,1分频,频率40M //死区控制寄存器A,1.5us //PWM1,2 //定时器1的周期,频率20K //比较控制寄存器,使能比较操作 //清中断标志 *DBTCONA=0X0F28; *CMPR1=1000; *T1PR=2000; *COMCONA=0X8200; *EVAIFRA=*EVBIFRA|0X0001; *EVAIMRA=0X0001; } 具体的程序流程如图3-2所示: //允许定时器2的周期中断T2CONT 18 图3-2 SPWM产生中断服务程序 3.3 软件锁相环的设计 市电电压信号经频率检测,确定市电频率是否满足精度要求。考虑到我国电网实情,该值一般在50Hz左右。因此,可根据两次捕获中断的时间间隔来排除毛刺信号产生的捕获中断。其实在跟踪市电时并不需要太快,因为跟踪太快必然会影响输出波形,而且市电本身频率和相位就是变化的,跟踪太快就可能会影响输出的稳定性。 因此在进行调频和调相之前首先应根据合适的跟踪速度来确定跟踪的具体方案,大体上可以把调频和调相的方法分为两种,一种是调频和调相一起实现,调频的同时就实现了调相,这种方法通常跟踪速度较快,输出波形频率变化波动较大,而且需要根据具体的输入频率情况进行实时计算;另一种方法是调频和调相分开进行,首先实现输出和输入的频率一致同时也有一定程度的调相,然后再考虑调相,最终实现频率和相位的一致。前一种方法会影响所有基准表格数据的输出间隔,但保证一个完整的正弦波形;后一种方法在调整相位时可能会使输出波形有甚微的偏离正弦,但保证频率稳定。 19 本文采用后一种方法,大体思想是当检测到输入频率高于(低于)正常规定范围时,按照一定步长逐渐增大(减小)PWM周期计时器值,直到输出频率在允许范围内。同样,调节相位也是按照同样方式进行,当发现相位超前则调整查表顺序使输出滞后一定相位,反之使输出超前一定相位,这种方法可以计算出最大的锁相时间,所以就可以根据所要求的参数来确定最小相位调节幅度,并且最终锁相的稳态误差就是一个相位的基本调节单位。这种实现方法简单、直观、实现方便、稳态误差较小且可以控制。本文设计的SPLL,系统框图如图3-3所示。 图3-3 SPLL程序流程图 从图3-3中看到,第一步首先判断频率是否超限,如果超限则输出稳定的正弦波。第二步根据所得到的误差大小,采取相应的措施调整下一个周期计数器值。当频率满足要求以后,第三步就可以进行调相,如前所述在本文软件设计中,基准是一个正弦表格,因此 20