Перейти к содержанию

Проблема с импульсными датчиками


X-shadow

Рекомендуемые сообщения

Здравствуйте. Есть 2 двигателя на которых стоят импульсные датчики для определения скорости и пройденного пути. Нужно очень часто обновлять эти данные т.е за время прохождения одного импульса мы должны сделать несколько проверок. Дело в том что я использую контроллер ATmega128 на котором висит программа и занимается не только проверкой импульсных датчиков. Поэтому у меня возникает проблема с пропусканием импульсов. Я знаю что эту проблему решают 2 способами:

1) ставят еще один контролер

2) собирают счетчик на дискретных компонентах

Вопрос: может кто знает такую схему на дискретках?? Нужно чтобы она выдавала пройденый путь и скорость в любой момент времени когда ее спросят (пройденый путь нужно мерить с последнего опроса).

Заранее спасибо.

Лучше сорок раз по разу чем ни разу сорок раз..

Ссылка на комментарий
Поделиться на другие сайты

А таймер-то чем не устраивает ?

Прерывание, тоже не подходит ?

Изменено пользователем MaStak

Паять не мешки ворочать.

Ссылка на комментарий
Поделиться на другие сайты

Слишком большая нагрузка для одного контроллера. Есть вероятность пропускания импульсов а след неточность

Лучше сорок раз по разу чем ни разу сорок раз..

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Здравствуйте. Есть 2 двигателя на которых стоят импульсные датчики для определения скорости и пройденного пути. Нужно очень часто обновлять эти данные т.е за время прохождения одного импульса мы должны сделать несколько проверок. Дело в том что я использую контроллер ATmega128 на котором висит программа и занимается не только проверкой импульсных датчиков. Поэтому у меня возникает проблема с пропусканием импульсов. Я знаю что эту проблему решают 2 способами:

1) ставят еще один контролер

2) собирают счетчик на дискретных компонентах

Вопрос: может кто знает такую схему на дискретках?? Нужно чтобы она выдавала пройденый путь и скорость в любой момент времени когда ее спросят (пройденый путь нужно мерить с последнего опроса).

Заранее спасибо.

Если входные импульсы меньше частоты 1 МГц, то этим контроллером они измеряются легко, не затрагивая основную программу. Смотри ноги PD6(T1) и PD7(T2) - как раз под твою задачу.

Максимально используй аппаратные возможности контроллера, а программа - это второстепенное.

А иначе непонятно, почему M128 заложил...

Ссылка на комментарий
Поделиться на другие сайты

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

2 X-Shadow

А если всё таки хошь считать импульсы чем-то из-вне.

То тебе как мне кажется нужен самый обычный реверсивный счётчик, разрядность которого зависит от длинны измерения и точности датчика. Просто в таком случае у МК может ног не хватить.=)

Паять не мешки ворочать.

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

2 X-Shadow

А если всё таки хошь считать импульсы чем-то из-вне.

То тебе как мне кажется нужен самый обычный реверсивный счётчик, разрядность которого зависит от длинны измерения и точности датчика. Просто в таком случае у МК может ног не хватить.=)

А реверсивный то за чем?...типа заднюю скорость включил, счетчик в обратную сторону защелкал?)))))

Ссылка на комментарий
Поделиться на другие сайты

А реверсивный то за чем?...типа заднюю скорость включил, счетчик в обратную сторону защелкал?)))))

Точно ;)

В одну сторону прибавляет к текущему зачению +1

в другую вычитает из текущего значения -1.

Остаётся только подобрать правильный селектор импульсов, а это зависит от конкретного типа датчика - как у него выглядят импульсы счёта.

Паять не мешки ворочать.

Ссылка на комментарий
Поделиться на другие сайты

Спасибо большое.

У меня небольшой вопрос:

Как наиболее эфективно опросить датчики??

Прерываниями нельзя так как датчиков у нас 4 и если на них одновременно возникнет импульс то посчитается только один что плохо. Есть только один выход это использовать прерывание таймера скажем около 10 мс и опрашивать все 4 датчика. А там уже смотреть как импульсы идут.

Может есть чтонибуть более эффективное?? Заранее спасибо

Лучше сорок раз по разу чем ни разу сорок раз..

Ссылка на комментарий
Поделиться на другие сайты

Прерываниями нельзя так как датчиков у нас 4 и если на них одновременно возникнет импульс то посчитается только один что плохо.

:huh: Озадачил

Почему только один ? :blink:

4sensor.jpg

Паять не мешки ворочать.

Ссылка на комментарий
Поделиться на другие сайты

Однако тут есть проблема. Дело в то м что у меня есть еще таймер который каждые 20 мс попадает в свое прерывание, принимает сообщение с компа и управляет нагрузкой (шим, ацп и входы/выходы). Будет очень плохо если мы попадем в прерываение таймера а в этот момент произойдет прерывание импульсного датчика. Может есть какой-нить другой выход?

Лучше сорок раз по разу чем ни разу сорок раз..

Ссылка на комментарий
Поделиться на другие сайты

М-дааааааа....... :huh:

Всё интересней и интересней :)

Способ №раз: "ультрасовременный"

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

Способ №два: "деревянный"

В обработчике прерываний таймера через определённые промежутки выполнения программы делаем опрос флага прерываний порта на котором висят датчики, если ответ утвердительный немедля переходим к опросу датчиков (идентичный кусок кода как в обработчике) или сохранив предварительно состояние программного счётчика направляемся в сам обработчик прерываний порта собссно, после проверки датчиков ложим в счётчик сохранённое значение и возвращаемся обратно в обработчик прерываний таймера.

Способ №три: "продвинутый"

