Hvordan løser disse hakk i sinus bølge

  • Thread starter praveen_palaparthi
  • Start date
P

praveen_palaparthi

Guest
Hei Jeg arbeider på sinus bølge UPS.I har skrevet kode til å generere sinus bølge men har noen hakk hvordan du fjerner disse og få ren sinus bølge.Foreslå meg om å endre min logikk.
Beklager, men du må logge inn for å vise dette vedlegget

 
Green colur bølgeform er utdataene spenning og gul farge er sensing spenning til kontrolleren for å styre produksjonen spenning .............

 
Jeg beklager her logikken.

Jeg har delt en halvdel syklus av sinus bølge i 36 intervaller og lagres verdiene i en array.I intialised tidtakeren-0 slik at for hver 278 mikro andre jeg vil oppdatere Driftssyklus ved å ta verdien av sinus table.How Jeg fikk 278 mikro andre ... ok jeg har tatt bare halvparten syklus slik periode er 10
mill. andre delt på 36 fikk jeg 278 oss.dette er åpent loop her jeg får ren sinus bølge uten hakk.
and then i am calculating the error=ref-output
.THen this error is passed through PI euqation then i am sending the corrected duty cycle to registers.

Men når sensing det ut settes spenning punkt etter punkt betyr at hver 278 mikro sec jeg korrigere Driftssyklus bruke PI equation.I am få støy som vist i figure.First jeg måle effekt spenning bruker ADC som Jeg har DC off satt i sensing spenning i sensing spenningen forskjøvet til 2.5 volt fra opprinnelse som vist i gul farge bølgeform så jeg substrating denne DC offset fra målt utgang spenning som utsendes spenning = målt-500
og jeg beregne feil = ref - utgang.
Da denne feilen er passert PI euqation da jeg sender korrigert Driftssyklus å registre.

her en pseudo-koden for korrigere Driftssyklus denne koden kjøres for hver 278 mikro sekund.sine_value = sine_table [sine_table_count];ref_voltage = sine_value;out_voltage_1 = out_voltage-500;if (Half_cycle_count)(out_voltage_1 = ~ out_voltage_1;out_voltage_1 = out_voltage_1 1;)x = ref_voltage-out_voltage_1;z1 = ki * x;z = z1>> 10;y = yold (KP * (x-xold)) z;Duty_cycle = y>> 6;if (Duty_cycle <0)(Duty_cycle = ~ Duty_cycle;Duty_cycle = Duty_cycle 1;)if (Duty_cycle> 0x1F4)Duty_cycle = 0x1F0;xold = x;yold = y;

Dette er hva jeg gjør og får støy kan du foreslå meg er det noen logikk å rette Driftssyklus å opprettholde konstant volatge / -10 volt til 230 volt.
Beklager, men du må logge inn for å vise dette vedlegget

 
OK, ser ut til å være hovedsakelig et problem med kontrolleren design.

Det
er et grunnleggende problem med null krysset discontinuity i kontrolleren.Anta PI utgang gir et riktig Driftssyklus før null krysset, men har en ikke-null Jeg signal.Fordi du invertere utdatafilen spenning enn sinus bord på null krysset,
vil jeg signalet har startwebadressen verdien av feil polaritet etter null krysset.Dette medfører en Driftssyklus skritt som er eliminert i en oscillating kontrolleren respons over flere kontroller prøvetaking intervalls.Som en ekstra problemet, hvis PI utgang skal mette på null (knyttet til selve polariteten),
er det å produsere en positiv effekt i stedet.Du bør bruke half_cycle informasjon i stedet for å invertere negative duty_cycle verdier.

Det kan være tilfelle, at en liten offset i produksjonen spenning måling som forårsaker problemet, så det kan minimeres ved å justere vilkårlig oppveid av 500.Men innerst inne,
er det galt å invertere PI kontrolleren polariteten på hver en halv syklus.Minst, bør du tilbakestille integral signal på null krysset, hvis du gjør det på den måten.

Du rapportert at åpen sløyfe bølgeform er ganske god.Så jeg lurer på, hvis det
er nødvendig å korrigere momentant output spenning.Vil du kanskje bruke en treg kontrolleren for RMS output stedet.

 
Sir jeg har gitt deg bare utdataene korreksjon del ok jeg vil sette fullstendig code fortelle meg hvor logikken går wrong.I putting bare sinusformet PWM generasjon med lukket sløyfe kan du hjelpe meg å utvikle logikken.
Dette er tidtaker-0 rutine som genererer sinuoidal PWM Jeg har ikke nevnt intialisation del.void interruupt ACDC (void)(if (TOIF)(
T0IF = 0;T0CS = 0; / / konfigurere timer0TMR0 = 0x5B;PSA = 0;PS2 = 0;PS1 = 0;PS0 = 1;sine_value = sine_table [sine_table_count];ref_voltage = sine_value;out_voltage_1 = out_voltage-500;if (Half_cycle_count)(out_voltage_1 = ~ out_voltage_1;out_voltage_1 = out_voltage_1 1;)x = ref_voltage-out_voltage_1;z1 = ki * x;z = z1>> 10;y = yold (KP * (x-xold)) z;Duty_cycle = y>> 6;if (Duty_cycle <0)(Duty_cycle = ~ Duty_cycle;Duty_cycle = Duty_cycle 1;)if (Duty_cycle> 0x1F4)Duty_cycle = 0x1F0;xold = x;yold = y;PR2 = 0x80; / / 0xA6 0x80 0x80 0x93 0xC0;T2CON = 0x04; / enablint timer 2 og prescaler verdi = 1:1if (Half_cycle_count) / / positive halv syklus(CCPR2L = Duty_cycle>> 2;CCP2CON = ((Duty_cycle & & 0x03) <<4) 0 x0C;CCP1CON = 0x00;)else / / Negative halv syklus(CCPR1L = Duty_cycle>> 2;CCP1CON = ((Duty_cycle & & 0x03) <<4) 0 x0C;CCP2CON = 0x00;)sine_table_count ;if (sine_table_count> = 0x24)(sine_table_count = 0x00;
if (Half_cycle_count)Half_cycle_count = 0;ellersHalf_cycle_count = 1;)
)
 

Welcome to EDABoard.com

Sponsor

Back
Top