![]() |
|
Модераторы: bsa |
![]()
|
|
| Семен78 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 31.3.2008 Где: Kazan Репутация: нет Всего: нет |
Хочу мерить частоту оборотов на двигателе - железо готово(опрос LPT) - набираюсь мыслей по софту:
В MFC - Edit box и Кнопка на которой наввешу : таймер 1 сек . который запускает бесконечный цикл с опросом порта и записью единичек .... Ну и надеюсь видеть цифру новую каждую сек. Вопрос - как закончить цикл при наступлении следующей команды от таймера? |
|||
|
||||
| korian |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 2 Всего: 17 |
это необходимо делать? вообще лучше расскажите, что надо сделать, не опираясь на реализацию, а то так не понятно... самый простой вариант, когда программа просто опрашивать порт каждую секунду: на диалог ставим Edit при инизиализации диалога, инициализируем таймер, устанавливаем обновление 1 сек. в функции таймера, читаем порт и выводим данные в edit |
|||
|
||||
| Семен78 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 31.3.2008 Где: Kazan Репутация: нет Всего: нет |
крутится вал около 10 -20 тыс. оборотов в секунду - на валу метка для датчика который висит на LPT.
надо точно мерить частоту вращения не пропуская ни одного оборота - полагаю что частота выполнения бесконечного цикла с опросом порта много выше чем частота вала |
|||
|
||||
| Andrey44 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1501 Регистрация: 4.12.2006 Где: На работе Репутация: 2 Всего: 26 |
korian, поддерживаю твое мнение. Бесконечный цикл не нужен.
Тогда это надо делать в другом потоке. Самый лучший вариант - таймер. -------------------- ????? ??, ??????? ?????. |
|||
|
||||
| korian |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 2 Всего: 17 |
предположение не совсем верное. я так понимаю, что частота выдается импульсами на LPT. т.е. чтобы посчитать частоту надо посчитать количество изменений состояния LPT порта и поделить на время.
этого сделать средствами Windows нельзя, т.к. любой поток/процесс может замереть на неопределенное время и соответсвенно потерять часть данных. вообщем-то это нельзя сделать средствами компа на базе x86, т.к. он не является системой реального времени. если это не настолько критично, т.е. иногда можно пропускать куски данных, то можно попробывать реализовать, но никто не гарантирует, когда будет пропущен кусок и какого размера он будет. где-то это уже обсуждалось... щас попробую найты ссылку, почитаете подробнее. |
||||
|
|||||
| Семен78 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 31.3.2008 Где: Kazan Репутация: нет Всего: нет |
что то типа этого ?
Добавлено через 7 минут и 50 секунд ну вобщем как уж получится - хочу попробовать возможно ли оценить погрешность ? как же работают всякие виртуальные приборы где важна точность? |
|||
|
||||
| korian |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 2 Всего: 17 |
нет не так. необходимо создавать дополнительный поток, который будет считать частоту. основной поток будет брать данный из дополнительного и выводить их по таймеру или по Event'у из дополнительного потока. но еще раз повторяю, что есть большая вероятность терять куски данных. Добавлено через 8 минут и 16 секунд делается это на базе устройства. например, если нужна только частота, но не нужно ее изменение, то такое делается просто. устройство само считает частоту. при запросе частоты, на LPT порт подается значение частоты в данный момент времени. если нужно знать изменение частоты, то в устройстве должен быть буфер, в котором содержится изменение частоты с нужной дискретизацией по времени. и должна быть возможность дать программе прочитать этот буфер. |
|||
|
||||
| korian |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 2 Всего: 17 |
вот это по поводу как это лучше делать в плане устройства.
ну а в программном плане (если работать с тем что есть), вам нужно наследовать класс от CWinThread. и делать опрос устройства с подсчетом частоты в OnInitInstance. главная программа должна будет опрашивать этот поток... и не забудьте про сихнранизацию. в этом помогут классы CCriticalSection и CSingleLock. |
|||
|
||||
| Семен78 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 31.3.2008 Где: Kazan Репутация: нет Всего: нет |
Благодарю!
пошел теорию "грызть" .... |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
Семен78, Во первых тебе нужен источник опорной частоты.
всего есть 2 способа измерения частоты: в первом у тебя опорная частота меньше чем измеряемая, во втором - опорная частота больше чем измеряемая. описываю для первого случая... что-бы измерять частоту, во первых нужно как-то получать управление каждый раз когда приходит импульс на LPT (как это сделать хз, с параллельным портом никогда не работал), и тупо их считать. здесь важно что-бы не произошло переполнение переменной. то есть нужна переменная типа long, в которой у тебя-бы накапливалась сумма пришедших импульсов с датчика. В качестве источника опорной частоты можно использовать таймер, например с периодом 1с (для простоты))) при каждом срабатывании таймера рассчитываем частоту, а потом обнуляем счетчик как то так
при втором методе таймер и порт меняются местами, мы считаем сколько натикало по таймеру, и при появлении сигнала, переменная, в которой содержится количество тиков таймера будет содержать количество тиков таймера прошедших между приходами 2-х соседних импульсов с датчика. а с потоками заморачиваться не стоит, не думаю что погрешность будет заметна... |
|||
|
||||
| Семен78 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 31.3.2008 Где: Kazan Репутация: нет Всего: нет |
вот и проблемка как постоянно следить за появлением сигнала (опрашивать порт) - для двух случаев .
вычитал что тик таймера 55 мсек. ( а точность вроде 10 мсек.) а мои импульсы примерно 3 мсек.(300 имп. в сек.) |
|||
|
||||
| korian |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 2 Всего: 17 |
вешать сигнал надо не на данные, а на упровляющий "провод" LPT и обрабатывать соответствующие прерывание. в Windows на уровне пользователя обрабатывать прерывания нельзя, поэтому для такого варианта надо писать драйвер (вместо потока). что вообщем-то правильнее и обеспечит более лучшую работу (в том смысле что будет меньше или не будет вообще пропусков импульсов). |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 1 Всего: 110 |
не уверен, но, вгозможно, одна из линий LPT предназначена для индикации передачи данных
т.е. можно повесить на неё сигнал и просто читать из LPT (обычным ReadFile) в зависимости от того, сколько байт получится читать в секунду, можно посчитать частоту обработкой прерывания будет заниматься драйвер LPT, тчо лучше, чем обычное приложение P.S. естественно, это всё при том условии, что есть такой сигнал и стандартный драйвер ведёт себя соответствующим образом -------------------- qqq |
|||
|
||||
| Семен78 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 31.3.2008 Где: Kazan Репутация: нет Всего: нет |
похоже это тема не для раздела новичков - (казалось бы научить комп. посчитать импульсы .....
думаю может легче и точнее такой вариант: собираю схемку - генератор секундных импульсов с кварцем (часовым) и через доп. логику ограничиваю подачу считываемых импульсой секундной полосой . запускаю таймер на бесконечный цикл опроса порта каждые 1.5 сек. и второй таймер который через 1 комп. тик(55 мсек.) будет killtimer( предыдущий) - вот тока как их сопрячь по фазе и чтоб результат обновлять...? |
|||
|
||||
| korian |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 2 Всего: 17 |
очень не плохой вариант предложил maxim1000,
похожий сигнал у ECP Parallel LPT должен быть полюбому. осталость изучить как к нему прикрутиться правильно. а дальше... на таймере в программе читаем LPT порт. частота = количество прочитаных байт / (текущее время - предыдущее время чтения) при таком подходе, при 10-20кГц, пропусков поидее быть не должно. Это сообщение отредактировал(а) korian - 31.3.2008, 23:49 |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |