Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: 4х канальный счетчик импульсов
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
AlexTech
Подкажите пожалуйста, как можно реализовать сабж на 16 меге без применения мультиплексора.
Желательно схемка+пример кода на С.
мда.. импульсы это 0

И еще вопрос, может знаете что за микросхемка такая: 8E351A(BE351A) плохо читается.
8 ног; 1,2,3 выход +12; 4 gnd; 5,6,7,8 вход +12, хотя бы ощее представление: стабилизатор или ключи или фильтр какой-то?
defunct
Цитата(AlexTech @ Dec 27 2005, 11:14) *
Подкажите пожалуйста, как можно реализовать сабж на 16 меге без применения мультиплексора.
Желательно схемка+пример кода на С.
мда.. импульсы это 0


А частота следования импульсов какая, а минимальная длительность?
AlexTech
Енто выходы с тахометра кулера smile.gif
defunct
Цитата(AlexTech @ Dec 27 2005, 11:31) *
Енто выходы с тахометра кулера smile.gif


т.е. частота до 10khz?

тогда цепляем сигналы от тахометра на любой порт, например на первых четыре пина порта B. и далее циклически считываем значение порта. при переходе из 1 в 0 инкрементируем счетчик. Из обработчика какого-нибудь прерывания отправляем показания со счетчиков куда требуется..

Код
long CNT[4];
char masks[4] = {1, 2, 4, 8};

void do_count(void)
{
    static char olddata;
    char c;
    int i;

    for(;;)
    {
      c = PINB;

      for (i=0; i<4; i++)
      {
          if (!(masks[i] & c) && (masks[i] & olddata))
             CNT[i]++;
      }

      olddata = c;
    }
}
AlexTech
Спасибо, попробую вечерком. Вот только вопрос, а что будет в моменты обработки прерываний, считать ведь перестанет?
А у меня уже используется 2 прерывания, одно с частотой 1.9Гц, второе с частотой 122Гц причем по видимому будет переписано на 4000Гц.

Вот как бы заюзать вход от внешнего прерывания, но на 4 канала и без мультиплекса? biggrin.gif
defunct
Цитата(AlexTech @ Dec 27 2005, 12:21) *
Спасибо, попробую вечерком. Вот только вопрос, а что будет в моменты обработки прерываний, считать ведь перестанет?
А у меня уже используется 2 прерывания, одно с частотой 1.9Гц, второе с частотой 122Гц причем по видимому будет переписано на 4000Гц.

Вот как бы заюзать вход от внешнего прерывания, но на 4 канала и без мультиплекса? biggrin.gif


В моменты прерываний перестанет считать только если, длительность обработки прерывания превысит длительность импульса... В обработчике прерывания можно счетчики сбрасывать после отправки. т.е. скажем считать кол-во оборотов в минуту smile.gif

Без мультиплексора завести все 4 сигнала на внешнее прерывание не получится.. в M16 только 3 внешних источника прерывания int0, int1, int2, и int2 совпадает с входом аналогового компаратора.. можно завести один сигнал на счетный вход таймера T0 или T1, а остальные раскидать по Int'aм.
AlexTech
Ну мне собственно в минуту и нужно считать. Буду пробовать.
А вот если такой вариант: 4 выхода тахометров -> на 4 любые ноги и через диоды на один вход внешнего прерывания. Успеет ли контроллер при входе в прерывание считать что у него на тех 4х ножках или нет? Может как то коденсаторы прикрутить что бы длительность импульса увеличить немного.
prottoss
Цитата(defunct @ Dec 27 2005, 17:44) *
Без мультиплексора завести все 4 сигнала на внешнее прерывание не получится.. в M16 только 3 внешних источника прерывания int0, int1, int2, и int2 совпадает с входом аналогового компаратора.. можно завести один сигнал на счетный вход таймера T0 или T1, а остальные раскидать по Int'aм.


Очень даже получится - надо всего то четыре диода и четыре свободных порта. Схема такова: анализируемые линии садим на свободные линии любых портов (лучше для программирования на один порт). Если детектируется нулевой уровень по линии то к каждой линии прицепляем по диоду катодами к каждой линии, анодами вместе на любую линию прерывания вместе. Если детектируем лог. 1, то анодами к каждой линии, а катодами на прерывание. При возникновение события прерывания анализируем подследственные линии на присутствие лог. 0 (1), если есть место данному событию, то увеличиваем счетчик (для каждой линии свой) импульсов линии. Подсчет количества импульсов в секунду (или менее) организовать не сложно для Вас, я думаю.

Если есть возможность, поменяйте модель МК, есть такие, у которых присутствует вектор прерывания по изменению сигнала на любой линии порта.
AlexTech
Вот я тоже так подумал ))) Не понятно только успеет ли контроллер считать выводы )))
А в каких контроллерах есть векторы для любых ножек? готов поменять на 32 64 128 )) остальные не катят (
prottoss
Цитата(AlexTech @ Dec 27 2005, 18:54) *
Ну мне собственно в минуту и нужно считать. Буду пробовать.
А вот если такой вариант: 4 выхода тахометров -> на 4 любые ноги и через диоды на один вход внешнего прерывания. Успеет ли контроллер при входе в прерывание считать что у него на тех 4х ножках или нет? Может как то коденсаторы прикрутить что бы длительность импульса увеличить немного.


Опоздал я со своим ответом. Успеет или нет - взависимости от того, какая частота внешних импульсов. Как я понял из постов выше, то не более 10 кГц - это с периодом не более 100 мкс, при частоте МК 8 МГц период выполнения одной команды - 125 нс, так что кроме обсчета ВСЕХ своих свободных линий Ваш МК успеет еще и слона посмешить :-)
defunct
Цитата(AlexTech @ Dec 27 2005, 13:54) *
Ну мне собственно в минуту и нужно считать. Буду пробовать.
А вот если такой вариант: 4 выхода тахометров -> на 4 любые ноги и через диоды на один вход внешнего прерывания. Успеет ли контроллер при входе в прерывание считать что у него на тех 4х ножках или нет? Может как то коденсаторы прикрутить что бы длительность импульса увеличить немного.


Считать-то он успеет, а вот от ошибок не застрахуешься при такой реализации.
Представьте ситуацию, когда один тахометр вызвал прерывание, мы порт прочитали, низкий уровень еще удерживается и в этот момент приходит сигнал от другого тахометра.. и все приплыли - перывания нет, импульс пропущен.
AlexTech
Ничего страшного не случится, я не в космос лечу biggrin.gif
+/- 50 оборотов меня устроит вполне
Спасибо всем, буду пробовать.

И потом разве МК не запустит вторую копию обработчика прерываний?
defunct
Цитата(AlexTech @ Dec 27 2005, 14:08) *
Вот я тоже так подумал ))) Не понятно только успеет ли контроллер считать выводы )))
А в каких контроллерах есть векторы для любых ножек? готов поменять на 32 64 128 )) остальные не катят (


В m162 есть PCINT0, PCINT1 можно настроить на любые пины порта C. плюс два стандартных Int0, Int1.
prottoss
Цитата(AlexTech @ Dec 27 2005, 19:08) *
Вот я тоже так подумал ))) Не понятно только успеет ли контроллер считать выводы )))
А в каких контроллерах есть векторы для любых ножек? готов поменять на 32 64 128 )) остальные не катят (


Лучше Вам посмотреть даташиты на сайте Atmel. У Мега64...128 точно болше 4-х прерываний, так что Вам и так хватит без диодов. Но мне кажется, что если задача влезает в МК с памятью программ (ПП) 1к то лучше использовать МК с ПП на 50% больше и применить 4-е диода и дешевый МК, чем Громоздила64...128 :-)))
prottoss
Цитата(defunct @ Dec 27 2005, 19:11) *
Считать-то он успеет, а вот от ошибок не застрахуешься при такой реализации.
Представьте ситуацию, когда один тахометр вызвал прерывание, мы порт прочитали, низкий уровень еще удерживается и в этот момент приходит сигнал от другого тахометра.. и все приплыли - перывания нет, импульс пропущен.


А никаких ошибок при такой частоте входных импульсов и не будет (вернее погршность будет низкая для данного типа устройства) - по любому прерыванию процессор анализирует состояния ВСЕХ линий. Итого время исполненя прерывания (при 8 МГц) - 2..5 мкс - вполне нормально.



Цитата(AlexTech @ Dec 27 2005, 19:14) *
И потом разве МК не запустит вторую копию обработчика прерываний?


Пока МК обрабатывает текущее прерывание, ни какие копии он не запускает. После отработки прерывания, минимум через такт он сможет начать обрабатывать следующее прерывание
AlexTech
Все оказалось не так просто sad.gif
Поскольку кулер управляется ШИМом, причем по земле (uln2803a), то соответственно часть времени с тахометра просто нет сигнала. Как бороть чего-то никак не придумывается...
defunct
Цитата(AlexTech @ Dec 28 2005, 08:12) *
Все оказалось не так просто sad.gif
Поскольку кулер управляется ШИМом, причем по земле (uln2803a), то соответственно часть времени с тахометра просто нет сигнала. Как бороть чего-то никак не придумывается...


Считать то, что можно посчитать, результат домножать на некоторый коэффициент K (который может быть не постоянным, а изменяться взависимости от кол-ва принятых импульсов)..
AlexTech
Да не... Там совсем какая-то лажа получается.
При соотношении ШИМА(счетчик - байт) 80 крутим, 175 нет - подсчитывает 25-30 оборотов (реально ~350)
При соотношении 250 крутим, 5 нет - подсчитывает 1-3 (реально ~900)

В общем некогда вчера было разбираться, но что-то не так, то-ли я накосячил, то-ли что...
Laksus
___________________________________________________
(defunct @ Dec 27 2005, 19:11)
Считать-то он успеет, а вот от ошибок не застрахуешься при такой реализации.
Представьте ситуацию, когда один тахометр вызвал прерывание, мы порт прочитали, низкий уровень еще удерживается и в этот момент приходит сигнал от другого тахометра.. и все приплыли - перывания нет, импульс пропущен.
___________________________________________________
(prottoss Dec 27 2005, 14:35)
А никаких ошибок при такой частоте входных импульсов и не будет (вернее погршность будет низкая для данного типа устройства) - по любому прерыванию процессор анализирует состояния ВСЕХ линий. Итого время исполненя прерывания (при 8 МГц) - 2..5 мкс - вполне нормально.
___________________________________________________

"...по любому прерыванию процессор анализирует состояния ВСЕХ линий...." Вот именно, речь
идет о том, что при
"... если такой вариант: 4 выхода тахометров -> на 4 любые ноги и через диоды на один вход внешнего прерывания. ..."
будут возникать биения между сигналами. И погрешность будет
определятся не сколько частотой сигналов, а больше их скважностью.
При довольно большой скважности и близких частотах - прерываний вообще не будет.

Для увеличения точности необходимо увеличить скважность импульсов,
например применив RC цепочки (смотри схемку Нажмите для просмотра прикрепленного файла ).
(На практике я эту схемку не применял. Но, по моему, должно работать.)
__________
__________
Все оказалось не так просто
Поскольку кулер управляется ШИМом, причем по земле (uln2803a), то соответственно часть времени с тахометра просто нет сигнала. Как бороть чего-то никак не придумывается...
__________
Ну тут без схемы и осциллограм сигналов подсказать, что либо не получиться.

2005 12 29
Александр
prottoss
Цитата(Laksus @ Dec 29 2005, 11:13) *
Для увеличения точности необходимо увеличить скважность импульсов,
например применив RC цепочки


Согласен, так будет намного лучше
slog
Что вы этим выиграете? Если прерывания итак можно защелкивать по фронту. Если сильно не хочется использовать контроллер с нужным кол-вом входов внешних прерываний, то можно пожертвовать прерывание от компаратора ну и от УАРТа
prottoss
Цитата(slog @ Dec 30 2005, 01:53) *
Что вы этим выиграете? Если прерывания итак можно защелкивать по фронту. Если сильно не хочется использовать контроллер с нужным кол-вом входов внешних прерываний, то можно пожертвовать прерывание от компаратора ну и от УАРТа


Мы же не знаем, ЧТО использует автор топика и какая схема с этим ЧТО. Может быть есть в схеме и задействованный компаратор и УСАРТ МК.
archi2000
Без схемы и той программы, которая есть у автора разобраться трудно.
Однако Атмел имеет приоритет прерываний.
Эти четыре вектора нужно так написать, чтобы внутри вектора после подсчета импульса опять разрешались прерывания. Вобщем вложенные прерывания получатся.
Если на ножке было событие, а прерывания запрещены, то устанавливается флаг прерывания и Атмел ждет комманды разрешения прерываний. Если импульсы с небольшой частотой, то они могут приходить на ножки одновременно и МК их просуммирует без пропусков.
Однако считаем - на один вектор 100 тактов с учетом спрятать СТАТУС и все регистры в стек и запретить прерывания с более высоким приоритетом, а глобально прерывания разрешить.
Частота кварца 16 МГц максимальная.
16 000 000/100/4 канала=40кГц максимальная частота импульсов по одному каналу счета.
Пока обрабатываешь Int0 прерывания запрещены.
Запрещаешь внутри этого вектора Int0 и разрешаешь прерывания
Если на Int1 был импульс не выходя из Int0 вызывается Int1 и импульс добавится в теле этого прерывания.
Опять же в теле Int1 запрещаем все с более высоким приоритетом и разрешаем глобально прерывания и работаем с Int2.
Вектора в даташите расположены согласно приоритетов.
И для отладки нужно 4 перестраиваемых RC генератора импульсов на инверторах, осциллограф и частотомер.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.