//0 25 50 75 100 %
// 0% = 0v
//freq pwm = 488hz
//timer prescalador = 16Mhz / (488 hz * 256 ) = 128
#include "etry.h"
#define CHANNEL 8
timer2_init() {
//considerando que el micro recien arranco
TCCR2A = (1<< COM2A1) | 3; //WGM1 y WGM0 high
TCCR2B = 5; //prescalar en 128
TCNT2 = 0;
OCR2A = 128; //el led siempre arranca prendido, se actualiza al instante con el valor del adc
}
adc_init( uint8_t channel ) {
ADMUX = (1<<REFS0) | (1<<ADLAR) | (channel & 0x07) ; //se van a ignorar los lsb
ADCSRB = ((1<<MUX5) & channel); // ningun preescalador, se agarra el bit 3 del channel
//para configurar el canal, no es necesario hacer
//nada porque curiosamente MUX5 puede hacer directamente la bandera
ADCSRA = (1<<ADEN) | 3 ; //se habilita el ADC
}
uint8_t ADC_Read(void)
{
uint8_t result = 0;
ADCSRA |= (1 << ADSC);
while (ADCSRA & (1 << ADSC))
;
result = (uint8_t) ADCH;
return result;
}
void set_workcycle(uint8_t power) {
PORTF = power;
if (power == 0) {
// Apagar el temporizador
TCCR2A = 0;
TCCR2B = 0;
OCR2A = 0; // Asegurarse de que la salida PWM sea 0
} else {
// Configurar el temporizador para generar PWM
TCCR2A = (1 << WGM20) | (1 << WGM21) | (1 << COM2A1); // Fast PWM, clear OC2A on compare match
TCCR2B = (5 << CS20); // No prescaler
if (power <= 64) {
OCR2A = 64;
} else if (power >= 65 && power <= 127) {
OCR2A = 127;
} else if (power >= 128 && power <= 191) {
OCR2A = 191;
} else {
OCR2A = 0; // Valor máximo para una señal PWM del 100%
}
}
}
void main () {
DDRB = 1<<PB4;
DDRF = 0xFF;
timer2_init();
adc_init ( CHANNEL );
while (1) {
set_workcycle(ADC_Read());
}
}