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

применение МК в зерносортировке

Добавлено: Ср апр 08, 2009 00:49:14
otmyavrozok
Уважаеые обитатели сайта! Имеются 8 датчиков,в нормальном режиме на выходе датчика импульсы отрицательной полярности ок 1 мс с частотой 2-45 Гц.Появление высокого или низкого уровня в любом канале(каналах),более чем на1.2с-аварийный режим.Я применил мега48 и алгоритм-последовательный опрос 8 портов с ожиданием перепада уровня в течении 0.5с,но время опроса 8 датчиков больше допустимого для реагирования!Подскажите,как можно решить эту проблему?

Добавлено: Ср апр 08, 2009 02:14:21
Vov123
Как вариант-каждый датчик на свой контроллер,типа tiny.
И сязать по I2C,с тем что у вас есть.
Или просто напрямую на вход порта.

Добавлено: Ср апр 08, 2009 07:27:15
Александр777
Еще как вариант связать с каждым датчиком счетчик, который будет сбрасываться при перепаде напряжения на выводе МК. Содержимое счетчика автоматически увеличивается на 1, например каждые 0.1 с. Переполнение счетчика говорит об аварийном состоянии.

Добавлено: Ср апр 08, 2009 07:31:38
asteroid7
Не корректно по полсекунды опрашивать ноги. Вам нужно алгоритм переделать.
Например так: Необходимы 8 переменных как счетчики опросов и переменная предыдущего состояние датчиков. Опрашивать датчики каждые 100мс. Считывая с портов состояние сравнивать его с предыдущим. Если какой бит изменился то сбрасывать соответствующий счётчик в ноль. Нет, счётчик + 1. До 120 досчитали - авария.

Добавлено: Ср апр 08, 2009 07:33:03
asteroid7
Александр777
Один в один и одновременно :)

Добавлено: Ср апр 08, 2009 16:58:25
Goodefine
Ага, а еще лучше посоветовать, на каждый датчик поставить свою мегу48... :))
Если серьезно, посмотрите на камень, который у вас в руках. Мега48 имеет целых три порта, на каждую лапу которых, можно навешать по внешнему прерыванию (по любому изменению уровня) - то что доктор прописал. Берете один из таймеров и задача почти решена - потребуется буквально пара строчек кода, а именно: заводим переменные-счетчики для каждого датчика. В прерывании таймера по переполнению эти переменные просто инкрементируем. В обработчиках прерываний по каждому входу (их восемь будет), соответствующая переменная-счетчик обнуляется. В основном цикле тупо проверяем, достигла ли какая-либо переменная порога, соответствующего 1.2с (надо только правильно рассчитать предел, узнав, сколько раз за 1.2с переполнится таймер и проследить, чтобы типа данных (char, int) переменных-счетчиков хватило). Превысили - аларма... Точность по интервалу в доли процента по каждому датчику, вполне достижима.
P.S. Применяйте возможности камня, по назначению. Для этой задачи мега48 самое то...

Добавлено: Ср апр 08, 2009 20:49:29
asteroid7
Goodefine писал(а):...
Мега48 имеет целых три порта, на каждую лапу которых, можно навешать по внешнему прерыванию
...
Не на каждую лапу, а на каждый порт. Их всего 3.
С таймером и с PCINT-ами код получается больше, чем если в основном цикле тупо проверять пины.

Добавлено: Чт апр 09, 2009 00:29:20
Goodefine
asteroid7 писал(а): Не на каждую лапу, а на каждый порт. Их всего 3.
И правда, запамятовал :)
Но сути это не меняет. Достаточно легко в обработчике узнать какой датчик вызвал прерывание и обнулить соответствующий счетчик.
asteroid7 писал(а):
С таймером и с PCINT-ами код получается больше, чем если в основном цикле тупо проверять пины.
Чего это больше? Или вы название обработчика учитываете? Зато это будет РАБОЧИЙ вариант. От опроса это отличается кардинальным образом: ибо мы действуем по СОБЫТИЮ, что гарантирует их обработку. В случае опроса, есть большая вероятность пропустить изменение состояния. Например, автор в первом же топике указывает, что длительность отрицательного импульса около 1мс. А частота следования может быть от 2-х герц... Выше Вы предлагаете опрашивать входы один раз в 100мс. Теперь подсчитайте, какова вероятность поймать этот импульс (скважность которого близка к нулю), если он может встретится только один раз за 500мс, с длительностью 1мс. Причем у Вас имеется только ДВЕ попытки, а дальше тревога... Чтобы гарантированно отловить все изменения состояния опросом, нужен его период сделать как минимум 1/8мс (длительность импульсов/число входов), что практически нецелесообразно, ибо если и успеете, больше времени ни на что не останется. Поэтому здесь, альтернативы прерываниям практически нет...

Добавлено: Чт апр 09, 2009 07:53:03
asteroid7
Goodefine писал(а):...
В случае опроса, есть большая вероятность пропустить изменение состояния. Например, автор в первом же топике указывает, что длительность отрицательного импульса около 1мс.
...
Точно. Невнимательно прочитал. На меандре зациклился. :)

Соглашусь, что лучший вариант на PCINT-ах делать. Изменение на любой ноге - прерывание, где считываются сразу все PIN-ы порта. Пробежаться циклом по ним. Изменился - сброс соответствующего счётчика. А дальше, как Goodefine советовал. Запустить таймер с тиками, например, 100мс. В прерывании таймера все счётчики + 1.

Добавлено: Чт апр 09, 2009 09:41:02
otmyavrozok
Корректно обрабатывает сигнал только с ноги по которой сработало прерывание,с остальных,на минимальной частоте пропускает импульсы.К датчикам я добраться не могу,может сигнал чуть растянуть одновибратором?

Добавлено: Чт апр 09, 2009 16:55:20
Goodefine
Если не слишком большой секрет, программу покажите...

Добавлено: Чт апр 09, 2009 18:37:55
otmyavrozok
Получилось,я неправильно входа настроил.Спасибо всем!