Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

PWM con microcontrollore

Tipologie, strumenti di sviluppo, hardware e progetti

Moderatore: Foto UtentePaolino

0
voti

[1] PWM con microcontrollore

Messaggioda Foto Utentewolf91 » 5 dic 2016, 18:22

Buona sera, vi scrivo per chiedervi delucidazioni.
Io avrei bisogno di due segnali PWM, preferisco non farli software per non sprecare cicli di clock per la cpu, quello che vi chiedo:
E' possibile generare due segnali PWM con stesso periodo e duty cycle ma che siano sfasati di un Ton?

Grazie in anticipo
Avatar utente
Foto Utentewolf91
0 3
 
Messaggi: 18
Iscritto il: 12 nov 2016, 18:40

0
voti

[2] Re: PWM con microcontrollore

Messaggioda Foto UtenteCarloCoriolano » 5 dic 2016, 18:28

In linea di massima no, anzi, proprio no. Se oltre a controllare il periodo d'impulso vuoi anche controllarne lo sfasamento tra due uscite, devi gestire tutto via software.
Avatar utente
Foto UtenteCarloCoriolano
1.446 3 4 7
---
 
Messaggi: 1023
Iscritto il: 24 mag 2016, 13:08

0
voti

[3] Re: PWM con microcontrollore

Messaggioda Foto UtenteTardoFreak » 5 dic 2016, 19:36

Dipende dal microcontrollore e dalla struttura dei timer che ha a bordo.
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,9k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15754
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

[4] Re: PWM con microcontrollore

Messaggioda Foto Utentemarioursino » 12 dic 2016, 15:01

Perché no? Imposta due interrupt sui rollover dei timer e fai partire uno dopo un numero di cicli predefinito dall'altro.

Codice: Seleziona tutto
Void main()
{
    ...
    TMR1ON = 1;
    __delay_us(TON);
    TMR2ON = 1;
    ...
}

Void interrupt_TMR1()
{
    toggle_PWM1();
    TMR1IF = 0;
    return;
}

Void interrupt_TMR2()
{
    toggle_PWM2();
    TMR2IF = 0;
    return;
}


Alternativamente fai partire il secondo timer tramite il primo direttamente dall'interrupt:

Codice: Seleziona tutto
Void interrupt_TMR1()
{
    toggle_PWM1();

    TMR2 = 0xFF - delay_cycles;
    TMR2ON = 1;
    TMR1IF = 0;
    return;
}

Void interrupt_TMR2()
{
    toggle_PWM2();

    TMR2ON = 0;
    TMR2IF = 0;
    return;
}


Nel secondo caso devi calcolare i cicli da sottrarre al secondo timer per avere il tuo ritardo, nel codice ho ipotizzato che il rollover avvenga a 0xFF ma devi dirmi tu che dispositivo stai usando. Inoltre i cicli di ritardo devono tenere conto dell'overhead di scrittura ai registri, di chiamata alle routine di toggle e di accesso all'interrupt (è più difficile a dirsi che a farsi). Se usi PIC potresti avere per certi timer un registro PRx e si può usare quello.

toggle_PWMx() è fatta più o meno così:

Codice: Seleziona tutto
Void toggle_PWMx()
{
    Pin_PWMx = !Pin_PWMx;
    return;
}


Questo è uno pseudo-codice che segue la sintassi XC8 di Microchip.
Avatar utente
Foto Utentemarioursino
5.687 3 9 13
G.Master EY
G.Master EY
 
Messaggi: 1598
Iscritto il: 5 dic 2009, 4:32

0
voti

[5] Re: PWM con microcontrollore

Messaggioda Foto UtenteEcoTan » 12 dic 2016, 15:06

wolf91 ha scritto:sfasati di un Ton

Questo Ton è fisso o variabile? Se è variabile, lo sfasamento deve rimanere quello iniziale o deve mantenersi sempre uguale a Ton?
Avatar utente
Foto UtenteEcoTan
7.720 4 12 13
Expert EY
Expert EY
 
Messaggi: 5426
Iscritto il: 29 gen 2014, 8:54


Torna a Realizzazioni, interfacciamento e nozioni generali.

Chi c’è in linea

Visitano il forum: Nessuno e 14 ospiti