DSP综合实验报告
- 格式:doc
- 大小:131.00 KB
- 文档页数:7
基于DSP的三段式电流保护综合实验基于DSP的三段式电流保护一、实验目的:1.通过DSP程序的设计模拟继电保护跳闸实验,进一步了解DSP在继电保护中的应用。
2.理论与实践相结合,强化学生的工程实际能力。
3.通过具体电路的设计和调试,加深对电力系统微机保护整个流程的理解,锻炼运用常用算法编程解决问题的能力。
4.通过实验线路的设计,计算及实际操作,使理论与实践相结合,增加感性认识,使书本中的知识更加巩固。
培养动手能力,增强对DSP运用的能力,培养分析查找故障的能力。
二、硬件电路:2·1实验设备DSP板、仿真器、直流电源、吸锡器、电烙铁、万用表,示波器、调压器、灯泡、螺丝刀、导线若干2·2 DSP芯片F2812介绍DSP2812功能比单片机强大的多,TMS320F2812 是美国TI 公司推出的C2000 平台上的定点32 位DSP 芯片,适合用于工业控制,电机控制等,用途广泛,应该相当于单片的升级版。
运行时钟也快可达150MHz,处理性能可达150MIPS,每条指令周期6.67ns。
IO口丰富,对用户一般的应用来说足够了。
两个串口。
具有12位的0~3.3v的AD转换等。
具有片内128k×16位的片内FLASH,18K ×16 位的SRAM,一般的应用系统可以不要外扩存储器。
(1).ADC编程TMS320F2812带有两个8选1多路切换器和双采样/保持器的12位ADC,模拟量输入范围为 0~3V,最快转换速率为80ns,选用10kSPS采样率,并采用EVA 的定时器(0.1ms)自动触发方式,可同时采样4个通道,并采用每次转换结束的中断方式来纪录采样结果(右移4位)。
转换结果=(212-1)×(输入的模拟信号-ADCLO)/3 ADC转换时,首先初始化DSP系统,然后设置PIE中断矢量表,再初始化ADC模块,接着将ADC中断的入口地址装入中断矢量表并开中断,然后再启动0.1ms定时器,同时等待ADC中断,最后在ADC中断中读取ADC转换结果,并用软件启动下一次中断。
(2).脉波宽度调变(PWM)PWM的功能包括:拥有宽广可程序的Dead-time长度;PWM载波频率实时的改变;PWM脉波宽度实时的改变可以透过程序来产生非对称、对称及空间向量PWM信号;提供外部保护接脚PDPINTx来保护功率级板,当这个接脚为地时,PWM信号将会强制变为高阻抗.其动作流程大致为:比较器的值(CMPRx)进来与T1CON所设定的对称或非对称之波形比较,然后产生方波PHx输出进入死区时间产生电路产生出两个有死区时间的信号,再透过输出逻辑电路来设定每个PWM的输出逻辑,如此就可产生所需要的PWM信号。
2·3硬件电路图三、分析与计算:主电路由电流互感器、电压互感器、微型继电器、和部分电阻组成。
交流采样模块(+-12V双电源供电)信号处理电路有4个运算放大器、两个电位器、一个104独石电容和部分电阻组成。
从电压互感器出来的信号,首先经过运放D,进行反相偏置处理,然后经过运放C,它是个一阶有源滤波。
运发B 的作用是对前两级的信号进行放大,使信号更适合DSP的要求,最后运放A是个跟随器,其作用是减小对信号源的影响,因为理想运放的输入电阻无穷大。
1. 交流采样结果用示波器观察得到的波形,基本上和计算值相符,不大于3.3V,不小于2V 2. 模拟继电保护动作结果1)输入电压小于80V不动作,数码管显示当前输入电压,模拟电路正常工作; 2)输入电压大于160V时立即跳闸,数码管显示当前电压值,模拟电流速断; 3)输入电压小于160V且大于120V时,数码管显示当前输入电压,经过3秒的延时后跳闸,数码管显示当前电压值,模拟电流二段;4)输入电压小于120V且大于80V时,数码管显示当前输入电压,经过5秒的延时后跳闸,数码管显示当前电压值,模拟电流三段;四、软件流程:五、软件代码:#include "DSP281x_Device.h" #include "DSP281x_Examples.h";interrupt void adc_isr(void);void output(int m,int n);void disp(int d);Uint16 LoopCount;Uint16 ConversionCount;Uint16 Voltage1[240];Uint16 Voltage2[240];Uint16 Power_voltage;Uint16 c; Uint16 d; Uint16 e; Uint16 f;main() {InitSysCtrl();//初始化cpu DINT;//关中断InitPieCtrl();//初始化pie寄存器 IER = 0x0000;//禁止所有的中断 IFR = 0x0000;InitPieVectTable;//初始化pie中断向量表EALLOW;PieVectTable.ADCINT = &adc_isr;EDIS;AdcRegs.ADCTRL1.bit.RESET = 1;asm(" RPT #10 || NOP");AdcRegs.ADCTRL3.all = 0x00C8;AdcRegs.ADCTRL3.bit.ADCBGRFDN = 0x3;AdcRegs.ADCTRL3.bit.ADCPWDN = 1;PieCtrlRegs.PIEIER1.bit.INTx6 = 1;IER |= M_INT1; EINT; ERTM;EALLOW; //初始化GPIOGpioMuxRegs.GPAMUX.all=0x0000;GpioMuxRegs.GPADIR.all=0xFFFF;EDIS;GpioDataRegs.GPADAT.bit.GPIOA0=0; LoopCount = 0;ConversionCount = 0;c=0; d=0; e=0; f=0;AdcRegs.ADCMAXCONV.all = 0x0001; //设置AD转换的通道AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;AdcRegs.ADCCHSELSEQ1.bit.CONV01= 0x1;AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1 = 1;AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;EvaRegs.T1PR = 0x186A; //设置PWM的周期 EvaRegs.GPTCONA.bit.T1TOADC = 2;//选择周期中断 EvaRegs.T1CON.all = 0x1042; //设置寄存器 while(1) //等待中断 {LoopCount++; }interrupt void adc_isr(void) //AD中断子函数 {Voltage1[ConversionCount] =AdcRegs.ADCRESULT0 >>4; //结果存放在数组中Voltage2[ConversionCount] =AdcRegs.ADCRESULT1 >>4;if(ConversionCount == 239) //取采样后的最大值 {int i;for(i=0;i<240;i++) { if(Voltage1[0]tiaozha(); //调用跳闸子函数 ConversionCount = 0; }else ConversionCount++;AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; //复位等待下次中断AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; return; }oid tiaozha(void) //跳闸子函数 {int a=0,b=0,i; e++;if(f disp(f); //调用显示子函数 f=0; }if( Power_voltage>2800) //一段的判据 {GpioDataRegs.GPADAT.bit.GPIOA0=1; while(1) { output(1,3); output(11,2); output(11,1); output(10,0); for(i=0;i<0xffff;i++) {} } } else if(Power_voltage>2200 DSP三段式保护综合实验设计_文档下载/b-f6345c21bd64783e09122b9b-8.html ) //二段的判据 { a=1; }else if(Power_voltage>1600) //三段的判据 { b=1; } else GpioDataRegs.GPADAT.bit.GPIOA0=0;if(a==1) c++; if(b==1) d++;for(i=0;i<0xffff;i++)if(c==10) //二段的延 { GpioDataRegs.GPADAT.bit.GPIOA0=1;c=0; d=0; while(1) { output(2,3); output(11,2); output(11,1);output(10,0);for(i=0;i<0xffff;i++)f(d==20) //三段的延时 { GpioDataRegs.GPADAT.bit.GPIOA0=1; c=0; d=0; while(1) { output(3,3); output(11,2) output(11,1); output(10,0); for(i=0;i<0xffff;i++) {} } } return; }void disp(int d) //显示子程序 { float a; int x,i=0,b[3]; if(d<1964) d=1964; a=(d-1964)*235.0/1436; //换算公式 x=a*10; //取百、十、个、小数位各位数字,存入数组 b[i]=x/1000;i++; b[i]=x/100%10; i++;b[i]=x/10%10; i++; b[i]=x-x/10*10; output(b[3],3); //按位输出output(b[2],2); output(b[1],1); output(b[0],0); }void output(int m,int n) //显示输出子程序 { int b,i;switch(m) //查询数码表{ case 0:b=63;break; case 1:b=6 ;break; case 2:b=91;break; case 3:b=79;break; case 4:b=102;break; case 5:b=109;break; case 6:b=125;break; case 7:b=7;break; case 8:b=127;break; case 9:b=111;break; case 10:b=115;break; case 11:b=64;break; }if(n==2&&m<10) b=b+128;GpioDataRegs.GPADAT.bit.GPIOA1=1; for(i=7;i>=0;i--) //发送数据 { GpioDataRegs.GPADAT.bit.GPIOA2=b>>i&1;GpioDataRegs.GPADAT.bit.GPIOA1=0;GpioDataRegs.GPADAT.bit.GPIOA1=1; } }//取每一位的数值。