roberto8303 Inserito: 26 marzo 2016 Segnala Share Inserito: 26 marzo 2016 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 More sharing options...
Livio Orsini Inserita: 26 marzo 2016 Segnala Share Inserita: 26 marzo 2016 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 More sharing options...
roberto8303 Inserita: 26 marzo 2016 Autore Segnala Share Inserita: 26 marzo 2016 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 More sharing options...
Livio Orsini Inserita: 27 marzo 2016 Segnala Share Inserita: 27 marzo 2016 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 More sharing options...
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora