Frecuencia pwm attiny84

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í

modificaciones.zip (39,2 KB)
estoy realizando las modificaciones , subo el archivo con la simulacion para ver si es correcto y me pueden guiar, gracias

Funciona bastante bien, estoy probando las resistencias para regular el lm2596, todo bien solo tengo que refinar las resistencias para tener una regulación más pareja


0hBGi

¿Podrías explicar un poco tu proyecto?

Antes no entendía de que hablabas, o sea, tu primer post no era muy descriptivo que digamos.

Ahora viendo el esquema del circuito no entiendo por qué alimentas un circuito step-down con una tensión variable. :thinking:

Saludos

Es una fuente manejada con el encoder, uso el pwm para mover el integrado, funciona bien, tengo que pulir bien los valores de las resistencias para que la tensión regule lo más parejas posible, de 0.1, 0.2, 0.3 por ahora me funciona cada 0.3 aproximadamente!
La estuve probando y va bien, me falta acomodar mejor el código y estaría, voy a subir los esquemas de la fuente en kicad para que la vean!

Ahora entendí, no había visto que atacabas el feedback y pensaba "para qué variar la entrada de un regulador?".
Mala mía... :man_facepalming:t2:

Saludos

fuente encoder.zip (393,0 KB)

Que subiste, un esquema en Eagle?

En kicad

Ahh pense que era en Proteus para probarlo y seguir el problema del que hablas de los 0.1, 0.2, 0.3.

1 Like

ya lo pude solucionar, variando la ganacia del operacional mas las resistencias de empuje del feedback, voy aprendiendo