Hvordan generere ren sinus bølge fra PIC micros?

Jeg har ikke jobbet med PIC men AVR jeg har brukt Look-up bord med precalculated sinus-bølge data.Bare lese og sende ut gjennom DAC.
Med PIC gjøre det samme:
Lagre en periode sinus-bølge å liker 256x8 størrelse tabell i Program minne eller en annen.deretter bruke DDS algoritme eller enkle lese én etter én ende utgang til port der DAC er tilkoblet.DAC kan være enkle R/2R motstander stige.
Her er det jeg
har funnet for PIC: PIC signal generator

 
Du oppnår det ved bruk av innebygde PWM-krets, lese en tabell.
Opererer på frekvenser over 60 Hz bølger, PIC's UC
er ikke har nok fart.Det bør være bedre valg en prosessor containning en float punkt ALU, som en DSP.

På PIC, jeg opprettet en. XLS-fil til å justere høyeste toll-cicle, og deretter fylt at verdiene på en statisk tabellen.

Bellow, en kodebit, som brukes til en UPS, med CCS C compiler:Code:////////////////////////////////////////////////// //////////////////////

const unsigned int8 Duty0 [] = (7,15,23,31,38,46,53,61,68,75,82,88,95,101,107,113,118,123,128,133,137,141,144,147,150,153,155,156,158,159,159,160); / / 126 Vac (at) 24Vdc

const unsigned int8 Duty1 [] = (7,15,23,30,38,45,52,60,67,74,80,87,93,99,105,111,116,121,126,130,134,138,142,145,148,150,152,154,155,156,157,157);

.......

const unsigned int8 Duty30 [] = (5,10,15,20,25,30,35,40,44,49,54,58,62,66,70,74,77,81,84,87,90, 92,95,97,99,100,102,103,104,104,105,105); / / 117Vac (at) 18Vdc

const unsigned int8 Duty31 [] = (5,10,15,20,25,30,35,39,44,49,53,57,61,65,69,73,77,80,83,86,89, 91,94,96,97,99,100,102,102,103,103,104);

const unsigned int8 Duty32 [] = (5,10,15,20,24,29,34,39,43,48,52,57,61,65,69,72,76,79,82,85,88, 90,92,95,96,98,99,100,101,102,102,102);

////////////////////////////////////////////////// //////////////////////

void CarregaPWM (void)

(

if (direcao == CRESCENTE) PWM_counter ;

else PWM_counter -;

bryteren (PWM_counter)

(

case 0: NivelMinimo (); set_pwm1_duty (0); break;

case 1: set_pwm1_duty (Duty [PWM_counter]); break;

case 2: set_pwm1_duty (Duty [PWM_counter]); break;

..........

case 29: set_pwm1_duty (Duty [PWM_counter]); break;

case 30: set_pwm1_duty (Duty [PWM_counter]); break;

case 31: NivelMaximo (); set_pwm1_duty (Duty [PWM_counter]); break;

)

)

////////////////////////////////////////////////// //////////////////////

void AvaliaBateria (void)

(

bryteren (NivelBateriaAtualizado)

(

case 0: Duty [PWM_counter] = Duty0 [PWM_counter]; pip = CONTINUO; break;

case 1: Duty [PWM_counter] = Duty1 [PWM_counter]; pip = CONTINUO; break;

.......

case 31: Duty [PWM_counter] = Duty31 [PWM_counter]; pip = MUDO; break;

case 32: Duty [PWM_counter] = Duty32 [PWM_counter]; pip = MUDO; break;

)

)

 
Hei,
Jeg gjorde en sinus-bølge frittstående inverter, og her en sinus-bølge konstantene:

const long sine_wave [32] = (81.162.241.318.392.462.527.588.642.691.733.768.795,
815.827.831.827.815.795.768.733.691.642.588.527.462,
392,318,241,162,81,0);

Dette er en bare for halvparten av sinus-bølge.
Med vennlig hilsen

 
Faktisk, jeg har ingen idé om C-programmering.

på den andre siden jeg bruker PIC Basic Pro språk, kan du hjelpe meg?

 

Welcome to EDABoard.com

Sponsor

Back
Top