Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Частотомер, простая програмка mfc  
:(
    Опции темы
Семен78
Дата 31.3.2008, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 31.3.2008
Где: Kazan

Репутация: нет
Всего: нет



Хочу мерить частоту оборотов на двигателе -  железо готово(опрос LPT)  - набираюсь мыслей по софту:
 В MFC    -  Edit box  и   Кнопка на которой  наввешу :
  таймер  1 сек . который
 запускает бесконечный цикл с опросом порта  и  записью единичек ....
  Ну и надеюсь видеть цифру новую каждую сек.  
 Вопрос -  как  закончить цикл при наступлении следующей команды от таймера?  
  
PM MAIL   Вверх
korian
Дата 31.3.2008, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 2
Всего: 17



Цитата(Семен78 @  31.3.2008,  13:02 Найти цитируемый пост)
запускает бесконечный цикл с опросом порта  

это необходимо делать?
вообще лучше расскажите, что надо сделать, не опираясь на реализацию, а то так не понятно...

самый простой вариант, когда программа просто опрашивать порт каждую секунду:
на диалог ставим Edit
при инизиализации диалога, инициализируем таймер, устанавливаем обновление 1 сек.
в функции таймера, читаем порт и выводим данные в edit

PM   Вверх
Семен78
Дата 31.3.2008, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 31.3.2008
Где: Kazan

Репутация: нет
Всего: нет



крутится вал около 10 -20 тыс.  оборотов в секунду    -   на валу метка для датчика который  висит на LPT. 
  надо точно мерить частоту вращения не пропуская ни одного оборота  -   
полагаю что частота выполнения бесконечного цикла с опросом порта много выше чем частота вала 
PM MAIL   Вверх
Andrey44
Дата 31.3.2008, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 2
Всего: 26



korian, поддерживаю твое мнение. Бесконечный цикл не нужен. 
Тогда это надо делать в другом потоке. Самый лучший вариант - таймер.


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
korian
Дата 31.3.2008, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 2
Всего: 17



Цитата(Семен78 @  31.3.2008,  13:23 Найти цитируемый пост)
полагаю что частота выполнения бесконечного цикла с опросом порта много выше чем частота вала

предположение не совсем верное.

Цитата(Семен78 @  31.3.2008,  13:23 Найти цитируемый пост)
на валу метка для датчика который  висит на LPT

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

Цитата(Семен78 @  31.3.2008,  13:23 Найти цитируемый пост)
надо точно мерить частоту вращения не пропуская ни одного оборота  

этого сделать средствами Windows нельзя, т.к. любой поток/процесс может замереть на неопределенное время и соответсвенно потерять часть данных.
вообщем-то это нельзя сделать средствами компа на базе x86, т.к. он не является системой реального времени.
если это не настолько критично, т.е. иногда можно пропускать куски данных, то можно попробывать реализовать, но никто не гарантирует, когда будет пропущен кусок и какого размера он будет.

где-то это уже обсуждалось... щас попробую найты ссылку, почитаете подробнее.
PM   Вверх
Семен78
Дата 31.3.2008, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 31.3.2008
Где: Kazan

Репутация: нет
Всего: нет



что то типа  этого ?
Код

void CMy7Dlg::OnButton1() 
{
    // TODO: Add your control notification handler code here
    SetTimer(1, 1000, NULL);
}
void CMy7Dlg::OnTimer(UINT nIDEvent) 
{
    // TODO: Add your message handler code here and/or call default
                   r=0; // Счетчик оборотов
    while(nIDEvent == 1)
{
         int c=Inp32(0x378);
                      if(c=1) {r++}
 }
                             UpdateData(false);
            
CDialog::OnTimer(nIDEvent);
}



Добавлено через 7 минут и 50 секунд
ну вобщем как уж получится  -  хочу попробовать  
 возможно ли  оценить погрешность ?   как же работают всякие  виртуальные приборы где важна точность?
PM MAIL   Вверх
korian
Дата 31.3.2008, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 2
Всего: 17



Цитата(Семен78 @  31.3.2008,  13:46 Найти цитируемый пост)
что то типа  этого ?

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

Добавлено через 8 минут и 16 секунд
Цитата(Семен78 @  31.3.2008,  13:46 Найти цитируемый пост)
как же работают всякие  виртуальные приборы где важна точность? 

делается это на базе устройства.
например, если нужна только частота, но не нужно ее изменение, то такое делается просто.
устройство само считает частоту.
при запросе частоты, на LPT порт подается значение частоты в данный момент времени.
если нужно знать изменение частоты, то в устройстве должен быть буфер, в котором содержится изменение частоты с нужной дискретизацией по времени. и должна быть возможность дать программе прочитать этот буфер.

PM   Вверх
korian
Дата 31.3.2008, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 2
Всего: 17



вот это по поводу как это лучше делать в плане устройства.
ну а в программном плане (если работать с тем что есть), вам нужно наследовать класс от CWinThread. и делать опрос устройства с подсчетом частоты в OnInitInstance.
главная программа должна будет опрашивать этот поток...
и не забудьте про сихнранизацию. в этом помогут классы CCriticalSection и CSingleLock.

PM   Вверх
Семен78
Дата 31.3.2008, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 31.3.2008
Где: Kazan

Репутация: нет
Всего: нет



Благодарю!   
 пошел теорию "грызть" ....
PM MAIL   Вверх
Lazin
Дата 31.3.2008, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 27
Всего: 154



Семен78, Во первых тебе нужен источник опорной частоты.
всего есть 2 способа измерения частоты: в первом у тебя опорная частота меньше чем измеряемая, во втором - опорная частота больше чем измеряемая.
описываю для первого случая...
что-бы измерять частоту, во первых нужно как-то получать управление каждый раз когда приходит импульс на LPT (как это сделать хз, с параллельным портом никогда не работал), и тупо их считать.
здесь важно что-бы не произошло переполнение переменной.  
то есть нужна переменная типа long, в которой у тебя-бы накапливалась сумма пришедших импульсов с датчика.
В качестве источника опорной частоты можно использовать таймер, например с периодом 1с (для простоты)))
при каждом срабатывании таймера рассчитываем частоту, а потом обнуляем счетчик

