Vai al contenuto
PLC Forum


generatore frequenze per controllo motore passo


Messaggi consigliati

Inserito:

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?

 


Inserita:

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.

Inserita:

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);

}

 

Inserita:

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

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...