Pwm attiny85 con ponteh l293d

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

Scusate il codice era questo!

#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 << ENABLE);;
  // 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)) {
      
      //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;
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.