Страница 1 из 1

Переделать АЦП на Atmega8

Добавлено: Пн фев 17, 2014 14:17:33
kk042fjv
Добрый день!
Нужна Ваша помощь. Сделал я небольшой приборчик. Хочу его чуть переделать, но пока не могу понять как. Стоит у меня датчик давления MPX с него сигнал поступает на АЦП и информация выводиться на ЖК. но сигнал подается импульсами максимальная частота 1Гц. и естественно цифры скачут, можно ли как-нибудь сделать, чтоб показания давления как-нибудь задерживалось на экране секунд на десять потом обновлялось, ну как то так.

Скидываю исходник и проект в протеусе.

Re: Переделать АЦП на Atmega8

Добавлено: Пн фев 17, 2014 15:26:54
kobzar
ну так в функции мейн в конце поставьте _delay_ms(xxxx);
и укажите частоту с которой бйдет обновляться содержимое екрана!

Re: Переделать АЦП на Atmega8

Добавлено: Вт фев 18, 2014 08:45:58
kk042fjv
kobzar писал(а):ну так в функции мейн в конце поставьте _delay_ms(xxxx);
и укажите частоту с которой бйдет обновляться содержимое екрана!
Я как понял Вы имеете ввиду

void main(void)
...
lcd_init(20);
lcd_clear();
delay_ms(xxxx);

я правильно понял?

Re: Переделать АЦП на Atmega8

Добавлено: Вт фев 18, 2014 09:01:19
ploop
Лучше сделать усреднение, примерно так (пишу на коленке):

Код: Выделить всё

static unsigned char counter = 0;
static unsigned int tmp_data = 0;
tmp_data += ADCW;
if (++counter == 32)
{
  data = tmp_data >> 5 // можно tmp_data / 32, но сдвиг быстрее
  tmp_data = 0;
  counter = 0;
}
Вместо 32х отсчётов можно взять побольше.

Re: Переделать АЦП на Atmega8

Добавлено: Вт фев 18, 2014 10:28:17
kobzar
а чем делей не угодил в данном случае? Человеку же просто задержка надо на вывод данных :)
пусть поставит
_delay_ms(5000);
как раз и получит изменение данных на екран с частотой 5 секунд
не вижу смысла делать задержку на счетчтике в данном случае :)

Re: Переделать АЦП на Atmega8

Добавлено: Вт фев 18, 2014 15:43:31
ploop
kobzar писал(а):не вижу смысла делать задержку на счетчтике в данном случае
Какая задержка на счётчике??? Там фильтр, среднее арифметическое. Который, при больших значениях счётчика, будет выполнять роль задержки. Двух зайцев короче.

А фильтр нужен потому, что я работал с этим датчиком, и без фильтра, либо конкретного опыта в разводке аналоговой части, он покажет погоду на Марсе.

Re: Переделать АЦП на Atmega8

Добавлено: Вт фев 18, 2014 16:51:52
kobzar
Ну тогда ваш метод значительно правильней :)

Re: Переделать АЦП на Atmega8

Добавлено: Вт фев 18, 2014 16:52:00
pyzhman
Некрасиво как-то - накапливать, а потом рассчитывать. Надо бы сразу. Так - плавнее.

Re: Переделать АЦП на Atmega8

Добавлено: Вт фев 18, 2014 17:21:39
kobzar
так указали же причину
А фильтр нужен потому, что я работал с этим датчиком, и без фильтра, либо конкретного опыта в разводке аналоговой части, он покажет погоду на Марсе.

Re: Переделать АЦП на Atmega8

Добавлено: Вт фев 18, 2014 18:37:13
ploop
pyzhman писал(а):Надо бы сразу. Так - плавнее.
Если время обновления ~1 сек то не критично. Скользящее среднее применять надо когда обновления нужны каждый отсчёт.
Да и алгоритм без буфера не помню, хотя он был у меня в заначках :)

Re: Переделать АЦП на Atmega8

Добавлено: Чт фев 20, 2014 08:26:47
kk042fjv
Наконец то попал я за компьютер. Сделал я задержку в 2 сек, на моем устройстве этого достаточно, спасибо что подсказали. А если сделать усреднение я как понял у меня не будет цифры скакать от 0 до 5 (к примеру). а всегда будут на экране гореть среднее показание например 4. Я Вас правильно понял?

Re: Переделать АЦП на Atmega8

Добавлено: Чт фев 20, 2014 08:35:46
pyzhman
Смотря какое среднее (точность), смотря какая величина усреднения.
kk042fjv писал(а):...задержку в 2 сек...этого достаточно
Не надо переделывать. Как известно, лучшее - враг хорошего. :))

Re: Переделать АЦП на Atmega8

Добавлено: Чт фев 20, 2014 08:53:33
ploop
kk042fjv писал(а):А если сделать усреднение я как понял у меня не будет цифры скакать от 0 до 5 (к примеру). а всегда будут на экране гореть среднее показание например 4. Я Вас правильно понял?
Не совсем так.
С задержкой, как вы сейчас сделали, у вас на экран выводится мгновенное значение сигнала. Ну например, АЦП видит такие значение:

Код: Выделить всё

3333333333333353333333333333 - В реале
    ^         ^          ^   - Периоды обновления
3333333333333355555555555333 - На экране
То есть из-за любой помехи у вас 2 секунды будут неверные показания, в случае усреднения даже по 10 отсчётам у вас в нижнем ряду будут все тройки.

Для измерения атмосферного давления я вообще усреднял по 65536 отсчётам :))

Re: Переделать АЦП на Atmega8

Добавлено: Чт фев 20, 2014 12:10:04
Alkul
pyzhman писал(а):Некрасиво как-то - накапливать, а потом рассчитывать. Надо бы сразу. Так - плавнее.
Оно и получается сразу.
Вот тут я писал об этом.
При любой длине буфера усреднения результат выдается после каждого измерения. Не надо ничего накапливать, а потом выдавать.

Re: Переделать АЦП на Atmega8

Добавлено: Чт фев 20, 2014 12:14:33
ploop
Есть алгоритм без буфера. Если надо сделать сильное усреднение никакой памяти не хватит.

Re: Переделать АЦП на Atmega8

Добавлено: Чт фев 20, 2014 13:12:13
Alkul
ploop писал(а):Есть алгоритм без буфера.
Есть. Например, фильтрация Калмана. Глубина "усреднения" регулируется, причем скорость реакции на единичное возмущение выше, чем у алгоритма с обычным "скользящим" усреднением.

Re: Переделать АЦП на Atmega8

Добавлено: Чт фев 20, 2014 13:17:01
ploop
А, вот ещё, забыл: http://we.easyelectronics.ru/Theory/che ... filtr.html
Там в конце пример кода. Проще некуда.

Но ещё раз говорю - автору он не нужен. Ему среднее арифметическое с усреднением до посинения. Количеством отсчётов подобрать задержку. Как раз будет среднее за интервал обновления, что ему и надо.

Re: Переделать АЦП на Atmega8

Добавлено: Чт фев 20, 2014 19:39:47
kk042fjv
ploop писал(а):
kk042fjv писал(а):А если сделать усреднение я как понял у меня не будет цифры скакать от 0 до 5 (к примеру). а всегда будут на экране гореть среднее показание например 4. Я Вас правильно понял?
Не совсем так.
С задержкой, как вы сейчас сделали, у вас на экран выводится мгновенное значение сигнала. Ну например, АЦП видит такие значение:

Код: Выделить всё

3333333333333353333333333333 - В реале
    ^         ^          ^   - Периоды обновления
3333333333333355555555555333 - На экране
То есть из-за любой помехи у вас 2 секунды будут неверные показания, в случае усреднения даже по 10 отсчётам у вас в нижнем ряду будут все тройки.

Для измерения атмосферного давления я вообще усреднял по 65536 отсчётам :))
Все правильно так оно и выходит, в протеусе так и показывает. Автор этого кода я, я не программист, но в codevisionavr получаются небольшие коды писать и хотел бы попробовать переделать с усреднением показаний, теоретически то понятно снимаем примерно 32 отсчета, складываем, делим и выводим на экран, но как это в коде написать???
Которую часть кода Вы в начали писали почему то программа ругается на строчку tmp_data = 0; видать в начале надо что-то добавить, может библиотеку.

Re: Переделать АЦП на Atmega8

Добавлено: Чт фев 20, 2014 19:48:41
ploop
kk042fjv писал(а):Вы в начали писали почему то программа ругается на строчку tmp_data = 0;
Дык я точку с запятой в строке перед ней (где комментарий) пропустил :)))
Я же говорю - писал на коленке...