Sari la conținut
ELFORUM - Forumul electronistilor

PWM- 3 faze


Postări Recomandate

Ok...eu nu am astfel de procesoare...iar pe mana nu imi pica un dsPic de la colegi...asa ca ma chiunui cu un amarat de 16f876a....are 2 pwm-uri...ma gandeam macar sa fac un sinus...am reusit insa doar pe un canal, nu stiu cum sa-l neg pe canalul 2....sau sa il fac complementar cu primul...oricum, de luni o sa lucrez cu el....

Link spre comentariu

Defazarea adica altfel spus, decalarea a doua semnale in timp, o poti face atunci cand parcurgi look-up table-ul care contine sinusoida.

Sa zicem ca ai 2 PWM-uri si este necesar un singur look-up table. Presupunem ca ai ales un look-up table (LUT) care are 256 valori (0 .... 255). Parcurgerea o faci astfel cu indexul modulo 255.

 

Primul PWM incepe sa trimita duty-cycle incepand cu elementul 0 al matricii (vectorului) care contine valorile de duty-cycle (asa numitul look-up table).

Al doilea PWM incepe sa trimita duty-cycle incepand cu elementul 127 al matricii (vectorului) care contine valorile de duty-cycle (adica tabela LUT).

 

In acest fel semnalele rezultate sunt decalate (deazate) cu 90 grade.

S.a.m.d.

Editat de mars01
Link spre comentariu

Am gasit un programel interesant...cu pwm fix, si de aici o sa pornesc....cred ca este cel mai simplu....are si pe cea de-a doua iesire semnal invers la 180*, celalalt de la tahmid facea unda din 4 iesire (semnale) diferite....cerd ca acesta este mai simplu, si o sa ii atasez o tabela sinus sa vedem ce iese....

float teta;
unsigned char sample[15];
int i=0;
void main()
{
TRISC = 0x00;
PORTC = 0x00;
PWM1_Start();
PWM2_Start();
PWM1_Set_Duty(50000);
PWM2_Set_Duty(50000);
while(1)
{

for (i=0; i<15; i++)
{
teta = ( (float) i / 15 ) * 3.14159;
sample[i] = (int) (255 * sin ( teta ));
PWM1_Set_Duty(sample[i]);
}

for (i=0; i<15; i++)
{
teta = ( (float) i / 15 ) * 3.14159;
sample[i] = (int) (255 * sin ( teta ));
PWM2_Set_Duty(sample[i]);
}
}
}
Link spre comentariu

Un pointer cum zice si denumirea doar "arata catre o zona din memorie". Cum probabil deja stii o variabila ocupa spatiu de memorie, de ex, char ocupa 1 byte sau 8 biti, un pointer nu ocupa spatiu fizic ci arata catre zona de memorie care a fost alocata pt variabila respectiva. De obicei se foloseste pentru a modifica o anumita variabila declarata intr-o functie in interiorul unei alte functii fara a folosii return. De ex.

void nonPointerFunc(int number) {
 number = 2;
}

void pointerFunc(int *number) {
 *number = 2;
}

void main() {
 int numar = 1;

 nonPointerFunc(numar); 
 // variabila numar are in continuare valoarea 1 
 pointerFunc(&numar);
 // findca am folosit un pointer prin care am trimis locatia de memorie a variabilei, numar acuma are valoarea 2
}
Link spre comentariu

Pointerii sunt utili si atunci cand returnezi mai multe valori dintr-o functie. In mod default o functie are o singura valoare intoarsa (valoare de iesire) desi poate avea mai multi parametri (valori de "intrare").

Pointeri sunt nu numai catre variabile standard dar si catre structuri, exista pointeri catre functii. Matricile (arii, vectori) se bazeaza tot pe pointeri.

 

Au foarte multe utilitati mai ales cand se lucreaza aproape de hardware, tocmai ca limbajele ca JAVA de exemplu, nu au conceptul de pointeri expus catre programator.

Cum spuneam, pointerii sunt subiect mai avansat.

Editat de mars01
Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări