hola tengo un problema con mi código, me oscila un montón la salida pwm con el filtro pasa bajos, puse una resistencia 3k3 y un capacitor 100n.
con este tramo de código sube la frecuencia
/*
* WGM10, WGM12: Fast PWM, 8-bit TOP=255
* CS10: No prescaler
* COM1A1: Pin 6 to LOW on match with OCR1A and to HIGH on TOP
*/
TCCR1A = _BV(COM1A1) | _BV(WGM10);
TCCR1B = _BV(CS10) | _BV(WGM12);
/*
* 50% duty cycle
* 32 kHz with 8MHz CPU clock
*/
OCR1A = 127;
}
ahora como lo adapto a mi código para que cambien el valor si modifico OCR1A modifico el duty, como lo implemento en mi código en lugar de la variable value, OCR1A=value; así funcionaria?
e#include "avr/interrupt.h";
#include <EEPROM.h>
#include <stdio.h>
int cont3;
int m = PB1;
volatile int value =0;
volatile int lastEncoded = 0;
const int boton=3;
const int led=5;
int estadoled=LOW;
int ultimoestadoboton;
int estadoactualboton;
void energia (){
if(digitalRead(m)==LOW){
cont3++;
delay(1);
if (cont3 >5) {
EEPROM.put(0,value);
delay(50);
cont3 = 0;
}
}
}
void setup()
{
EEPROM.get(0, value);
pinMode(6, OUTPUT);
pinMode(1, INPUT);
pinMode(2, INPUT);
digitalWrite(1, HIGH);
digitalWrite(2, HIGH);
pinMode(m, INPUT_PULLUP);;
pinMode(led,OUTPUT);
pinMode(boton,INPUT);
digitalWrite(led,HIGH);
estadoactualboton=digitalRead(boton);
PCMSK0 = bit (PCINT1) | bit (PCINT2);
GIMSK = bit (PCIE0);
sei();
}
void loop()
{
energia ();
analogWrite(A7, value);
ultimoestadoboton=estadoactualboton;
estadoactualboton=digitalRead(boton);
if (ultimoestadoboton==LOW && estadoactualboton==HIGH){
estadoled=!estadoled;
digitalWrite(led,estadoled);
}
}
ISR(PCINT0_vect)
{
int MSB = digitalRead(1);
int LSB = digitalRead(2);
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;
}scribe o pega el código aquí