Consiglio gestione PWM

Buongiorno

tempo fa ho completato un progetto descritto qui e che con il vostro contributo (direi significativo) è perfettamente funzionante e aggiunge veramente più sicurezza alla moto.

Nell'utilizzo ho notato che il limite di decelerazione per quale interviene l'allarme che manda l'sws di frenata di emergenza va bene nel 90% dei casi ci sono le seguenti piccole anomalie:

a bassa velocità il limite è troppo basso e capita che parte l'allarme senza necessità
ad alta velocità il limite è troppo alto e non parte mai l'allarme.

Certamente questo è dovuto al fatto che qualunque mezzo (anche la moto) ha una decelerazione, partendo dalle alte velocità, via via più grande.

Quindi vorrei inserire nel codice dell'arduino che gestisce la decelerazione un limite variabile con la velocità. Per fare questo devo trasferire la velocità dall'arduino che gestisce il parabrezza a quest'ultimo.
Per farlo (escluso I2C che non funziona con la moto con motore acceso) ho pensato di generare un segnale PWM nell'arduino che gestisce il parabrezza (e che legge la velocità tramite un sensore hall ed interrupts) ed inviarlo previo filtro RC ad un pin analogico dell'arduino che gestisce la decelerazione.
Diciamo che da 127 km/h fino a zero avrei intervalli di 0.5 km/h da inviare e leggere dall'altra parte come tensione. Direi che è più che sufficiente come accuratezza.

Preliminarmente mi sono posto le seguenti domande:

  1. il segnale PWM generato a 488 Hz che può essere incrementato fino a 31250 Hz sul pin 11 ad esempio genera un carico sul processore significativo?
  2. può questo lavoro essere inficiato dal fatto che arduino tramite interrputs legge il sensore hall? (tenete conto che a 120 km/h la frequenza degli interrupts è circa 520 Hz)

Nella mente dell'artista, io vorrei alzare la frequenza del PWM per essere maggiore di quella di lettura del segnale proveniente dal sensore hall posto sulla ruota (dovrebbe essere meglio....??). Penso che un questo modo anche il filtro RC possa filtrare meglio e generare un segnale di tensione più "omogeneo". In generale sono preoccupato che sia un carico significativo sull'arduino con generazione di calore

Accetto consigli e suggerimenti

La frequenza del PWM non incide sul calore di arduino,

Se il PWM viene generato da uno dei timer 0-1-2 impostati come PWM la sua frequenza non incide sul carico di lavoro della CPU, se invece il PWM viene generato usando uno dei timer 0-1-2 impostati come CTC o Normal allora la frequenza incide sul duty CPU

di solito sono impostati come PWM

Grazie per la risposta. Ho cercato un pò in rete per capire i dettagli che mi hai dato, ma non ho ben compreso perché va un pò oltre le mie conoscenze

Come faccio a capire se è impostato il pin 3 come PWM?

Io ho utilizzato questa routine per cambiare la frequenza ed impostarla al massimo in modo che il filtro lavori meglio

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

Ho studiato e non ho concluso molto, ho solo capito (e quindi lo riporto per i posteri) che cambiando il timer 0 (pin5) come volevo farei io per avere la massima frequenza cambia anche il funzionamento di millis() e delay().

Lascio perdere il prescaler utilizzo il pin 5 976 Hz e taglio con un filtro 22K, 0.94uF....

timer 0 usato da millis() e delay()
timer 1 usato dalla libreria servo
timer 2 usato dalla tone()
https://arduino-info.wikispaces.com/Timers-Arduino