Yo estoy moviendo el duty con un encoder si te sirve te subo el codigo
#include "avr/interrupt.h";
#include <EEPROM.h>
#include <stdio.h>
volatile int value;
volatile int lastEncoded = 0;
int A = 2; //variable A a pin digital 2 (DT en modulo)
int B = 4; //variable B a pin digital 4 (CLK en modulo)
int m =8;
int cont;
void setup()
{
EEPROM.get(0, value);
OCR1A = value;
pinMode(9,OUTPUT);
pinMode(A, INPUT); // A como entrada
pinMode(B, INPUT); // B como entrada
digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
pinMode(m,INPUT_PULLUP);
//Endable Interrupts for PCIE2 arduino Pins (D0-7)
PCICR |= (1<<PCIE2);
//Setup pins 2,4
PCMSK2 |= (1<<PCINT18);
PCMSK2 |= (1<<PCINT20);
TCCR1A = _BV(COM1A1) | _BV(WGM11);
TCCR1B = _BV(CS10) | _BV(WGM12) | _BV(WGM13) ;
ICR1 = 250;
sei();
}
void loop()
{
energia();
duty();
}
ISR (PCINT2_vect) {
int MSB = digitalRead(A);
int LSB = digitalRead(B);
int encoded = (MSB << 1) |LSB;
int sum = (lastEncoded << 2) | encoded;
if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011)
value++;
if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000)
value--;
lastEncoded = encoded;
if (value <= 0)
value = 0;
if (value >= 255)
value = 255;
}
void duty() {
OCR1A = 255 - value;
}
void energia (){
if(digitalRead(m)==LOW){
cont++;
delay(1);
if (cont >5) {
EEPROM.put(0,value);
delay(50);
cont = 0;
}
}
}