Пытался найти здесь, или нагуглить подобную проблему где-то еще, но это не помогло. Как и не помогло повторное чтение даташита ATMEGA16.
Суть проблемы такова: какие бы я ни задавал частоты ADC (как частотой атмеги (1-8MHz), так и прескалером (upto 128)), он, ADC, измеряет только до 0.5В, что соответствует 200 единицам, несмотря на оговоренную 10-тибитную точность. Дальше он застревает на цифре 200, какое бы напряжение ни было приложено на ногу.
Измеряется в режиме single-ended, то есть от GND, опорное напряжение - встроенное 2.56В.
Проект пишется в CodeVisionAVR, функция read_adc создана самой CodeVisionAVR и выглядит следующим образом:
Код: Выделить всё
// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
Начальная инициализация ADC (генерируется мастером cvavr):
Код: Выделить всё
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// ADC initialization
// ADC Clock frequency: 250,000 kHz
// ADC Voltage Reference: Int., cap. on AREF
// ADC Auto Trigger Source: None
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x85;
Пните меня, пожалуйста, в правильном направлении, как правильно задействовать ADC на ATMega16.