Попав в обработчик прерываний таймера, накладываем маску на регистр прерываний таким образом, что запрещаются все прерывания кроме как от того самого злополучного порта, есессенно не забываем установить глобальный бит разрешения всех прерываний. Ну и смело приступаем к делу, когда произойдёт прерывание по порту, МК вынесет из обработки таймера по адресу прерываний порта датчиков, после опроса датчиков МК вернётся на то место откуда его сорвали. После обработки прерываний по таймеру не забываем восстановить маску регистра прерываний.

Выбирай :D

Паять не мешки ворочать.

Ссылка на комментарий
Поделиться на другие сайты

Дело в том что если мы прервем таймер и перейдем в обработку прерывания то мы можем терять данные. Допустим таймер посылает на ком порт какие-то данные. Внезапно его прервали и мы потеряли данные. Тут помоему только опрашивать очень часто этот злополучный порт и уже оттуда смотреть что получилось :(

Лучше сорок раз по разу чем ни разу сорок раз..

Ссылка на комментарий
Поделиться на другие сайты

Продолжение (начал MaStak)

способ 4:

2 X-shadow. Посмотри на М128 ноги PD0-PD3 и PE4-PE7. Это восемь! ног отслеживающие прерывание по одному вектору!

На одной из ног перепад (как настроишь) - выполняется прерывание. В нем читаешь один регистр и смотришь на какой ноге это случилось.

Никаких масок, никакого геммороя.

Чтоб не терять данные от прерываний, при входе в обработку разрешаем прерывания глобально. Это нормальное "разруливание" множества прерываний. Правда, придется программно делать, чтоб одно и тоже два раза не зашло. Это флагами. Но при твоих временных данных, десятки милисек. - это не грозит.

Ссылка на комментарий
Поделиться на другие сайты

Если совсем с потерей данных критично - делается буферизация входных данных. В прерывание вошел, скинул в буфер, вышел. А в остальное время спокойно обрабатываешь их.

Ссылка на комментарий
Поделиться на другие сайты

Значит допустим мы вошли в прерывание таймера и тут у нас возникло прерывание на какой-то ноге. Мы вышли обработали прерывание на ноге и вернулись в то место откуда вышли???

А каким образом может получиться так что мы 2 раза обработаем одно и тоже прерывание?

Лучше сорок раз по разу чем ни разу сорок раз..

Ссылка на комментарий
Поделиться на другие сайты

Лучше, конечно, нарисовать - но лень. :)

попробую пояснить так:

Допустим, есть 2 независимых прерывания (далее П) от разных источников. При входе в одно из них аппаратно запрещаются все П (asm: CLI) и выполняется только данное, все остальные будут молчать (для М128). Можно при входе в П разрешить программно все П (asm: SEI). И соответственно, сработай еще раз это же, оно войдёт снова :) , но и второе П не будет заблокировано и тоже спокойно может сработать. Во втором П тоже разрешаешь все П и выполняя его, может спокойно сработать первое. Вот тут та и надо чтобы они не переполнили стек своими заходами.

Попробуй в инете поискать что нибуть про вложенные прерывания, я думаю это тема не на один день...

Ссылка на комментарий
Поделиться на другие сайты

О, чуть не забыл, главное:

При входе в любое П, аппаратно сбрасывается флаг этого П, тем самым, разрешая его работу. :P

Всё это приминимо к м/к AVR.

Ссылка на комментарий
Поделиться на другие сайты

Ещё вспомнил :)

Способ №5: "хитрый"

Берёшь любой свободный таймер и настраиваешь на внешний тактовый сигнал. Пока лазишь в обработчике ШИМа, АЦП и т.д. этот таймер спокойненько подсчитывает все импульсы с датчиков. Выходишь из обработчика и выгружаешь значение таймера в регистр счёта импульсов.

Трабла только в том что на каждый датчик нужен свой таймер :(

Паять не мешки ворочать.

Ссылка на комментарий
Поделиться на другие сайты

Спасибо. Пара вопросов.

1) Допустим я вошел в прерывание таймера. Сразу разрешил все прерывания. В этот момент возникло прерывание на ножках PD6 PD7. Я вышел из прерывания таймера, обработал прерывание ножки и снова вернулся в прерывание таймера и продолжил работу. За это время таймер не стал снова считать??? Т.е он стоит пока я не выйдет из обработки функции прерывания таймера?

2) Прерывание на ножках PD6 PD7 возникает при появлении высокого уровня или при перепаде?? Т.е если у меня сначала низкий уровень, потом высокий и потом снова низкий я получу 1 прерывание или 2???

Лучше сорок раз по разу чем ни разу сорок раз..

Ссылка на комментарий
Поделиться на другие сайты

1)Таймер нельзя остановить, он считает всегда ( и пока идёт обработка прерывания этого таймера, тоже считает ), поэтому во избежание его переполнения и как следствие нового прерывания его ( таймер ) надо обнулять.

Пожалуй единственный способ остановить таймер это отключить от него предделитель, что не очень удобно, лучше всё-таки обнулять.

2) Флаг прерывания формируется при переходе от одного лог. состояния в другое.

Условие прерывания по фронту или по срезу импульса, устанавливается битом в определённом регистре ( у PICов это OPTION_REG ), СМОТРИ ДОКУМЕНТАЦИЮ НА СВОЙ МК.

Паять не мешки ворочать.

Ссылка на комментарий
Поделиться на другие сайты

Я вот никак не могу понять что за прерывания на PD6 и PD7. На PD1 это INT0 и чет никак не могу понять че делать

Лучше сорок раз по разу чем ни разу сорок раз..

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...