Push pull pwm

Ciao Arduiniani,
tempo fa trovai questo articolo e lo sfruttai per fare un pwm push pull con arduino.
Ho due domande per voi:

  1. Come usare il timer 2 invece del timer 1? basta sostituire dove trovo scritto ad es. OCR1A con OCR2A ecc?
  2. Quali diventano le uscite del pwm?

Qui c’è l’articolo.

grazie mille

Siccome dal link precedente vedo che leggi l'inglese, questo tutorial spero ti possa essere utile. Mi sembra ben fatto: http://letsmakerobots.com/node/28278

Ciao, ne ho letti tanti di articoli sui timer ma quando mi sembra di capire e poi provo non funziona niente...o quasi :(

Quindi volevo in prima battuta un paio di risposte secche.

Se è vero che i timer sono fatti nello stesso modo vuol dire che cambiando poco nel codice dell'articolo dovrei ottenere l'effetto desiderato. Le uscite del pwm diventano 11 e 3.

Ci sono alcuni utenti molto esperti nell'uso dei registri degli Atmel.

Secondo me sarebbe meglio tu mettessi su forum il tuo codice indicando anche dove cambieresti da timer1 a timer2. esempio: OCR1A = PERIOD_TICKS / 2; // OCR1A=>OCR2A

Codice originale

#define PIN_PRI_A   9    // OCR1A - high-active primary drive
#define PIN_PRI_B   10   // OCR1B - low-active primary drive

#define PUSH_PULL   true // false = OCR1A only, true = OCR1A + OCR1B

// Phase-freq Correct timer mode -> runs at half the usual rate 
#define PERIOD_US   60
#define PERIOD_TICK (microsecondsToClockCycles(PERIOD_US / 2) / TIMER1_PRESCALE)


void setup()
{
// Configure Timer 1 for Freq-Phase Correct PWM
//   Timer 1 + output on OC1A, chip pin 15, Arduino PWM9
//   Timer 1 - output on OC1B, chip pin 16, Arduino PWM10  
   
analogWrite(PIN_PRI_A,128);    // let Arduino setup do its thing 
analogWrite(PIN_PRI_B,128);  

TCCR1B = 0x00;                 // stop Timer1 clock for register updates 

// Clear OC1A on match, P-F Corr PWM Mode: lower WGM1x = 00 
TCCR1A = 0x80 | 0x00; 

// If push-pull drive, set OC1B on match
#if PUSH_PULL 
TCCR1A |= 0x30;
#endif 

ICR1 = PERIOD_TICKS;           // PWM period 
OCR1A = PERIOD_TICKS / 2;      // ON duration = drive pulse width = 50% duty cycle 
OCR1B = PERIOD_TICKS / 2;      //  ditto - use separate load due to temp buffer reg 
TCNT1 = OCR1A - 1;             // force immediate OCR1x compare on next tick 

// upper WGM1x = 10, Clock Sel = prescaler, start Timer 1 running 
TCCR1B = 0x10 | TCCR1B_CS20;
}

viene definito PERIOD_TICK e poi viene usato PERIOD_TICKS......????

Come farebbero gli esperti?

I timer fanno tutti le stesse cose ma in più ogniuno fa cose diverse. Inoltre c'è una differenza sostanziale fra il timer 1 e il 2: il timer 2 è a 16 bit mentre il timer 2 è a 8 bit, quindi sono profondamente diversi e non è possibile scambiarli in modo indolore...

Al di la della risoluzione che per ora non mi interessa, con il timer1 puoi fare il phase-frequency pwm correct mode, mentre con il timer2 il phase pwm correct mode. Vorrei che mi aiutaste ad adattare il codice per il timer 2. Thanks

Non ho capito, con tutti e tre i timer puoi fare il PWM a fase corretta…

Si volevo dire che nello sketch è usato il freq-phase correct invece con il timer 2 questo non puoi farlo ma puoi fare il phase correct. Dato che nello sketch si usa ICR1, ma con il timer 2 invece?

Cos'è il frequency-phase correct? Io conosco solo il phase correct... Ma hai davvero l'esigenza del phase correct?

Non lo so...e non so se c'è ne sia l'esigenza. Quello sketch mi da due pwm in controfase e a duty cycle indipendenti ma con il timer 1. Ovvero si potrebbero anche sovrapporre i due pwm se entrambi avessero duty 60% per es. A me serve la stessa cosa ma con il timer 2.