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

Обсуждаем контроллеры компании Atmel.
Ответить
Грызет канифоль
Сообщения: 261
Зарегистрирован: Ср авг 01, 2012 10:45:42

Сообщение kk042fjv »

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

Скидываю исходник и проект в протеусе.
Вложения
Новая папка.rar
(94.96 КБ) 161 скачивание
Реклама
Грызет канифоль
Сообщения: 278
Зарегистрирован: Вт дек 03, 2013 11:04:04
Откуда: Киев

Сообщение kobzar »

ну так в функции мейн в конце поставьте _delay_ms(xxxx);
и укажите частоту с которой бйдет обновляться содержимое екрана!
Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости
Контактная информация:
Реклама
Грызет канифоль
Сообщения: 261
Зарегистрирован: Ср авг 01, 2012 10:45:42

Сообщение kk042fjv »

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

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

я правильно понял?
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение 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х отсчётов можно взять побольше.
Реклама
Эиком - электронные компоненты и радиодетали
Грызет канифоль
Сообщения: 278
Зарегистрирован: Вт дек 03, 2013 11:04:04
Откуда: Киев

Сообщение kobzar »

а чем делей не угодил в данном случае? Человеку же просто задержка надо на вывод данных :)
пусть поставит
_delay_ms(5000);
как раз и получит изменение данных на екран с частотой 5 секунд
не вижу смысла делать задержку на счетчтике в данном случае :)
Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости
Контактная информация:
Реклама
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

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

А фильтр нужен потому, что я работал с этим датчиком, и без фильтра, либо конкретного опыта в разводке аналоговой части, он покажет погоду на Марсе.
Реклама
Грызет канифоль
Сообщения: 278
Зарегистрирован: Вт дек 03, 2013 11:04:04
Откуда: Киев

Сообщение kobzar »

Ну тогда ваш метод значительно правильней :)
Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Некрасиво как-то - накапливать, а потом рассчитывать. Надо бы сразу. Так - плавнее.
Docendo discimus
Контактная информация:
Грызет канифоль
Сообщения: 278
Зарегистрирован: Вт дек 03, 2013 11:04:04
Откуда: Киев

Сообщение kobzar »

так указали же причину
А фильтр нужен потому, что я работал с этим датчиком, и без фильтра, либо конкретного опыта в разводке аналоговой части, он покажет погоду на Марсе.
Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

pyzhman писал(а):Надо бы сразу. Так - плавнее.
Если время обновления ~1 сек то не критично. Скользящее среднее применять надо когда обновления нужны каждый отсчёт.
Да и алгоритм без буфера не помню, хотя он был у меня в заначках :)
Грызет канифоль
Сообщения: 261
Зарегистрирован: Ср авг 01, 2012 10:45:42

Сообщение kk042fjv »

Наконец то попал я за компьютер. Сделал я задержку в 2 сек, на моем устройстве этого достаточно, спасибо что подсказали. А если сделать усреднение я как понял у меня не будет цифры скакать от 0 до 5 (к примеру). а всегда будут на экране гореть среднее показание например 4. Я Вас правильно понял?
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Смотря какое среднее (точность), смотря какая величина усреднения.
kk042fjv писал(а):...задержку в 2 сек...этого достаточно
Не надо переделывать. Как известно, лучшее - враг хорошего. :))
Docendo discimus
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

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

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

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

Для измерения атмосферного давления я вообще усреднял по 65536 отсчётам :))
Держит паяльник хвостом
Сообщения: 933
Зарегистрирован: Ср апр 13, 2011 11:09:20
Откуда: Екатеринбург

Сообщение Alkul »

pyzhman писал(а):Некрасиво как-то - накапливать, а потом рассчитывать. Надо бы сразу. Так - плавнее.
Оно и получается сразу.
Вот тут я писал об этом.
При любой длине буфера усреднения результат выдается после каждого измерения. Не надо ничего накапливать, а потом выдавать.
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Есть алгоритм без буфера. Если надо сделать сильное усреднение никакой памяти не хватит.
Держит паяльник хвостом
Сообщения: 933
Зарегистрирован: Ср апр 13, 2011 11:09:20
Откуда: Екатеринбург

Сообщение Alkul »

ploop писал(а):Есть алгоритм без буфера.
Есть. Например, фильтрация Калмана. Глубина "усреднения" регулируется, причем скорость реакции на единичное возмущение выше, чем у алгоритма с обычным "скользящим" усреднением.
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

А, вот ещё, забыл: http://we.easyelectronics.ru/Theory/che ... filtr.html
Там в конце пример кода. Проще некуда.

Но ещё раз говорю - автору он не нужен. Ему среднее арифметическое с усреднением до посинения. Количеством отсчётов подобрать задержку. Как раз будет среднее за интервал обновления, что ему и надо.
Грызет канифоль
Сообщения: 261
Зарегистрирован: Ср авг 01, 2012 10:45:42

Сообщение kk042fjv »

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

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

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

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

Сообщение ploop »

kk042fjv писал(а):Вы в начали писали почему то программа ругается на строчку tmp_data = 0;
Дык я точку с запятой в строке перед ней (где комментарий) пропустил :)))
Я же говорю - писал на коленке...
Ответить

Вернуться в «AVR»