Начал ковыряться с AVRками (есть некий опыт на PIC), пытаюсь использовать модуль АЦП.
Хочу узнать цифровое значение напряжения на ножке ADC0 относительно земли, опорное напряжение - напряжение питания. Выравнивание налево, чтобы получить 256 градаций.
Изначально между ножкой и землей стоит резистор 100К.
Пишу на WinAVR С.
Соотетственно, задаем в настройках:
Код
ADMUX = 0b00100000;
// 00xxxxxx - VCC used as Voltage Reference, disconnected from PB0 (AREF).
// xx1xxxxx - Выравнивание налево
// xxx0xxxx - REFS2=0, используем внешнее напряжение
// xxxx0000 - MUX: Single Ended Input: ADC0 (PB5)
ADCSRA = 0b11000011;
// 1xxxxxxx - ADEN=1, включить ацп
// x1xxxxxx - ADSC=1, включаем преобразование
// xx0xxxxx - ADATE=0
// xxx0xxxx - ADIF=0
// xxxx0xxx - ADIE=0, прерывания не требуются
// xxxxx011 - ADPS, делитель на 8
После инициализации запускается первое преобразование, его и последующие отлавливаю в главном цикле
Код
while (1)
{
wdt_reset();
adcPoll();
}
Сама функция обработки такая:
Код
static void adcPoll(void)
{
// Если преобразование АЦП окончено
if (!(ADCSRA & (1 << ADSC)))
{
uchar result = ADCH;
// … некие преобразования …
// Последующий запуск АЦП, ножки не меняю
ADCSRA |= (1 << ADSC);
}
}
Меня… эээ…. смущает то, что на ножке ADC0 при подачи питания (только при наличествующем МК) возникает напряжение порядка 1,7В и АЦП с радостью его измеряет…
Попутно периодически случаются перезагрузки микроконтроллера.
Где косяк, как его можно исправить?
Сообщение отредактировал Urvin - Sep 23 2009, 15:25