Estaba intentando simular en proteus ADC con un potenciómetro y obtener la lectura para controlar el motor de corriente continua con PWM, pero el problema es que el valor de ADC no es exacto. ADCH alcanza el valor máximo antes de que el potenciómetro sea 100%. No sé por qué este comportamiento. Espero que puedas explicármelo. Aquí está el código.
#include <avr/io.h>
#define F_CPU 1000000UL
#include <util/delay.h>
void pwm_init()
{
DDRB |= (1<<PB3);
TCCR0 |= (1<<WGM00) | (1<<WGM01) | (1<<COM01) | (1<<CS01);
OCR0 = 0x00;
}
void adc_init()
{
DDRA =0x00;
ADMUX |= (1<<REFS0);// AVCC ref
ADCSRA |= (1<<ADEN) | (1<<ADPS2) | (1<<ADLAR) | (1<<ADATE); // 1MHZ With
prescaler 8 gives adc freq 125 khz
}
uint8_t adc_read()
{
ADCSRA |= (1<<ADSC);
while(!(ADCSRA && (1<<ADIF)));
ADCSRA |= (1<<ADIF);
return ADC;
}
int main(void)
{
pwm_init();
adc_init();
while (1)
{
OCR0 = adc_read();
}
}
También puede ver que el ciclo de trabajo de la imagen siguiente es casi del 100%, mientras que el potenciómetro es solo del 12%.