Atmega328 - Invertire fase duty cycle

Buon pomeriggio, tempo fa avevo letto da qualche parte che è possibile invertire la fase del duty cycle dei pin pwm del microcontrollore in oggetto.
Oggi è sorta la necessità in quanto devo comandare un mosfet di tipo P. Questo è attivo quando il gain è a livello basso. Chiedo se qualcuno conosce l'istruzione. Grazie.

Non esiste un istruzione del genere.
A meno che tu non stia usando la libreria softPWM
https://code.google.com/p/rogue-code/wiki/SoftPWMLibraryDocumentation
Dove si puo’ definire la polarità

SoftPWMBegin([
**_ <em>**defaultPolarity**</em> _**
])
optional
**_ <em>**defaultPolarity**</em> _**
allows all newly defined pins to take on this polarity.

Questo e’ un trucchetto che avevo trovato in rete

void loop()
{
  analogWrite(9, valPWM);
  invertPWM (10, valPWM);
   //............
}

void invertPWM(int pin, int valPWM)
{
  analogWrite(pin, valPWM);
  TCCR1A = TCCR1A & ~ B00110000; 
  TCCR1A |= B00110000;  
}

Oppure risolvi alla vecchia maniera, con un transistor connesso a collettore aperto e due resistenze per la base … :wink:

Mi serve il mosfet perchè supporta segnali a frequenze piu ’ elevate

Intendevo per invertire il segnale, non per pilotare il carico …

drive_mos_p.png

Quante pippe mentali per una cosa talmente banale da risolvere che è uno spreco perderci più di 5 secondi di tempo :smiley:
Basta fare "analogWrite(Pin, 255-ValPwm)" ed ecco risolto il problema.

Avevo già provato via software, è la prima cosa che mi è venuta in mente.

for (int i = 0; i < periodsNumber; i++) {
    dutyCycle[i] = 255 - dutyCycle[i];
}

Eppure non ottengo il comportamento desiderato.
Poi sul forum, qui: http://forum.arduino.cc/index.php?topic=159129.0, l’utente MarkT dice che questo trucchetto non funziona.
E sono ancora più confuso.

ultrasound91:
Eppure non ottengo il comportamento desiderato.

Perché il tuo codice è sbagliato, non puoi modificare la variabile di lavoro e pretendere che al ciclo successivo abbia ancora il corretto valore.

Poi sul forum, qui: http://forum.arduino.cc/index.php?topic=159129.0, l’utente MarkT dice che questo trucchetto non funziona.

No, dice che tocca vedere con quali coppie di pin lavori e agire sul relativo timer e non genericamente sul timer1.

Ecco la dimostrazione strumentale che la mia soluzione, la più semplice in assoluto e slegata dal pin/timer, funziona.
Uso il pin 9 e il pin 10, sul 9 c’è il valore pwm reale sul 10 la differenza da 255:

 analogWrite(9, 100);
 analogWrite(10, 255 - 100);

Nel primo caso il duty vale 0, nel secondo 100, nel terzo 200 nel quarto 255, come puoi vedere sul pin 10 la fase del pwm è negata rispetto a quella del pin 9 come serve a te.

Astro, sei sempre il solito ... noi siamo qui che ci divertiamo a complicarci la vita inutilmente, e tu arrivi e ci togli tutto il divertimento con una soluzione sia semplice che funzionante ... vergognati :stuck_out_tongue:

(sto scherzando, ovviamente :smiley: ... quella soluzione non mi era neppure venuta in mente :cold_sweat:)

Etemenanki:
Astro, sei sempre il solito ... noi siamo qui che ci divertiamo a complicarci la vita inutilmente, e tu arrivi e ci togli tutto il divertimento con una soluzione sia semplice che funzionante ... vergognati :stuck_out_tongue:

Lo sai che sono il fondatore del D.S.S. (Dipartimento Soluzioni Semplici) :grin: