anslepnev писал(а):
подскажите, пожалуйста, как правильно выводить (считывать) преобразованное значение?
В АЦП mega8 два регистра настройки:
ADMUX и
ADCSRA.
Значение АЦП хранится в ADCH (00000011):ADCL(11111111) или ADCW(00000011 11111111).
Подробней:
----------
Регистр
ADMUX (00000000), где:
//1... .... REFS1 - опорное напряжение
//.1.. .... REFS0 - опорное напряжение
//..1. .... ADLAR - Выравнивание результата
//...1 .... -
//.... 1... MUX3 - номер канала
//.... .1.. MUX2 - номер канала
//.... ..1. MUX1 - номер канала
//.... ...1 MUX0 - номер канала
---------- подробней:
//REFS1=0 REFS0=0 - ИОН=AREF
//REFS1=0 REFS0=1 - ИОН=AVCC
//REFS1=1 REFS0=0 - не используется (зарезервировано)
//REFS1=1 REFS0=1 - ИОН=2.56V (встроенный ИОН 2.56V)
//ADLAR=1
// Выравнивание результата в левую сторону < (8-бит):
// ADCH // 1111 1111 - читать первым ????????????????????????????????????????
// ADCL // 0000 0000 -
читать первым ????????????????????????????????????? ...
Надо уточнить по даташиту... не помню))//ADLAR=0
// Выравнивание результата в правую сторону > (10-бит):
// ADCH // 0000 0011 - читать вторым
// ADCL // 1111 1111 -
читать первым !!! ----------
// MUX3...MUX0 - номер канала:
// 0000 - ADC0
// 0001 - ADC1
// .................
// 0111 - ADC7
----------
Регистр
ADCSRA (00000000), где:
//1... .... ADEN - 1- вкл ADC.
//.1.. .... ADSC - 1- Старт. При завершении преобразования сбрасывается аппаратно.
//..1. .... ADFR - 1- режим Непрерывного Преобразования.
//...1 .... ADIF - 1- флаг завершения преобразования
-сброс программно.
-для прерывания очищается аппаратно
//.... 1... ADIE - 1- Разрешение прерывания
//.... .1.. ADPS2 - предделетель 0 -
//.... ..1. ADPS1 - предделетель 0 - =1/2 тактовой частоты.
//.... ...1 ADPS0 - предделетель 0 -
---------- подробней:
предделитель ADC:
ADPS2 -ADPS1 -ADPS0
// 000: 1 МГц/2=500.000 Hz
// 001: 1 МГц/2=500.000 Hz
// 010: 1 МГц/4=200.000 Hz
// 011: 1 МГц/8=125.000 Hz
// 100: 1 МГц/16=62.500 Hz
// 101: 1 МГц/32=31.250 Hz
// 110: 1 МГц/64=15.625 Hz
// 111: 1 МГц/128=7.812,5 Hz
----------
Чтобы не забивать себе мозги с ADCH:ADCL, делаем по другому:
Берем, например, переменную v (
Int (00000000 00000000)) (напряжение) и записываем v=ADCW; (00000011 11111111).
----------
Рабочий пример (вариант 1):
int v;
ADMUX=0b01000101; // канал 5
delay_us(10); // стабилизация входа...
ADCSRA|=0b01000000; // Старт преобразования.
while ((ADCSRA & 0x10)==0);
// ждём ADIF - флаг завершении преобразованияADCSRA|=0x10;
// сброс ADIF - флаг завершении преобразованияv=ADCW; // (напряжение) (00000011 11111111).
----------
Рабочий пример (вариант 2):
int v;
ADMUX=0b01000101; // канал 5
delay_us(10); // стабилизация входа...
ADCSRA|=0b01000000; // Старт преобразования.
while (ADCSRA & 0b01000000);
// ADSC - При завершении преобразования этот бит сбрасывается аппаратно.v=ADCW; // (напряжение) (00000011 11111111).
----------
P.S. Даже если мне достаточно точности измерения АЦП 8-бит, я настраиваю АЦП в режим 10-бит (ADLAR=0, Выравнивание результата в правую сторону). Зачем? Чтобы убрать шум на входе АЦП и шум самого АЦП.