|
楼主 |
发表于 2018-8-3 22:16:34
|
显示全部楼层
本帖最后由 异客 于 2018-8-3 22:33 编辑
上传SPWM程序,因硬件资源不够,所以程序中将正弦波表,分成2段进行操作,希望对有兴趣的朋友可以起到借鉴作用
图中是经LC滤波之后的正弦波,L=1mH,C=2uF,前天打框架,昨晚干到3点,今天搞了一天,终于搞定了,可以看到,过零点很完美,无任何畸变,下一步将在程序中增加输出电压电流PID双闭环,并实现电源网老寿大神的软压缩功能,鄙视电源网那些只炫成品,具体实现过程含糊其辞的人!楼主以前请教那些人,得到的答复都是打哈哈!
- #include <pic.h>
- unsigned int pwmi;
- bit spwm0,spwm1,spwm2,spwm3,pulse,pulse1,pulse2
- unsigned char data1[55]=0;
- bank1 unsigned char data2[29]=0;
- const unsigned char sindata[84]={
- 0,0,8,13,17,22,26,30,35,39,43,48,52,56,60,64,69,73,77,81,85,89,93,97,
- 101,105,109,112,116,120,124,127,131,134,138,141,145,148,152,155,158,
- 161,164,167,170,173,176,179,181,184,187,189,192,194,196,198,201,203,
- 205,207,209,210,212,214,215,217,218,220,221,222,223,224,225,226,227,
- 227,228,229,229,229,230,230,230,230
- };//正弦表
- for(j=1;j<=54;j++)
- {
-
- data1[j]=sindata[j];
- }
- for(j=0;j<=28;j++)
- {
- data2[j]=sindata[j+55];
-
- }
- void delay(unsigned int u_sec)
- {
- unsigned int dei;
- unsigned char ii;
- for(dei=0;dei<=u_sec;dei++)
- {
- for(ii=0;ii<=254;ii++);
- }
- }
- void PCPWM_init(void)
- {
-
- TRISB=0b01000001;
- PR2=0xF0;
- P1M0=0;
- P1M1=1;//
- CCP1M0=0;
- CCP1M1=0;
- CCP1M2=1;
- CCP1M3=1;
- CCPR1L=0;
- DC1B0=0;
- DC1B1=1;
- ECCPASE=1;
- //PWM1CON=0b00000011;
- PWM1CON=0b00000101;
- ECCPAS=0b00000000;
- TMR2IF=0;
- T2CON=0b00000100;
- TMR2ON=1;
- }
- void interrupt_init(void)
- {
- RBIF=0;
- INTF=0;
- T0IF=0;
- RBIE=0;
- INTE=0;
- T0IE=0;
- ADIE=1;
- TMR2IE=1;
- TMR1IE=0;
- CCP1IE=0;
- PEIE=1;
- RBIE=0;
- }
- static void interrupt isr(void)
- {
- if(pulse1)
- {
- RB1=!ECCPASE;
- }
- else
- {
- RB1=0;
- }
- if(pulse2)
- {
- RB2=!ECCPASE;
- }
- else
- {
- RB2=0;
- }
- if((pwmi>=1) && (pwmi<165))
- {
- pulse1 = 1;
- }
- else
- {
- pulse1 = 0;
- }
- if((pwmi>=167) && (pwmi<331))
- {
- pulse2 = 1;
- }
- else
- {
- pulse2 = 0;
- }
- TMR2IF=0
-
- if(pwmi>=332)
- {
-
- pwmi=0;
-
- }
- if(pwmi<83)
- {
- spwm0=1;
- spwm1=spwm2=spwm3=0;
-
- }
- else if(pwmi<166)
- {
- spwm1=1;
- spwm0=spwm2=spwm3=0;
-
- }
- else if(pwmi<249)
- {
- spwm2=1;
- spwm0=spwm1=spwm3=0;
-
- }
- else
- {
- spwm0=spwm1=spwm2=0;
- spwm3=1;
-
- }
-
- if(spwm0)
- {
- if(pwmi<=54)
- {
- CCPR1L=data1[pwmi];
- }
- else
- {
- CCPR1L=data2[pwmi-55];
- }
- }
- else if(spwm1)
- {
- if(pwmi>111)//83+28=111
- {
- CCPR1L=data1[166-pwmi];
- }
- else
- {
- CCPR1L=data2[111-pwmi];
- }
- }
-
- else if(spwm2)
- {
-
- if(pwmi<220)//166+54=220
- {
- CCPR1L=PR2-data1[pwmi-166];
- }
- else
- {
- CCPR1L=PR2-data2[pwmi-220];
- }
- }
- else if(spwm3)
- {
-
- if(pwmi>277)
- {
- CCPR1L=PR2-data1[331-pwmi];
- }
- else
- {
- CCPR1L=PR2-data2[277-pwmi];
- }
- }
- pwmi++;
-
- }
- }
复制代码 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|