Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
19.06.2011, 14:15
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Re: Изменить исходный код программы для ATMEGA8
Сообщение от Dimitrij
|
Думал, что все закончилось, ан нет.В Proteus все нормально, а в реалях очень прыгает младший разряд +-1.
|
Выбростье ПРОТЕУС отлаживайте в реале.
ПО поводу что можно сделать - я уже писал про БУФЕР АЦП на 4/8/16/32/64 значения... не обратили внимания. думаете зря о нём писал?
Я ВСЕГДА!!!! фильтрую измерения от АЦП или внешних ножек в буфере, что бы избежать случайных срабатываний. Что то аналогичное подавлению дребезга от клавиш.
И ещё есть алгоритмы вывода на АЛС или ЖКИ которые устраняют плясание младшей цифры.
Сообщение от Dimitrij
|
Пока переписывал программу, немного изучил программирование, во всяком случае понял азы.
|
Это самое быстрое обучение.. когда чтото делаешь что тебе действительно нужно или интересно. А не на примерах от фонаря.
__________________
"picavr(ГАВ)мыло.ру" USB_Analyzer, Digital_Storage_Oscilloscope "picavr.kr1.ru" заказы в Китай компонентов/изготовление: плат/ЖКИ/мембраных клавиатур/имп трансформаторов
Последний раз редактировалось picavr; 19.06.2011 в 14:20.
|
|
|
|
19.06.2011, 16:40
|
|
Временная регистрация
Регистрация: 26.02.2005
Сообщений: 78
Сказал спасибо: 15
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
|
Re: Изменить исходный код программы для ATMEGA8
Сообщение от picavr
|
есть алгоритмы вывода на АЛС или ЖКИ которые устраняют плясание младшей цифры
|
А не подскажете алгоритм?
|
|
|
|
19.06.2011, 16:54
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,445
Сказал спасибо: 99
Сказали Спасибо 315 раз(а) в 231 сообщении(ях)
|
Re: Изменить исходный код программы для ATMEGA8
Ну младший бит, как правило, всегда пляшет на АЦП.
Как вариант - усреднение. Делаете 10 измерений. Результаты измерений складываете. А потом делите на 10. "Плясать" будет заметно меньше.
Ну а чтобы на экране не мельтешило - просто надо выводить на экран не чаще 2-3 раз в секунду.
Можно по-хитрому. Допустим, вывели на экран число 23,6. Если новое показание отличается не более, чем на 0,1 [23,5..23,7], то выводить "старое" число (23,6).
У вас, кстати, в конце цикла while(1) есть задержка.
Уберите там комментарий. Получится 100 задержек по 10 мс. Как раз 1 сек.
Последний раз редактировалось Godzilla82; 19.06.2011 в 16:58.
|
|
|
|
19.06.2011, 18:13
|
|
Временная регистрация
Регистрация: 26.02.2005
Сообщений: 78
Сказал спасибо: 15
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
|
Re: Изменить исходный код программы для ATMEGA8
Сообщение от Godzilla82
|
Получится 100 задержек по 10 мс. Как раз 1 сек.
|
Спасибо, уже лучше.
Уж попутно вопрос: Сколько не собирал я измерителей на МК, везде одно и то же, если выставить показания по максимуму измерений, то в начале диапазона появляется погрешность -1,2 младших разряда. Т.е, если меряю 50в максимум, то при 5в показывает 4.8-4.9в. Это нормально, или можно как-то устранить?
|
|
|
|
19.06.2011, 19:39
|
|
Прохожий
Регистрация: 03.08.2009
Сообщений: 4
Сказал спасибо: 2
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Изменить исходный код программы для ATMEGA8
Чудес не бывает.
{
tmp=read_adc(ADCMUX_I_SET);
tmp *=255;
tmp /=ADCSETDIV;
return (unsigned char)tmp;
}
При максимальном входном напряжении 5В АЦП выдаст код 1023. Вы его умножаете на 255, и делите на те же 1023, естественно, получаете 255, на индикаторах будут цифры 2,5 и 5. Если будете умножать на 511, либо делить на 511, получите нужные цифры.
|
|
|
|
19.06.2011, 21:49
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Re: Изменить исходный код программы для ATMEGA8
Сообщение от Dimitrij
|
Это нормально, или можно как-то устранить?
|
Я же писал в своём посте формулу для вычисления напряжения по результату АЦП. Подобрать коефициент.
Зачем спрашивать, если не читать ответы или не использовать их?
Сообщение от Dimitrij
|
А не подскажете алгоритм?
|
Я писал для своих измерителей так:
Выводим измереное значение на индикатор. Сохраняем его в доп ячейке и записываем в счётчик времени 0.
Каждый раз увеличиваем счётчик на счётчик времени 1;
Сравниваем новое значение и сохранёное.
Если значение изменяется на 1 единицу, ждём пока счётчик достигнет времени 0,5(1) сек, и выводим измереное значение на индикатор. Сохраняем его в доп ячейке и записываем в счётчик счётчик времени 0.
Если значение изменяется на 2 единицы, ждём пока счётчик достигнет времени 0,2(0,5) сек, и выводим измереное значение на индикатор. Сохраняем его в доп ячейке и записываем в счётчик счётчик времени 0.
Если значение изменяется на 3-5 единиц, ждём пока счётчик достигнет времени 0,1(0,2) сек, и выводим измереное значение на индикатор. Сохраняем его в доп ячейке и записываем в счётчик счётчик времени 0.
Если значение изменяется на более 5 единиц, ждём пока счётчик достигнет времени 0,05(0,1) сек, и выводим измереное значение на индикатор. Сохраняем его в доп ячейке и записываем в счётчик счётчик времени 0.
__________________
"picavr(ГАВ)мыло.ру" USB_Analyzer, Digital_Storage_Oscilloscope "picavr.kr1.ru" заказы в Китай компонентов/изготовление: плат/ЖКИ/мембраных клавиатур/имп трансформаторов
Последний раз редактировалось picavr; 19.06.2011 в 21:53.
|
|
|
|
20.06.2011, 00:20
|
|
Временная регистрация
Регистрация: 26.02.2005
Сообщений: 78
Сказал спасибо: 15
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
|
Re: Изменить исходный код программы для ATMEGA8
Сообщение от picavr
|
Зачем спрашивать, если не читать ответы или не использовать их?
|
Зачем сразу пинать, если я все начинаю с нуля.
Не углядел, вникал в суть, а на это
Цитата:
|
что бы коруглялся меньший разряд правильно
|
не обратил внимания.
Сообщение от picavr
|
Я писал для своих измерителей так:
|
Я так понял, что это связано с таймерами и сравнением. Это слишком много для начинающего.
Может подскажете, как это делается в СИ?
|
|
|
|
20.06.2011, 00:51
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Re: Изменить исходный код программы для ATMEGA8
Сообщение от Dimitrij
|
Я так понял, что это связано с таймерами и сравнением. Это слишком много для начинающего.
|
Ну это ваше дело, воспринимать или нет )))
Я например начинал, когда даже дитературы не было на русском по микроконтролерам.. так что до всего доходил по даташитам и своей головой.. форумов ещё небыло практически рускоязычных. О Си, даже речи не было.
Сообщение от Dimitrij
|
Может подскажете, как это делается в СИ?
|
Методов великоое множество как будет душ угодно. Мной всё писалось давно и потому на ассемблере для PIC было написано. На Cи примерно МОЖЕТ выглядеть примерно так:
Код:
|
#define period_chng_indication //здесь задать период вызова функции индикации в микросекундах в вашей программе
#define time_indication_0=500000 / period_chng_indication //0,5сек
#define time_indication_1=250000 / period_chng_indication //0,25сек
#define time_indication_2=100000 / period_chng_indication //0,1сек
#define time_indication_3=50000 / period_chng_indication //0,05сек
unsigned char previos_data,new_data;
unsigned int cunter_time_indication;
if(previos_data==new_data){cunter_time_indication= 0;return;}
temp=previos_data-new_data;
if(previos_data‹new_data){temp=new_data-previos_data;}
if(temp==1)
{
if(cunter_time_indication++›time_indication_0)
{
previos_data=new_data;
out_indication(new_data);
cunter_time_indication=0;
return;
}
}
if(temp==2)
{
if(cunter_time_indication›time_indication_1)
{
previos_data=new_data;
out_indication(new_data);
cunter_time_indication=0;
return;
}
}
if(temp‹5)
{
if(cunter_time_indication›time_indication_2)
{
previos_data=new_data;
out_indication(new_data);
cunter_time_indication=0;
return;
}
}
if(temp›4)
{
if(cunter_time_indication›time_indication_3)
{
previos_data=new_data;
out_indication(new_data);
cunter_time_indication=0;
return;
}
} |
вам нужно вместо out_indication(new_data) воткнуть вызов функции преобразования из двоичного в двоично-десятичный вид и пересылки в перемменные для функцию вывода на АЛС. И определить период вызова этой функции в начале. Желательно несколько милисек.
__________________
"picavr(ГАВ)мыло.ру" USB_Analyzer, Digital_Storage_Oscilloscope "picavr.kr1.ru" заказы в Китай компонентов/изготовление: плат/ЖКИ/мембраных клавиатур/имп трансформаторов
Последний раз редактировалось picavr; 20.06.2011 в 13:42.
|
|
|
|
20.06.2011, 01:07
|
|
Временная регистрация
Регистрация: 26.02.2005
Сообщений: 78
Сказал спасибо: 15
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
|
Re: Изменить исходный код программы для ATMEGA8
Сообщение от picavr
|
На Cи примерно МОЖЕТ выглядеть примерно так:
|
Спасибо, буду пробовать!
|
|
|
|
20.06.2011, 20:13
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,445
Сказал спасибо: 99
Сказали Спасибо 315 раз(а) в 231 сообщении(ях)
|
Re: Изменить исходный код программы для ATMEGA8
PHP код:
|
unsigned int display_tmp = 0;
unsigned char time = 0;
unsigned int display(unsigned int value)
{
unsigned char update = 0;
delta = abs(value-display_data);
time++;
switch(time)
{
case 1: if(delta›10) update = 1; // 100 ms
break;
case 2: if(delta›5) update = 1; // 200 ms
break;
case 3: if(delta›3) update = 1; // 300 ms
break;
case 4: if(delta›1) update = 1; // 400 ms
break;
else update = 1;
}
if(update) {
display_tmp = value;
time = 0;
}
return display_tmp;
}
|
Аналог вышеуказанного. Эту функцию вызывать через 100 мс.
Допустим, функция out(value) выводит значение переменной value на экран. Участок кода примерно такой:
PHP код:
|
tmp = get_adc();
out(tmp);
|
Чтобы отображалось согласно алгоритму, надо поменять:
PHP код:
|
tmp = get_adc();
tmp = display(tmp);
out(tmp);
|
Последний раз редактировалось Godzilla82; 20.06.2011 в 20:18.
|
|
|
Сказали "Спасибо" Godzilla82
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 23:13.
|
|