Pagina 1 di 1

PWM con microcontrollore

MessaggioInviato: 5 dic 2016, 18:22
da wolf91
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

Re: PWM con microcontrollore

MessaggioInviato: 5 dic 2016, 18:28
da CarloCoriolano
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.

Re: PWM con microcontrollore

MessaggioInviato: 5 dic 2016, 19:36
da TardoFreak
Dipende dal microcontrollore e dalla struttura dei timer che ha a bordo.

Re: PWM con microcontrollore

MessaggioInviato: 12 dic 2016, 15:01
da marioursino
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.

Re: PWM con microcontrollore

MessaggioInviato: 12 dic 2016, 15:06
da EcoTan
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?