Hagamos otra prueba enmascarando las interrupciones del timer antes de variar la frecuencia
int duty = 50;
int _freq = 1;
int pinPote = A0;
int pote;
int poteAnt = 1024;
void setup() {
DDRB |= (1 << DDB1);
// modo ctc
TCCR1A &= ~ (1 << WGM10);
TCCR1A |= (1 << WGM11);
TCCR1B |= (1 << WGM12);
TCCR1B |= (1 << WGM13);
TCCR1A &= ~ (1 << COM1A0);
TCCR1A |= (1 << COM1A1);
//1024
TCCR1B |= (1 << CS10);
TCCR1B &= ~ (1 << CS11);
TCCR1B |= (1 << CS12);
}
void loop() {
pote = analogRead(pinPote);
if(pote != poteAnt){
TIMSK1 &= ~(1 << OCIE1A); // deshabilitar interrupciones del timer1
_freq = map(pote, 0, 1023, 300, 1900);
ICR1 = (F_CPU / 1024 / _freq) - 1;
OCR1A = (((F_CPU / 1024 / _freq) - 1) * duty) / 100;
poteAnt = pote;
TIMSK1 |= (1 << OCIE1A); // rehabilitar interrupciones del timer1
}
}
Ya le vamos a encontrar la vuelta, no desesperes...
Yo entiendo que quieres implementar lo aprendido pero evidentemente estamos (me incluyo) obviando algo por eso no funciona como esperamos.
Mientras tanto, ¿por qué no intentas hacerlo usando la librería TimerOne a ver si da mejor resultado?
Si funciona bien, es cuestión de estudiar la librería a ver que pasos nos estamos "comiendo".
Saludos