Ацп atmega8

Все прочитали, вроде даже поняли, взяли паяльник - а нифига не получается? Скорее сюда! Поможем. Чем можем...
Ответить
Родился
Сообщения: 5
Зарегистрирован: Чт янв 28, 2016 04:55:27

Сообщение anslepnev »

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

Прошу строго не судить, только начал осваивать...
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Считать регистр ADCH и согласно протоколу общения с ЖКИ вывести оные.
Таймер не обязательно.
Можно. Там взводится флаг об окончании очередного преобразования.
Docendo discimus
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 16593
Зарегистрирован: Пт мар 30, 2012 05:17:29
Откуда: Екатеринбург

Сообщение mickbell »

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

На каждый РКН
Найдётся VPN.
Друг Кота
Сообщения: 9180
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

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- флаг завершения преобразования
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 5
Зарегистрирован: Чт янв 28, 2016 04:55:27

Сообщение anslepnev »

спасибо за ответы. Насколько я понял из даташита, преобразованное значение хранится в ADCH:ADCL и битом ADLAR выставляем выравнивание, если мы берем, например, переменную v (напряжение) и записываем, что v=ADCH, предварительно выставив бит ADLAR, то ничего не работает...подскажите, пожалуйста, как правильно выводить (считывать) преобразованное значение?
Реклама
Друг Кота
Сообщения: 9180
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

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, Выравнивание результата в правую сторону). Зачем? Чтобы убрать шум на входе АЦП и шум самого АЦП.
Реклама
Родился
Сообщения: 5
Зарегистрирован: Чт янв 28, 2016 04:55:27

Сообщение anslepnev »

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, а вот с выводомданных из ацп проблемы..вместо данных мигающий курсор...
Друг Кота
Сообщения: 9180
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

А что если закинуть всё в протеус и глянуть что происходит... подродно.. пошагово)) Или спаять на макетке и всё внимательно посмотреть? ))
Родился
Сообщения: 5
Зарегистрирован: Чт янв 28, 2016 04:55:27

Сообщение anslepnev »

roman.com писал(а):А что если закинуть всё в протеус и глянуть что происходит... подродно.. пошагово)) Или спаять на макетке и всё внимательно посмотреть? ))
у меня на макетке собрано, на дисплее просто мигающий курсор, а не значения АЦП...
Друг Кота
Аватара пользователя
Сообщения: 16593
Зарегистрирован: Пт мар 30, 2012 05:17:29
Откуда: Екатеринбург

Сообщение mickbell »

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

На каждый РКН
Найдётся VPN.
Родился
Сообщения: 5
Зарегистрирован: Чт янв 28, 2016 04:55:27

Сообщение anslepnev »

Число выводится на дисплей, текст выводится, в общем статическая индикация работает, где то ошибка в программе, а вот где- никак не пойму
Друг Кота
Аватара пользователя
Сообщения: 16593
Зарегистрирован: Пт мар 30, 2012 05:17:29
Откуда: Екатеринбург

Сообщение mickbell »

Наблюдаю взаимоисключающие параграфы.
С одной стороны:
[uquote="anslepnev",url="/forum/viewtopic.php?p=3100149#p3100149"]на дисплее просто мигающий курсор, а не значения АЦП...[/uquote]С другой стороны:
[uquote="anslepnev",url="/forum/viewtopic.php?p=3100935#p3100935"]Число выводится на дисплей, текст выводится, в общем статическая индикация работает[/uquote]Так есть индикация или нет её?
И хрюкотали зелюки,
Как мюмзики в мове.

На каждый РКН
Найдётся VPN.
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

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

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

Добавлено after 6 minutes:
[uquote="Другой сайт по ардуинам ",url="http://mypractic.ru/urok-30-tekstovye-stroki-v-arduino-konvertirovanie-dannyx-v-stroki-i-naoborot-klass-string.html"]Самый простой способ преобразования float в текстовую строку – использование функции dtostrf.

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

data – это конвертируемая переменная;
width – число значащих разрядов;
prec – число разрядов после запятой;
char* string – указатель на строку (имя массива).[/uquote]
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Ответить

Вернуться в «Практика»