Go Down

Topic: PWM VELOCE (Read 5 times) previous topic - next topic

Burt

Buongiorno a tutti,
sono nuovo del forum e vorrei porre una questione che mi assilla. Ho la necessità di realizzare un PWM con frequenza superiore a 150 kHz al fine di comunicare informazione sulla rete di alimentazione. Le funzioni scrittura sui port digitali di Arduino non riescono a realizzare onde quadre di quella frequenza e di utilizzare il PWM presente sulla scheda non se ne parla in quando produce frequenze ben più basse.
Per velocizzare il tutto ho pensato di scrivere direttamente sul port utilizzando i registri del micro a questo dedicati. In questo modo ottengo una frequenza superiore a 2 MHz che però adesso è troppo veloce e va rallentata. Per rallentarla ho inserito un ciclo for annidato che esegue un'operazione qualunque. Dopo aver settato il pin 2 del portD come uscita, segmento saliente di codice è:

for(;;)
{
PORTD=PORTD|B00000100;
Time=0;
  FOR(i=1;i<=1000;i++)
   {
     FOR(j=1;j<=1000;j++)
    {
      Time=Time+1;
     }
   }
  PORTD=PORTD&B11111011;
Time=0;
   FOR(i=1;i<=1000;i++)
     {
      FOR(j=1;j<=1000;j++)
     {
       Time=Time+1;
      }
   }
}

Naturalmente il port D è stato settato come uscita.
Guardando la forma d'onda generato con l'oscilloscopio sembra che i cicli di attesa non influenzino per nulla la frequenza; come se non fossero stati inseriti.
Non riesco a capire perché e non so come diminuire la frequenza dell'onda.
Ringrazio anticipatamente per le eventuali risposte e porgo cordiali saluti.



ratto93

Prova con il dealayMicroseconds dentro i for...
Se corri veloce come un fulmine, ti schianterai come un tuono.

leo72

#2
Jan 09, 2012, 08:25 pm Last Edit: Jan 09, 2012, 08:37 pm by leo72 Reason: 1
Non ho capito una cosa, ma il segnale lo devi modulare visto che parli di trasportare informazioni, oppure ti basta un segnale PWM ad una determinata frequenza?

Ad esempio, il codice qui sotto genera un segnale PWM sul pin 3 a 200 kHz esatti con duty cicle 50% (se non ho sbagliato i calcoli):

Code: [Select]
pinMode(3, OUTPUT);
TCCR2A |= ((1<<COM2B1) | (1<<WGM21) | (1<<WGM20));
TCCR2B |= ((1<WGM22) | (1<<CS21));
TCCR2B &= (~(1<<CS22) | ~(1<<CS20));
OCR2A = 9;
OCR2B = 4;


Per gestirlo, ti basta mettere in output in pin quando devi iniziare la trasmissione, e metterlo in input per terminarla.

EDIT: questo dovrebbe andare - 200 kHz/50% (se può servire a qualcuno)

uwefed

Non si modulano in PWM per mandare informazione sulla rete 230V. Sono sistemi diversi.
Un segnale PWM ha una frequenza fissa di base, ma come durata del impulso in certi casi corrisponde a delle frequenze molto piú alte.
per esempio un segnale PWM al 50% corrisponde alla frequenza di ripetizione. Un PWM di 1/256 corrisponde a una frequenza 128 volta piú alta di quella base. Hai della atenuazioni variabili a seconda della percentuale PWM.

Inoltre hai il problema che devi isolare il sitema dalla tensione di rete.

Ci sono varie discussione riguardante powerline. per esempio:  
arduino.cc/forum/index.php/topic,85592.0.html

Ciao Uwe

leo72

PS:
cmq ho fatto male i conti.. quel codice genera un PWM a 2 MHz....  :smiley-sweat:
Ora lo correggo...


Go Up