Например TDA7294

Форум РадиоКот :: Просмотр темы - Ацп atmega8
Форум РадиоКот
https://radiokot.ru/forum/

Ацп atmega8
https://radiokot.ru/forum/viewtopic.php?f=22&t=144916
Страница 1 из 1

Автор:  anslepnev [ Сб май 06, 2017 06:37:02 ]
Заголовок сообщения:  Ацп atmega8

Здравствуйте, подскажите, пожалуйста, как выводить данные из ADCH на wh0802? И нужно ли использовать таймер при работе ацп? Или можно задать непрерывное преобразование, и если непрерывное, то как считывать данные?

Прошу строго не судить, только начал осваивать...

Автор:  pyzhman [ Сб май 06, 2017 07:25:50 ]
Заголовок сообщения:  Re: Ацп atmega8

Считать регистр ADCH и согласно протоколу общения с ЖКИ вывести оные.
Таймер не обязательно.
Можно. Там взводится флаг об окончании очередного преобразования.

Автор:  mickbell [ Сб май 06, 2017 11:29:47 ]
Заголовок сообщения:  Re: Ацп atmega8

Таки желательно таймер использовать, и по нему забирать данные из АЦП, причём довольно редко (или редко отправлять их в индикатор), иначе цифры мельтешить будут, слишком часто меняясь. Но это уже вопрос эргономики, а не устройства софта.

Автор:  roman.com [ Сб май 06, 2017 13:26:31 ]
Заголовок сообщения:  Re: Ацп atmega8

anslepnev писал(а):
нужно ли использовать таймер при работе ацп?

Нет. Все используют флаг окончания преобразования АЦП:
while ((ADCSRA & 0x10)==0); //...1 .... ADIF - 1- флаг завершения преобразования (1-сброс при каждом Старте. 2-для прерывания очищается аппаратно)
anslepnev писал(а):
Или можно задать непрерывное преобразование

можно... регистр ADCSRA , где:
//1... .... ADEN - 1- вкл ADC.
//.1.. .... ADSC - 1- Старт ADC. При завершении преобразования сбрасывается аппаратно.
//..1. .... ADFR - 1- режим Непрерывного Преобразования.
//...1 .... ADIF - 1- флаг завершения преобразования
-сброс при каждом Старте.
-для прерывания очищается аппаратно
//.... 1... ADIE - 1- Разрешение прерывания
//.... .1.. ADPS2 - предделетель 0 -
//.... ..1. ADPS1 - предделетель 0 - =1/2 тактовой частоты.
//.... ...1 ADPS0 - предделетель 0 -

но зачем непрерывное преобразование?
anslepnev писал(а):
как считывать данные?

читаем ADCH после окончания преобразования (когда установится флаг окончания преобразования). //...1 .... ADIF - 1- флаг завершения преобразования

Автор:  anslepnev [ Сб май 06, 2017 15:19:44 ]
Заголовок сообщения:  Re: Ацп atmega8

спасибо за ответы. Насколько я понял из даташита, преобразованное значение хранится в ADCH:ADCL и битом ADLAR выставляем выравнивание, если мы берем, например, переменную v (напряжение) и записываем, что v=ADCH, предварительно выставив бит ADLAR, то ничего не работает...подскажите, пожалуйста, как правильно выводить (считывать) преобразованное значение?

Автор:  roman.com [ Сб май 06, 2017 17:26:23 ]
Заголовок сообщения:  Re: Ацп atmega8

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, Выравнивание результата в правую сторону). Зачем? Чтобы убрать шум на входе АЦП и шум самого АЦП.

Автор:  anslepnev [ Вс май 07, 2017 08:27:57 ]
Заголовок сообщения:  Re: Ацп atmega8

float v;
InitLcd();
ADMUX=0b01000101; // канал 5
_delay_us(10); // стабилизация входа...
ADCSRA|=0b01000000; // Старт преобразования.
while ((ADCSRA & 0x10)==0); // ждём ADIF - флаг завершении преобразования
ADCSRA|=0x10; // сброс ADIF - флаг завершении преобразования
v=ADCW*0.00489; // (напряжение) (00000011 11111111).
char buffer [10];

//InitADC();
sprintf(buffer, "U=%.1f", v);
LcdWriteCom(0b00000001);
_delay_ms(10);
Send_Str(buffer,10); // Отправляем строку
_delay_ms(100); //Пауза
ADCSRA |=(1<<ADSC); //Запускаем следующее преобразование

while(1);
{
}


Подскажите, пожалуйста, где ошибка в программе, просто текст у меня выводится на wh0802, а вот с выводомданных из ацп проблемы..вместо данных мигающий курсор...

Автор:  roman.com [ Вс май 07, 2017 22:19:52 ]
Заголовок сообщения:  Re: Ацп atmega8

А что если закинуть всё в протеус и глянуть что происходит... подродно.. пошагово)) Или спаять на макетке и всё внимательно посмотреть? ))

Автор:  anslepnev [ Пн май 08, 2017 06:21:59 ]
Заголовок сообщения:  Re: Ацп atmega8

roman.com писал(а):
А что если закинуть всё в протеус и глянуть что происходит... подродно.. пошагово)) Или спаять на макетке и всё внимательно посмотреть? ))


у меня на макетке собрано, на дисплее просто мигающий курсор, а не значения АЦП...

Автор:  mickbell [ Пн май 08, 2017 12:44:41 ]
Заголовок сообщения:  Re: Ацп atmega8

Выведите туда для начала любое число вместо отсчёта АЦП, хотя бы 123, и посмотрите, вывелось ли оно. Очень вероятно, что не работает вывод в 44780 и АЦП тут вовсе не при делах.

Автор:  anslepnev [ Вт май 09, 2017 06:09:36 ]
Заголовок сообщения:  Re: Ацп atmega8

Число выводится на дисплей, текст выводится, в общем статическая индикация работает, где то ошибка в программе, а вот где- никак не пойму

Автор:  mickbell [ Вт май 09, 2017 16:16:05 ]
Заголовок сообщения:  Re: Ацп atmega8

Наблюдаю взаимоисключающие параграфы.
С одной стороны:
на дисплее просто мигающий курсор, а не значения АЦП...
С другой стороны:
Число выводится на дисплей, текст выводится, в общем статическая индикация работает
Так есть индикация или нет её?

Автор:  Ivanoff-iv [ Ср май 17, 2017 19:17:52 ]
Заголовок сообщения:  Re: Ацп atmega8

а почему преобразование написано до цикла, а не внутри? так оно всего 1 раз выполнится.
для поиска неисправности постепенно продвигайся от экрана к ацп (сначала в v какое нибудь число впиши, потом int переменную вместо ADCW подставь...)

Добавлено after 12 minutes 9 seconds:
я полагаю, это ардуино, а в ней функция sprintf не поддерживает формат чисел с плавающей запятой.

Добавлено after 6 minutes:
Самый простой способ преобразования float в текстовую строку – использование функции dtostrf.

char* dtostrf(double data, signed char width, unsigned char prec, char *string)

data – это конвертируемая переменная;
width – число значащих разрядов;
prec – число разрядов после запятой;
char* string – указатель на строку (имя массива).

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/