Vorrei realizzare con arduino un segnale che mi dia 30hz in uscita e la possibilita' tramite potenziometro di variare il duty cicle dal 0% al 100% o almeno vicino a questi estremi...
Di solito in passato lo realizzavo con un 555 ora vorrei farlo con arduino..
Consigli?
Grazie a tutti
int Val ;
byte pin = 3 ; // Pin di uscita PWM
void setup()
{
// imposta il Timer 2 ( pin 3 e 11 ) a frequenza di circa 30Hz
TCCR2B = TCCR2B & 0b11111000 | 0x07;
}
void loop() {
Val = map (analogRead (A0),0,1023,0,255) ;
analogWrite (pin,Val) ;
}
gentilissimo brunello....ma per variare il duty cicle non dovrei utilizzare un potenziometro?
Infatti, Brunello parte dal presupposto che ci sia un potenziometro da 10k su A0
ah ok...chiedo scusa,avendo usato sempre 555 sono un po' nelle curve....quindi i 3 pin del potenziometro da 10kohm dove andranno posizionati?
Grazie ancora
Il due reofori esterni uno a +5V e l'altro a GND, mentre quello centrale va sull'ingresso analogico.
Brunello:
// imposta il Timer 2 ( pin 3 e 11 ) a frequenza di circa 30Hz
TCCR2B = TCCR2B & 0b11111000 | 0x07;
Attenzione che con questa impostazione il massimo valore utilizzabile con analog write è 248 e non 255.
astrobeed.......quindi? :o
albatros1993:
astrobeed.......quindi? :o
Quindi hai solo 248 step sul pwm invece di 255, poco male però se imposti un valore maggiore di 248 con analog write il pwm si blocca.
quindi io imposto 248 nella stringa di analog write anziche' 255.
Avro' cmq i miei 30hz e duty variabile dallo 0 al 100% o almeno vicino a queste percentuli?
Grazie
astrobeed:
Attenzione che con questa impostazione il massimo valore utilizzabile con analog write è 248 e non 255.
Perche' dici ciò ?
per scrupolo ho voluto verificare e il Pwm spazia da 0 a 255
Brunello:
Perche' dici ciò ?
Perché se presetti a 248 il timer 2, per ottenere 30 Hz, anche i registri OCRxA e OCRxB non puoi impostarli oltre il valore di 248 visto che altro non sono che uno stop point su match, la analogwrite non fa altro che settare questi due registri.
Estratto da "wiring_analog.c", funzione "analogWrite(uint8_t pin, int val)"
#if defined(TCCR2) && defined(COM21)
case TIMER2:
// connect pwm to pin on timer 2
sbi(TCCR2, COM21);
OCR2 = val; // set pwm duty
break;
#endif
#if defined(TCCR2A) && defined(COM2A1)
case TIMER2A:
// connect pwm to pin on timer 2, channel A
sbi(TCCR2A, COM2A1);
OCR2A = val; // set pwm duty
break;
#endif
TCCR2B = TCCR2B & 0b11111000 | 0x07;
Mi pare evidente che ha modificato solo il prescaler portandolo a 1024, quindi perché questo limite di 248 non lo capisco.
Perché se presetti a 248 il timer 2, per ottenere 30 Hz, anche i registri OCRxA e OCRxB non puoi impostarli oltre il valore di 248 visto che altro non sono che uno stop point su match, la analogwrite non fa altro che settare questi due registri.
Ho guardato il codice più volte è non vedo alcun preset, la puoi spiegare sta cosa che non ci arrivo neanche io.
Ciao.
MauroTec:
Mi pare evidente che ha modificato solo il prescaler portandolo a 1024, quindi perché questo limite di 248 non lo capisco.
Errore mio, ho fatto confusione tra il registro TCCRxA e il registro TCNTx, che sono due cose diverse con fini diversi, ho troppi datasheet di micro dentro la testa, devo decidermi a fare un purge di quelli che non uso più ![]()
@astrobeed
Ok, capita, il nostro sistema di acquisizione video alle volte vede quello che non c'è.
Più che altro perché ho visionato il codice più di 3 volte, come a dire; qualcosa mi sfugge.
Poi alla fine ho pensato che nel core ci fosse qualcosa che con quella impostazione limitasse il valore utile a 248, ma mi scocciava andare a vedere il core.
Ciao.
Meno male....
mi ero gia' preoccupato di come dover passare la serata....... visto che nella realtà collegato l'oscilloscopio non mi risultava quanto detto.