Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
03.04.2010, 01:28
|
|
Частый гость
Регистрация: 21.03.2008
Сообщений: 43
Сказал спасибо: 25
Сказали Спасибо 1 раз в 1 сообщении
|
Как вывести данные из АЦП на индикатор
Доброго времени суток всем! Прошу сильно не пинать, если эта тема уже рассматривалась, я не нашел для себя ничего. Я новичёк в программировании. В общем, задача такая. Есть ATmega8. В нём 10-ти разрядный АЦП. Измеряем напряжение. Как полученные 10 бит преобразовать и вывести на ЖКИ типа 1602 (2строки по 16 символов). С самим индикаторм я работать умею. Мне нужен алгоритм преобразования, но только на ассемлере, языка С я не знаю. Готовых вольтметров, конечно, полно, но нужен сам принцип. Заранее спасибо всем, кто откликнется!
|
|
|
|
03.04.2010, 03:09
|
|
Вид на жительство
Регистрация: 14.10.2009
Сообщений: 338
Сказал спасибо: 35
Сказали Спасибо 92 раз(а) в 73 сообщении(ях)
|
Re: Как вывести данные из АЦП на индикатор
Выводить просто на ЖК можно на Си с помощью встроенных в компилятор CVAVR библиотек.
Выучить базу на си проще чем писать на асме для простой какойто задачи весь код.
Далее текст для тех кто мучается с проблемой вывода на 7ми сегментник
(Компилятор CVAVR)
PHP код:
|
// Приготовления
#define MINUSSIGN 1
int DigitCount=4; //
unsigned long int displaydata=присваеваем тут гдето из данных АЦП; //Данные для вывода char Display_Buffer[DigitCount]; //Дисплей буфера для вывода CharacterMap[]= { /*сюда построчно пишем коды символов которые хотим выводить можно по порядку соответствовать к примеру индекс ноль соответствует символу ноль. пример символов после кода */};
unsigned long int num, lastnum; //Переменные для деления данных //---------------------------------------------------------------
//Код автоматически подстраивается под пределы измерений и отсекает //слишком высокие данные
//Вывод идет Справа на лево //Младший бит буфера правее num = displaydata; if ((displaydata › 0)&&(displaydata ‹ 1000000)) { //Если значение в пределе допустимого то выводим в буфер while (num›0) { //Обязательно крутим пока строго больше нуля while (num›10000) { // если выходим за разрядность но все еще в пределах вычислений то //делим на 10 пока не достигнем отображаемой разрядности //максимальной в (9999 для 4хсегментного индикатора) num=num/10; } DigitCount--; //Смещаем разряд lastnum = num % 10; //Берем остаток от очередног деления на 10 num = (num - lastnum) / 10; //Смещаем на десятичный разряд вправо все наше число Display_Buffer[DigitCount]=CharacterMap[lastnum]; //Пишем в буфер символ соответствующий коду } } else if (displaydata › 1000000) { //Показываем минусы во всех разрядах если перебор по счету или выводимым пределам Display_Buffer[0]=MINUSSIGN; Display_Buffer[1]=MINUSSIGN; Display_Buffer[2]=MINUSSIGN; Display_Buffer[3]=MINUSSIGN; }
|
Код:
|
Характеристика выводов МК при выдаче на 7сегментник:
7Seg b f a e d . c g
PORTx 7 6 5 4 3 2 1 0
Симв BIN HEX
0 11111010 0xFA
1 10000010 0x82
2 10111001 0xB9
3 10101011 0xAB
4 11000011 0xC3
5 01101011 0x6B
6 01111011 0x7B
7 10100010 0xA2
8 11111011 0xFB
9 11101011 0xEB
A 11110011 0xF3
b 01011011 0x5B
C 01111000 0x78
d 10011011 0x9B
E 01111001 0x79
F 01110001 0x71
G 01111010 0x7A
h 01010011 0x53
I 01010000 0x50
L 01011000 0x58
n 00010011 0x13
q 11100011 0xE3
r 00010001 0x11
o 00011011 0x1B
P 11110001 0xF1
t 01011011 0x5B
U 11011010 0xDA
У 11001011 0xCB
- 00000001 0x01
с 00011001 0x19
u 00011010 0x1A
¬ 10100000 0xA0
_ 00001000 0x08
] 10101010 0xAA
¯ 00100000 0x20
º 11100001 0xE1
ǁ 11010010 0xD2
ʴ 00001010 0x0A
ʳ 01100000 0x60 |
Последний раз редактировалось MasterMushi; 03.04.2010 в 03:55.
|
|
|
|
03.04.2010, 07:01
|
|
Почётный гражданин KAZUS.RU
Регистрация: 09.12.2007
Адрес: Новосибирск
Сообщений: 1,021
Сказал спасибо: 10
Сказали Спасибо 70 раз(а) в 63 сообщении(ях)
|
Re: Как вывести данные из АЦП на индикатор
Сообщение от lvadia
|
Если измеренное значение, больше 1000 - прибавляем 1 к переменной "тысяча"...и отнимаем от результата измерения 1000....дальше то же самое с сотнями и десятками...
999 › 100 прибавляем единицу к переменной "сотни" ("сотни" ="сотни"+1) и вычитаем 999-100= 899...
899 › 100 и т.д... надеюсь понятно
в конце концов, получаем 4 переменных...их и выводим на индикатор)
|
Правда сначала нужно ваш результат привести в соответствие
измеряемому напряжению.
Например при опорном 2,56В, лучше его сделать внешним и подстраиваемым в небольших пределах,
результат умножте на 10, а затем поделите на 4.
И потом уже преобразование в двоично-десятичный код для дальнейшего вывода на индикатор. Получите 4х разрядное двоично-дес. число,
младший разряд - выкинуть.
__________________
И на камнях растут деревья!
Последний раз редактировалось domowoj; 03.04.2010 в 12:08.
|
|
|
|
03.04.2010, 12:12
|
|
Частый гость
Регистрация: 17.11.2009
Сообщений: 31
Сказал спасибо: 3
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
|
Re: Как вывести данные из АЦП на индикатор
1. Преобразовать двоичное значение в десятичное (FF -›255)
2. Разложить 256 на 2, 5, 5 (например в регистр Р1 = 2, Р2 = 5, Р3=5)
3. Вывести значения вподряд на индикатор (с адреса который необходим, цифры лягут вподряд если настроить соответствующим образом индикатор) в виде: цифровое значение + С0F...
Алгоритм по п1:
- отнимаете от значения 100, до переполнения - результат сотни
- отнимаете от остатка 10, до переполнения - результат десятки
- остаток единицы.
Последний раз редактировалось Victor_72; 03.04.2010 в 12:17.
|
|
|
|
03.04.2010, 13:29
|
|
Частый гость
Регистрация: 21.03.2008
Сообщений: 43
Сказал спасибо: 25
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Как вывести данные из АЦП на индикатор
Спасибо всем, идея вроде бы понятна. Только вот это непонятно:
"Например при опорном 2,56В, лучше его сделать внешним и подстраиваемым в небольших пределах,
результат умножте на 10, а затем поделите на 4."
Вот что написано в дш на ATmega8:
Результат А/Ц преобразования:
ADC= Vin*1024/Vref
где Vin-входное напряжение
Vref-опорное напряжение
отсюда должно быть так:
Vin=ADC*Vref/1024
вроде бы?
У меня опорное напряжение 5В.
Таким образом Vin=ADC*5/1024
получаем значение напряжения Vin в двоичном коде,
затем
"Алгоритм по п1:
- отнимаете от значения 100, до переполнения - результат сотни
- отнимаете от остатка 10, до переполнения - результат десятки
- остаток единицы."
Правильно?
|
|
|
|
03.04.2010, 14:55
|
|
Почётный гражданин KAZUS.RU
Регистрация: 09.12.2007
Адрес: Новосибирск
Сообщений: 1,021
Сказал спасибо: 10
Сказали Спасибо 70 раз(а) в 63 сообщении(ях)
|
Re: Как вывести данные из АЦП на индикатор
Сообщение от jafarkiller
|
Только вот это непонятно:
|
Допустим при опорном 5В и входном 5В ADC=1024
и какое число вы будете выводить на индикатор???
Вам нужно вывести 500, а у вас 1024.
Можно конечно опорное сделать 5.12В(2,56х2).
Тогда 5,12В входного соответствует код 1024,
поделив который на 2 получим 512, т.е. то число , кот. можно вывести на инд.
преобразовав конечно в дв.-десятичный код.
Почему умножить на 10.
Чтобы не потерять точности при делении(единичка младшего разряда результата может теряться)
__________________
И на камнях растут деревья!
|
|
|
Сказали "Спасибо" domowoj
|
|
|
03.04.2010, 18:43
|
|
Частый гость
Регистрация: 17.11.2009
Сообщений: 31
Сказал спасибо: 3
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
|
Re: Как вывести данные из АЦП на индикатор
Можно в цифровом виде привести - поделить на 2 (при опорном=Uпит = 5,12V)
А я делил входным R-R делителем, два резистора по 10К - на измерение от средней точки... и диапазон получается 0-10V, и с преобразованием не надо париться... нужно только запятую в нужном сегменте не забыть включить....
А если делитель поставить R-9R то и 0-100V, у меня например реализовано R-99R т.е. до 1000V...
Последний раз редактировалось Victor_72; 03.04.2010 в 18:46.
|
|
|
Сказали "Спасибо" Victor_72
|
|
|
03.04.2010, 20:19
|
|
Частый гость
Регистрация: 21.03.2008
Сообщений: 43
Сказал спасибо: 25
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Как вывести данные из АЦП на индикатор
Всем спасибо, врубился
|
|
|
|
03.04.2010, 22:18
|
|
Почётный гражданин KAZUS.RU
Регистрация: 09.12.2007
Адрес: Новосибирск
Сообщений: 1,021
Сказал спасибо: 10
Сказали Спасибо 70 раз(а) в 63 сообщении(ях)
|
Re: Как вывести данные из АЦП на индикатор
И еще.
Опорное 5.12В может быть при условии питания МК напряжением,
большим или равным опорному.
__________________
И на камнях растут деревья!
|
|
|
|
05.04.2010, 06:14
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Re: Как вывести данные из АЦП на индикатор
Сообщение от domowoj
|
лучше его сделать внешним и подстраиваемым в небольших пределах,
результат умножте на 10, а затем поделите на 4.
|
Делаю по другому.
Умножаю на коефициент 1-65535. Коефициент получатся при калибровке. и делю на 1024 (сдвиг на 10 разрядов)
Допустим. Имеем пиание 4,95V. Подаём ровно 1В на вход и зпускаем режим калибровки.
АЦП = 1000/(4950/1024) = 1000 / 4.834 = 206.8
коефициент равен К = 1V*1000(кратно 1mV)*1024 / 206 = 4970
коефициент равен К = 1V*100(кратно 10mV)*1024 / 206 = 497
коефициент равен К = 1V*10(кратно 0.1V)*1024 / 206 = 49
А теперь при измерении:
АЦП = 155 * 4970 / 1024 = 0.752 V
АЦП = 155 * 497 / 1024 = 0.75 V
АЦП = 155 * 49 / 1024 = 0.7 V
АЦП = 391 * 4970 / 1024 = 1.898 V
АЦП = 391 * 497 / 1024 = 1.89 V
АЦП = 391 * 49 / 1024 = 1.8 V
__________________
"picavr(ГАВ)мыло.ру" USB_Analyzer, Digital_Storage_Oscilloscope "picavr.kr1.ru" заказы в Китай компонентов/изготовление: плат/ЖКИ/мембраных клавиатур/имп трансформаторов
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 11:53.
|
|