Buondì per un progetto di controllo di un motore DC giocattolo, avevo scritto questo codice, che però non funziona, se invece elimino la parte del timer e alimento direttamente l'enable del ponte h il tutto funziona, tranne ovviamente il variare della velocità del motorino.
Ho quindi sicuramente sbagliato la configurazione del timer e forse anche qualcosa d'altro.
Scusate gli eventuali errori marchiani ma è da poco che mi sono affacciato alla mondo di Arduino!
#include <avr/io.h>
#include <util/delay.h>
#define ENABLE PB0//pin5
#define MOTORE_IN1 PB1//pin6
#define MOTORE_IN2 PB2//pin7
#define PULSANTE PB3//pin2
#define CICLI 3
#define INTERVALLO 1000 // Intervallo in millisecondi fra un ciclo e l'altro (1 secondi)
#define AVANTI_TEMPO 10000 // Tempo in millisecondi (10 secondi) per avanzare
#define VELOCITA_BASSA 100 // Velocità bassa (valore PWM)
#define VELOCITA_ALTA 200// Velocità alta (valore PWM)
void avanzoIndietro(int velocita);
void avanzo(int velocita);
void setup() {
// Imposta il pin del pulsante come input
DDRB &= ~(1 << PULSANTE);
// Imposta i pin del motore come output e i due pin inizio e fine
DDRB |= (1 << MOTORE_IN1) | (1 << MOTORE_IN2) | (1 << START) | (1 << END);
// Configura il timer per il controllo della velocità del motore
TCCR0A |= (1 << WGM00) | (1 << WGM01) | (1 << COM0A1); // Imposta il timer0 in modalità Fast PWM, non invertito
TCCR0B |= (1 << CS00); // Prescaler a 1
}
//=============CICLO AVANTI E INDIETRO====================================
void avanzoIndietro(int velocita) {
// Imposta la velocità del motore
OCR0A = velocita;
// Avanzo con la velocità specificata
PORTB |= (1 << MOTORE_IN1);
PORTB &= ~(1 << MOTORE_IN2);
_delay_ms(1000); // Tempo di avanzamento
// Fermo
PORTB &= ~((1 << MOTORE_IN1) | (1 << MOTORE_IN2));
_delay_ms(500); // Tempo di pausa
// Indietro con la velocità specificata
PORTB &= ~(1 << MOTORE_IN1);
PORTB |= (1 << MOTORE_IN2);
_delay_ms(1000); // Tempo di arretramento
// Fermo
PORTB &= ~((1 << MOTORE_IN1) | (1 << MOTORE_IN2));
_delay_ms(500); // Tempo di pausa
}
//===============CENTRIFUGA===============================================
void avanzo(int velocita) {
// Imposta la velocità del motore
OCR0A = velocita;
// Avanzo con la velocità specificata
PORTB |= (1 << MOTORE_IN1);
PORTB &= ~(1 << MOTORE_IN2);
}
//========================================================================
int main() {
setup();
while(1) {
// Controlla se il pulsante è premuto
if (PINB & (1 << PULSANTE)) {
// Se il pulsante è premuto, esegui il programma e Accendi il pin inizio e spegni fine
PORTB |=(1 << START);
PORTB &= ~(1 << END);
//Esegue i tre Cicli di avanti e indietro============================
int i;
for (i = 0; i < CICLI; i++) {
avanzoIndietro(VELOCITA_BASSA);
_delay_ms(INTERVALLO);
}
// Esegue un ciclo in avanti per 10 secondi con velocità alta =======
avanzo(VELOCITA_ALTA);
_delay_ms(AVANTI_TEMPO);
//======= Fermo il motore dopo i cicli===============================
// Arresta il PWM
OCR0A = 0;
PORTB &= ~((1 << MOTORE_IN1) | (1 << MOTORE_IN2));
}
}
return 0;
}