数字锁相环 逆变器 程序.doc_第1页
数字锁相环 逆变器 程序.doc_第2页
数字锁相环 逆变器 程序.doc_第3页
数字锁相环 逆变器 程序.doc_第4页
数字锁相环 逆变器 程序.doc_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/DSPIC30F2010 单相逆变 带 数字锁相环 程序#include /中断优先级还没设置,先 t2,t1,spwm,其他#include #include #include lcd.h#define _T1ON T1CONbits.TON#define _T2ON T2CONbits.TON_FOSC(CSW_FSCM_OFF & XT_PLL8);_FWDT(WDT_OFF);_FBORPOR( RST_PWMPIN& PWMxH_ACT_HI& PWMxL_ACT_HI&PBOR_OFF & MCLR_EN);_FGS(CODE_PROT_OFF);void IC2_INI(void);void T2_INI(void);void PWM_INI(void);void AD_INI(void);void T1_INI(void);void PWM_CAL(unsigned int ,unsigned int k,unsigned int a );void IOUT_PROTECT(void);void US_PROTECT(void);void PROTECT_RE(void);void PID_CAL(void);void smooth_test(unsigned int ,unsigned int );void smooth_3_test(unsigned int a,unsigned int b,unsigned int c);unsigned int IC2_0,IC2_1;/捕捉周期用,前后相减unsigned long CAP_T,CAP_T_0;/捕捉得到的周期,不过有分频,记得3unsigned int CAP_N,PWM_N,AD_N,T1_N;unsigned int AD0,AD1;/ADCBUF的结果读到这里来,采样满64次后,转存并清空,记得清空unsigned int UD,US,AD_N_200,AD_N_50;/AD转存的数据,供外部计算用,64次计数到位unsigned int AD2,AD3,IOUT,UO;/正弦波采样采用均方根的方法要用32位变量来存,ad结果和转存数unsigned int Kp,Ki,Ud0,Ud1,Us0,Us1;/pid环节数,和2次处理的采样电压数据unsigned int UD_10,US_10,IOUT_10,UO_10;/采样结果,转换为10位的有效值,unsigned int RE_DELAY;/保护后延迟计数,计数1时,等于一个周波50个约1sunsigned char PROTECT_FLAG;/保护标志位unsigned int io_10_0,io_10_1,io_10_2,io_10_max_temp,io_10_max,smooth_fail_n;/电流采样的全局变量 const unsigned int d1100=/090度份100份的正弦 515 ,1544 ,2573 ,3601 ,4629 ,5655 ,6680 ,7703 ,8724 ,9743 ,10760 ,11774 ,12785 ,13793 ,14798 ,15799 ,16796 ,17789 ,18778 ,19762 ,20741 ,21715 ,22683 ,23646 ,24603 ,25554 ,26499 ,27437 ,28369 ,29293 ,30210 ,31120 ,32022 ,32916 ,33803 ,34680 ,35549 ,36410 ,37261 ,38103 ,38936 ,39760 ,40573 ,41376 ,42170 ,42952 ,43724 ,44486 ,45236 ,45976 ,46703 ,47420 ,48125 ,48817 ,49498 ,50167 ,50823 ,51467 ,52097 ,52716 ,53321 ,53913 ,54491 ,55056 ,55608 ,56146 ,56670 ,57180 ,57676 ,58158 ,58625 ,59078 ,59516 ,59940 ,60349 ,60742 ,61121 ,61485 ,61834 ,62167 ,62486 ,62788 ,63075 ,63347 ,63603 ,63843 ,64068 ,64277 ,64470 ,64647 ,64808 ,64953 ,65082 ,65195 ,65292 ,65372 ,65437 ,65485 ,65518 ,65534 , ; unsigned int PWM_N,k,a;/n=当前在的段的位置,k映射到099的查表位置,a变比后期主要控制这个 unsigned long temp;/*/主程序/*int main(void)LCD_Init();LCD_WRITE_8BIT(LINE1,CMD); DISP_10(78); PWM_INI(); AD_INI(); T1_INI();/ T2_INI();/ _T2ON=1; / IC2_INI();/ _IC2IE=1; _T1ON=1; _T1IE=1; _ADON=1; _ADIF=0; _ADIE=1; a=32768;/while(_IC2IF=0)/过零点时启动pwm _PTEN=1; _PWMIE=1; _PWMIP=7; Ki=60; Kp=7; IOUT_10=1;while(1)LCD_WRITE_8BIT(LINE1,CMD); DISP_10(IOUT_10);DISP_10(UD_10);nop;delay1ms(200);/*/捕捉初始化程序,IC1 IC2/*void IC2_INI(void) _TRISD1=1;/IC2CON IC2CONbits.ICSIDL=0; /空闲运行 IC2CONbits.ICTMR=1; /1=采样tmr2,0=采样tmr3 IC2CONbits.ICI=0B00; /每1次捕捉中断 /IC2CONbits.ICOV /只读,溢出 /IC2CONbits.ICBNE /只读,缓冲器非空 IC2CONbits.ICM=0B011; /每一个上升沿捕捉一次 /000=关闭捕捉 _IC2IF=0; _IC2IE=0; /*/T2初始化,为ic2提供时基/* void T2_INI(void) T2CONbits.TON=0; /设置前关闭 T2CONbits.TSIDL=0; /空闲运行 T2CONbits.TGATE=0; /门控计数禁止 T2CONbits.TCKPS=0B01; /1:8 T2CONbits.T32=0; /禁止32位计数 T2CONbits.TCS=0; /内部时钟源 TMR2=0; /初始化计数值 PR2=49999; /周期满,就是不周期 T2CONbits.TON=0; /定时器工作_T2IF=0; _T2IE=0;/*/IC2捕捉中断程序,锁频锁相用;入口参数IC2BUF,出口参数PTPER,PWM_N/*void _attribute_ (interrupt) _IC2Interrupt(void) _IC2IF=0; PWM_N=200; /实现锁相 IC2_0=IC2_1; IC2_1=IC2BUF; CAP_T_0=CAP_T; if(IC2_0IC2_1)CAP_T=(long)IC2_1+50000-IC2_0; else CAP_T=(long)IC2_1+100000-IC2_0; if(CAP_TCAP_T_0-64) return; PTPER=(CAP_T3)/400-1; /重新设置pwm周期,实现锁频/ PWM_N=200; /实现锁相PR1=(CAP_T3)/200-1; /定时器1 ,1:1分频,一个周期分为64份,为ad提供出发时间/这里把PR1的结果多减去几个,这样一个周期完成,使得定时器的时间多点,/要是少了就麻烦,采样次数会少一个,这样对电流采样是要守相位的很不利,/于是把它减小几个,这样在pwm_n=0是,定时器会多点时间,把时间清掉,就可以保证相位了。必须保证最大值在相位区间内/结果在pwm中断中开始相位补偿,这里就不补了,要不然这个数不好确定CAP_N+;if(CAP_N=64)CAP_N=0;return; /*void _attribute_ (interrupt) _PWMInterrupt(void)/*_PWMIF=0; /_PWMIF=0;/*if(PWM_N=0)/把t1 的ad时间清理,保住采样相位,对才交流有效,这里进行相位补偿,多减少加/无论这里pwm_N=多少,都没关系,只要一个周期进行一次时间补偿就行了。if(TMR11) TMR1=0;else TMR1=PR1-10;*/if(PWM_N100)k=PWM_N;PWM_CAL(PWM_N,k,a);else if(PWM_N200)k=200-PWM_N-1;PWM_CAL(PWM_N,k,a);else if(PWM_N300)k=PWM_N-200;/负数的PWM_CAL(PWM_N,k,a);else if(PWM_N17;unsigned long a_sin,temppdc;/a_sin=a*_sin,temppdc=PTPER*tempd;_sin=d1k;/PDC1=PTPER*(1+-a*_sin)/*17;/移动后是15位 *17tempd=a_sin;/结果存起来if(n15;/结果16得到16位要的结果 *15 (*扩大和缩小移位刚好全抵消*)。PDC1=temppdc-1;/结果赋给寄存器/tmd的,两个(a、b)16位相乘 结果还是16位,应该这样,/一个(c)32位,先把16位数赋给32位,然后32位乘16位,/结果为32位,不管内部怎么乘的,这个结果没有益处,就会正确。/*void PWM_INI(void)/*/ I/O_TRISE0=0;_TRISE1=0;_RE0=0;_RE1=0;/PTCON=0;_PTEN=0;/后面来使能_PTSIDL=0;/空闲运行_PTOPS=0B000;/后分频1:1_PTCKPS=0B00;/输入时钟分频1:1_PTMOD=0B00;/自由模式/PTMR=0;_PTDIR=0;/向上计数PTMR=0;/从0开始计数,以后开始时要设置/PTPER=1199;/pwm周期/PWMCON1=0X00FF;_PMOD1=0;/pwm1互补模式输出_PMOD2=0;_PMOD3=0;_PEN1L=1;/使能pwm1H、L的输出_PEN1H=1;_PEN2L=0;_PEN2H=0;_PEN3L=0;_PEN3H=0;/PWMCON2=0;_SEVOPS=0B0000;/特殊事件分频/_IUE=0;此为无/0=对PDC的更新与pwm时基同步,1=立即更新,对于spwm要注意/与OVDCON有关_OSYNC=1;/输改写与pwm基时同步_UDIS=0;/使能占空比和周期寄存器更新/DTCON1=0;_DTAPS=0B00;/死区分频1:1_DTA=6;/死区时间8*40um/ DTCON2在这个芯片中没有/FLTACON=0;/故障A、B输入引脚,这里禁止SEVTCMP=0;/特殊事件比较,不管/OVDCON=0XFF00;/默认这个值,高位为1,输出pwm/ INT_PWMIF=0;_PWMIE=0;_PTEN=0;/*/ADC初始化,四通道,同时采样,顺序转换,触发信号,由T1给,其他自动工作/*void AD_INI(void) _TRISB0=1; _TRISB3=1; _TRISB4=1; _TRISB5=1;/adcon1 _ADON=0; _ADSIDL=0; _FORM=0; _SSRC=0B111; /自动采样,结束采样位,开始转换 _SIMSAM=1; _ASAM=0; /自动采样 _SAMP=0; /开始采样 /_DONE/ADCON2 _VCFG=0B000; _CSCNA=0; ADCON2bits.CHPS=0B10; /_BUFS _SMPI=0; /中断次数 _BUFM=0; _ALTS=0;/ADCON3 _SAMC=1; _ADRC=0; _ADCS=7;/ADCHS _CH0NA=0; /NA=负 _CH123NA=0; _CH0SA=0; /SA=正 _CH123SA=1; /0=012;1=345/ADPCFG ADPCFG=0B1111111111000000;/ADSSL 扫描输入引脚 void AD_INI0(void)/配置ad模块_TRISB0=1; /1.21配置i/o_TRISB3=1;_TRISB4=1;_TRISB5=1;/1.22配置参考电压/2ad的中断设置_ADIF=0;_ADIE=0;/(*这里注意下*)/3启动ad 开始采样_ADON=0;/(*这里注意下*)/ADCON1_FORM=0B00;/采样整数_SSRC=0B111;/000=手动触发采样;111=自动转换_SIMSAM=1;/CHPS中各路同时采样(与顺序采样相反)_ASAM=0;/手动控制采样位/_SAMP=采样使能位,控制用,这里不设置/_DONE/ADCON2_VCFG=0B000;/采样电平为vccvdd 。_CSCNA=0;/CH0+ 不扫描输入,如果扫描输入就只能 用ch0, 会忽略CH123.这要置0_CHPS=0B10;/选择通道使用位 0 1 2 3/_BUFS/BUFM=1时有效,这里无视_SMPI=0;/完成4次转换/采样产生中断_BUFM=0;/使用字格式BUF_ALTS=0;/使用mux a/ADCON3_SAMC=1;/自动采样时间位1Tad_ADRC=0;/时钟源由系统产生_ADCS=7;/对应与24mpis,这个最小的就是这个,/2*154*24/1000-1=6.6 取_ADCS=7/ADCHS_CH0SA=0;/ch0 采样an0_CH123SA=1;/0=ch123采样an012,1=345_CH0NA=0;/ch0负通道选vref-_CH123NA=0;/ch123负通道vref-/*_CH0SB=0;_CH123SB=0;_CH0NB=0;_CH123NB=0;*/mux b 的通道不用管他 没用到/ADPCFG 数字模拟选择位ADPCFG=0XFF00;/1数字 0 模拟,低4个位数字模拟/_PCFG0_PCFG3=0, 其他=1/ADCSSL 扫描选择位CH0的扫描,因为用了 四路采样,这个启动只能用一路ch0,所以应关掉。ADCSSL=0;/扫描低四位/_CSSL0_CSSL3=1, 其他=0/*/T1初始化,为ad提供时间/*void T1_INI(void) / T1CON=(T1_OFF & T1_IDLE_CON & T1_GATE_OFF & T1_PS_1_1 & / T1_SYNC_EXT_OFF & T1_SOURCE_INT);T1CONbits.TON=0;T1CONbits.TSIDL=0;T1CONbits.TGATE=0;T1CONbits.TCKPS=0B00;/1:1分频T1CONbits.TSYNC=0;T1CONbits.TCS=0;/内部时钟 TMR1=0; PR1=2400; /周期时间在 捕捉时已经给定了。/ T1CONbits.TON=1; /中断开始 _T1IF=0; /中断标志位 允许位 _T1IE=0;/*/T1中断,中断时 启动 ad采样,然后退出,接着就等待ad的中断/*void _attribute_ (interrupt) _T1Interrupt (void) /函数名前面是一个_不是2个IFS0bits.T1IF=0;T1_N+;if(T1_N=200)T1_N=0;_SAMP=1;/*/ADC中断,把所有采样值累加起来,最后求平均,这样会容易点,效果如何,知道了再告诉你、/*void _attribute_ (interrupt) _ADCInterrupt (void)_ADIF=0;AD_N+;AD0=AD0+ADCBUF0;/udAD2=AD2+ADCBUF2;/usAD1=ADCBUF1;/ioAD3=ADCBUF3;/uo/电流if(PWM_N=10 | PWM_N=11 | PWM_N=12)smooth_fail_n=0;io_10_max_temp=0;io_10_max=0;/如果要与前一次最大值比较,这里要先存变量值io_10_0=io_10_1;io_10_1=i

温馨提示

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

评论

0/150

提交评论