Progetti

   

Tutorial

   

Servizi

   
Benvenuto, Ospite
Nome utente: Password: Ricordami
  • Pagina:
  • 1
  • 2
  • 3

ARGOMENTO: 2 segnali PWM con DC diversi

2 segnali PWM con DC diversi 3 Settimane 1 Giorno fa #6

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Offline
  • Moderatore
  • Messaggi: 4452
  • Ringraziamenti ricevuti 508
  • Karma: 49
Salve Carlo,

se non hai modo di toccare la MCU direi che sia meglio gestire l'encoder con intrruzioni e dedicare i PWM al motore. Dai collegamenti con la MCU dovresti capire se questa era la scelta del progetto originale.

Per la frequenza, non ho fatto i calcoli ma 300Hz sono una frequenza bassa, per cui non mi sorprende che debba abbassare la frequenza del clock. Potresti usare il pre-scaler, ma dovresti vedere qual'è il valore minimo.

Considera che per frequenze basse la risoluzione effettiva del PWM peggiora (trovi le formule sul datasheet).
A frequenze alte i driver potrebbero non funzionare bene e il motore potrebbe dissipare più energia scaldandosi.
Ciononostante le tue frequenze in gioco non sono alte. Per alte direi piuù dell'ordine di 50-100KHz.

A seconda del tipo di controllo che vuoi avere, 4MHz potrebbero o meno bastare, ma dovrai fare qualche compromesso.

Saluti,

Mauro
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

2 segnali PWM con DC diversi 3 Settimane 21 Ore fa #7

  • Inco
  • Avatar di Inco
  • Offline
  • Fresh Boarder
  • Messaggi: 8
  • Karma: 0
se non hai modo di toccare la MCU direi che sia meglio gestire l'encoder con intrruzioni e dedicare i PWM al motore. Dai collegamenti con la MCU dovresti capire se questa era la scelta del progetto originale.

non vorrei rifare il tutto, e dallo schema originale l'encoder e' collegato al ccp2a del pic quindi credo che venga utilizzato il capture per l'encoder.
Per la frequenza, non ho fatto i calcoli ma 300Hz sono una frequenza bassa, per cui non mi sorprende che debba abbassare la frequenza del clock. Potresti usare il pre-scaler, ma dovresti vedere qual'è il valore minimo.

fatto un po' di calcoli ed effettivamente per avere un PWM a 300 Hz bisogna utilizzare per forza una frequenza di clock di 4MHz o meno...

ho analizzato meglio il tracciato originale e ho notato un piccolo sfasamento tra l'inizio dei due segnali pwm dell'ordine di 62,5 nS questo mi porta a pensare che il progetto originale usa un clock di 64MHz e quindi un periodo di 15.625 nS, considerando che una istruzione impiega 4 "colpi" di clock (15.625x4=62.5).. se questo e' vero il pwm generato deve per forza essere generato via software.

Sperando che il mio ragionamento non sia del tutto sballato,
Saluto, Ringrazio e programmo... :)

Carlo
Carlo Incoronato
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

2 segnali PWM con DC diversi 3 Settimane 17 Ore fa #8

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Offline
  • Moderatore
  • Messaggi: 4452
  • Ringraziamenti ricevuti 508
  • Karma: 49
Il modulo CCP2 è disponibile su due pin.
Se l'encoder è collegato sul pin RB3 potrebbe far uso delle interruzioni.
CCP2 è anche su RC1.
La configurazione avviene con i configuration registers.

Saluti,

Mauro
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

2 segnali PWM con DC diversi 3 Settimane 13 Ore fa #9

  • Inco
  • Avatar di Inco
  • Offline
  • Fresh Boarder
  • Messaggi: 8
  • Karma: 0
Infatti e' collegato su RC1 (CCP2A)

la parte del programma che legge l'encoder l'ho fatta e funziona bene utilizzando l'esempio sul tuo manuale con il quale leggo continuamente il tempo tra un fronte di salita e uno di discesa, ho solo dovuto resettare il flag CCP2IF per ogni cambio di modalita di cattura perche' mi generava interrupt indesiderati al cambio di modalita di lettura del capture (fronte salita o discesa) non so se e' normale perche' vedo che tu non lo usi quando cambi modalita di Capture.
Allego codice.
//*************************************
// ISR Alta Priorita'
//*************************************
__interrupt (high_priority) void ISR_alta (void) {
 unsigned int buffer = 0;
 if (PIR1bits.TMR2IF == 1 ) {
 PIR1bits.TMR2IF=0;
 
 }
 if (PIR2bits.CCP2IF == 1 ) {
 // Resetto il flag d'interrupt per permettere nuove interruzioni
 PIR2bits.CCP2IF = 0;
 
 switch (edge){
 case RISING_EDGE : buffer = ((unsigned int) CCPR2H) << 8 ;
 start = buffer + CCPR2L;
 
.....
 
.....
 
 //Imposto la modalita' Capture sul fronte di discesa
 
 CCP2CONbits.CCP2M0 = 0;
 PIR2bits.CCP2IF = 0;
 
 edge = FALLING_EDGE;
 break;
 
 case FALLING_EDGE: buffer = ((unsigned int) CCPR2H) << 8 ;
 stop = buffer + CCPR2L;
 
 if (stop >= start) {
 time = (stop - start);
 } else {
 time = ((65535 - start) + stop);
 }
.....
 
..... 
 
 // Reimposto la modalita' Capture sul fronte di salita
 CCP2CONbits.CCP2M0 = 1;
 PIR2bits.CCP2IF = 0;
 
 edge = RISING_EDGE;
 break;
 default: break;
 }
 }
}


Saluti Carlo
Carlo Incoronato
Ultima modifica: 3 Settimane 12 Ore fa da Inco.
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

2 segnali PWM con DC diversi 2 Settimane 1 Giorno fa #10

  • firstcolle
  • Avatar di firstcolle
  • Offline
  • Gold Boarder
  • Messaggi: 295
  • Ringraziamenti ricevuti 31
  • Karma: 3
avevo provato anche io a gestire l'encoder in questo modo ma cambiare il trigger dell'interrupt ogni volta non l'ho trovato molto pratico e affifabile.. ho preferito settare un timer e ogni tot ms andare a vedere come è messo l'encoder.. è scritto nel progetto apmplificatore cuffie pubblicato da poco e c'è anche il sorgente per prendere spunto se vuoi
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.
  • Pagina:
  • 1
  • 2
  • 3
Moderatori: Mauro Laurenti, Pinna, StefA, Matteo Garia
Powered by Forum Kunena
   
© LaurTec 2006-2015