как то так 

Код

unsigned long lpt_cnt = 0;
double current_frequensy = 0;

void on_signal()
{
  lpt_cnt++;
}

void on_timer()
{
  current_frequensy = 1.0f/lpt_cnt;  
}


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

PM MAIL Skype GTalk   Вверх
Семен78
Дата 31.3.2008, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 31.3.2008
Где: Kazan

Репутация: нет
Всего: нет



вот и проблемка как постоянно следить за появлением сигнала (опрашивать порт) -  для двух случаев .
  вычитал что тик таймера 55 мсек.   ( а точность вроде 10 мсек.)   а мои импульсы примерно 3 мсек.(300 имп. в сек.) 
PM MAIL   Вверх
korian
Дата 31.3.2008, 16:51 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 2
Всего: 17



Цитата(Семен78 @  31.3.2008,  15:04 Найти цитируемый пост)
вот и проблемка как постоянно следить за появлением сигнала 

вешать сигнал надо не на данные, а на упровляющий "провод" LPT и обрабатывать соответствующие прерывание.
в Windows на уровне пользователя обрабатывать прерывания нельзя, поэтому для такого варианта надо писать драйвер (вместо потока).
что вообщем-то правильнее и обеспечит более лучшую работу (в том смысле что будет меньше или не будет вообще пропусков импульсов).

PM   Вверх
maxim1000
Дата 31.3.2008, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 1
Всего: 110



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

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


--------------------
qqq
PM WWW   Вверх
Семен78
Дата 31.3.2008, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 31.3.2008
Где: Kazan

Репутация: нет
Всего: нет



похоже это тема не для раздела новичков  -  (казалось бы научить комп. посчитать импульсы ..... smile 

   думаю может  легче и точнее такой вариант: 
  собираю схемку - генератор секундных импульсов с кварцем (часовым)  и  через доп. логику  ограничиваю подачу считываемых импульсой  секундной полосой .
  запускаю таймер на бесконечный цикл опроса порта  каждые 1.5 сек.    и второй таймер который через 1 комп. тик(55 мсек.) будет killtimer( предыдущий)  - вот тока как их сопрячь по фазе  и чтоб результат  обновлять...?
PM MAIL   Вверх
korian
Дата 31.3.2008, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 2
Всего: 17



очень не плохой вариант предложил maxim1000,
похожий сигнал у ECP Parallel LPT должен быть полюбому.
осталость изучить как к нему прикрутиться правильно.
а дальше...
на таймере в программе читаем LPT порт.
частота = количество прочитаных байт / (текущее время - предыдущее время чтения)
при таком подходе, при 10-20кГц, пропусков поидее быть не должно.


Это сообщение отредактировал(а) korian - 31.3.2008, 23:49
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0623 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.