Vai al contenuto
PLC Forum


generatore frequenze per controllo motore passo


roberto8303

Messaggi consigliati

Salve, 

chi mi aiuta per creare un codice con il quale posso comandare un motore passo passo con relativa scheda, il motore è un 800 passi giro, quindi alla frequenza di 800 hz ho un giro al secondo 60 rpm. 

Prima cosa dovrei avere una frequenza molto piu alta diciamo 8khz, e controllare o meglio contare gli impulsi che invio alla scheda per definire il numero di giri per la posizione.

quali sono le istruzioni per generare un onda quadra 50% con frequenze diverse da 80hz a 8khz, ed senza che utilizzando anche altre istruzioni di controllo il timer venga influenzato dal tempo di ciclo?

 

Link al commento
Condividi su altri siti


8 kHz equivale ad un periodo di 125 µs, ma dovendo gestire un passo passo devi scendere a 31.25 µs per poter gestire le 4 fqsi.

E' un po dura da fare solo in Sw con arduino o, peggio, con raspberry.

 

L'unica via è quella di generare un interrupt a tempo con il quale pilotare le uscite, però con questi tempi se va bene fai solo quelle 4 istruzioni.

Link al commento
Condividi su altri siti

il problema di cambiare la frequenza di arduino è che comunque è a scaglioni, nel senso che secondo il prescaler ottengo frequenze diverse, anche nel loop nell esempio cambio il prescaler ma posso scegliere tra :1 :8 :64 e cosi via, volevo cercare una via per abbassare in modo scalare tale frequenza...

 

 

 


void setup() {

  Serial.begin(9600); 
}

void setPwmFrequency(int pin, int divisor) {
  byte mode;
  if(pin == 5 || pin == 6 || pin == 9 || pin == 10) {
    switch(divisor) {
      case 1: mode = 0x01; break;
      case 8: mode = 0x02; break;
      case 64: mode = 0x03; break;
      case 256: mode = 0x04; break;
      case 1024: mode = 0x05; break;
      default: return;
    }
    if(pin == 5 || pin == 6) {
      TCCR0B = TCCR0B & 0b11111000 | mode;
    } else {
      TCCR1B = TCCR1B & 0b11111000 | mode;
    }
  } else if(pin == 3 || pin == 11) {
    switch(divisor) {
      case 1: mode = 0x01; break;
      case 8: mode = 0x02; break;
      case 32: mode = 0x03; break;
      case 64: mode = 0x04; break;
      case 128: mode = 0x05; break;
      case 256: mode = 0x06; break;
      case 1024: mode = 0x7; break;
      default: return;
    }
    TCCR2B = TCCR2B & 0b11111000 | mode;
  }
}


void loop() {
  
     setPwmFrequency(6,1);         
  
 
analogWrite(6,125);

}

 

Link al commento
Condividi su altri siti

Il prescaler del timer 0 è meglio non toccarlo altrimenti sballi tutte le temporizzazioni di libreria.

Nel tuo caso è meglio usare il timer 2 (uscite pin 3 e 11) con prescaler 1 hai un clock di 31.250 Hz che diviso 4 Hw ti da giusto i circa 8kHz e le 4 fasi necessarie per i tuoi stepper

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...