измерение длительности импульса
|
|
vova5812 |
Дата: Чт, 12.08.2010, 10:36 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
32
Замечания:
±
На сайте с 18.01.2010
Статус:
Offline
|
Как измерить длительность импульса командой pulsin, если он по длительности больше 655350 микросекунд? С уважением, Владимир.
|
|
|
|
retas |
Дата: Пт, 13.08.2010, 00:39 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
445
Замечания:
±
На сайте с 10.09.2007
Статус:
Offline
|
Как вариант - уменьшить частоту осцилятора МК.
|
|
|
|
ADMIN |
Дата: Пт, 13.08.2010, 07:31 | Сообщение # 3 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Quote Как вариант - уменьшить частоту осцилятора МК А как это поможет? Вопрос такой: какова частота МК? Какой МК? Какова максимальная длительность импульса? Вариант - по фронту импульса запускать TMR1 и при его переполнении по прерыванию инкрементировать переменную-счетчик и считать дальше. Естественно, подпрограмму обработки прерывания желательно минимализировать, высчитать, за сколько циклов она отработает и внести поправку в TMR1. И так далее.
|
|
|
|
Dmitry |
Дата: Пт, 13.08.2010, 21:08 | Сообщение # 4 |
Группа:
Пользователи
Ранг:
Могу и подсказать
Сообщений:
157
Замечания:
±
На сайте с 12.05.2009
Статус:
Offline
|
Quote (ADMIN) Естественно, подпрограмму обработки прерывания желательно минимализировать, высчитать, за сколько циклов она отработает и внести поправку в TMR1. И так далее. Не надо минимизировать, просто TMR1 не останавливать, пусть дальше считает, пока идет обработка прерывания
|
|
|
|
vova5812 |
Дата: Пт, 13.08.2010, 21:31 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
32
Замечания:
±
На сайте с 18.01.2010
Статус:
Offline
|
MK PIC16F84A, F=4mHz, длительность импульса 750 милисекунд.
Сообщение отредактировал
vova5812 - Пт, 13.08.2010, 21:39
|
|
|
|
retas |
Дата: Пт, 13.08.2010, 22:54 | Сообщение # 6 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
445
Замечания:
±
На сайте с 10.09.2007
Статус:
Offline
|
Ну вот, при F=4mHz минимальный вес единицы измерения будет равно 10 мкс а, скажем, при 40кГц она будет в 100 раз больше, т.е. 1000мкс. Обратите внимание - автор хочет применять pulsin, хотя в его случае это наверное не разумно.
|
|
|
|
ADMIN |
Дата: Сб, 14.08.2010, 06:57 | Сообщение # 7 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Quote Ну вот, при F=4mHz минимальный вес единицы измерения будет равно 10 мкс а, скажем, при 40кГц она будет в 100 раз больше, т.е. 1000мкс. А какова же будет точность измерения при таком подходе? Quote Не надо минимизировать, просто TMR1 не останавливать, пусть дальше считает, пока идет обработка прерывания Ну да, правильно, он же не останавливается на время прерывания.
|
|
|
|
vova5812 |
Дата: Пн, 16.08.2010, 11:48 | Сообщение # 8 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
32
Замечания:
±
На сайте с 18.01.2010
Статус:
Offline
|
Спасибо всем, кто подключился к этой теме! Нарезка в 10 мксек меня вполне устраивает по точности измерения. Я ,как начинающий, с прерываниями еще не писал код ни разу. Если возможно, покажите фрагмент программы на PicBasic для обработки длительности импульса с использованием прерываний.
|
|
|
|
terrarus |
Дата: Пн, 16.08.2010, 12:12 | Сообщение # 9 |
Группа:
Пользователи
Ранг:
Помогаю всем
Сообщений:
451
Замечания:
±
На сайте с 21.08.2008
Статус:
Offline
|
Команда PulsIn может максимально считать до 65535 и не более, поэтому максимальная измеряемая длительность примерно равна 750мсек. при частоте тактового генератора 4 мгц. Естественно разрешение составит 10 мксек. http://www.terrarus.ucoz.ru/proton_....in.html PS. Можно аппаратно увеличить измеряемый интервал в два раза , если с датчика будет приходить не один импульс, а два. Затем обсчитывать и потом приводить к одному.
Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
Сообщение отредактировал
terrarus - Пн, 16.08.2010, 12:16
|
|
|
|
vova5812 |
Дата: Пт, 27.08.2010, 15:55 | Сообщение # 10 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
32
Замечания:
±
На сайте с 18.01.2010
Статус:
Offline
|
Все дело в том, что с датчика Холла(автомобильное зажигание), приходит импульс очень большой длительности (в момент раскрутки двс стартером),а мне надо измерить длительность и 1 и 0, чтобы затем вычислить скважность. Все дело в том, что по трамблерам для ВАЗов, в частности, идет большой разброс по скважности выходного импульса. Чтобы программа, управляющая углом зажигания, не зависела от разброса по скважности, пусть микроконтроллер сам измеряет скважность на старте двс, таким образом настраиваясь на данный экземпляр трамблер-ДХ, внося коррективы программно в длительность уже своего управляющего импульса на своем выходе плюс естественно собственная расчетная длительность по углам в зависимости от заложеной математики расчета углов по оборотам двс. Программа уже обкатывается на Вазовском двигателе(НИВА), на сегодняшний день корректировать приходится пока вручную, измеряя длительности 1 и 0 на выходе ДХ(датчик Холла) осциллографом, для того чтобы установить устройство на другой ДВС. Делать это приходится один раз, для данного экземпляра ДХ, но этот процесс можно автоматизироать, тогда устройство будет самонастраиваться и не зависеть от этого досадного обстоятельства.Добавлено (27.08.2010, 15.55.23) --------------------------------------------- Спасибо огромное всем, кто откликнулся! Решение нашел сам, как всегда все рядом... Проект не коммерческий...
|
|
|
|
terrarus |
Дата: Пт, 27.08.2010, 16:15 | Сообщение # 11 |
Группа:
Пользователи
Ранг:
Помогаю всем
Сообщений:
451
Замечания:
±
На сайте с 21.08.2008
Статус:
Offline
|
Ну если проект не коммерческий, поделитесь найденным решением. Интересно все же....
Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
|
|
|
|
vova5812 |
Дата: Ср, 01.09.2010, 22:47 | Сообщение # 12 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
32
Замечания:
±
На сайте с 18.01.2010
Статус:
Offline
|
Просто измерения провожу на более высоких оборотах ДВС, после того, как он завелся. Вот вопрос, на который в имеющейся литературе, я ответ найти не могу пока... Задавать вопросы-тоже способ познания предмета! Пример из моей практики начинающего ниже. Как при помощи PicBasicPro более-менее точно разделить 3500/1500. На калькуляторе ответ 2,33333... У меня в PicBasicPro получается ответ 3500/1500=2(целое) Если продолжить деление 3500//1500=500(остаток) Что с этими результатами деления дальше делать, неужели имитировать деление столбиком, умножая остаток на 10 и т.д.?
|
|
|
|
ivan_fd |
Дата: Ср, 01.09.2010, 23:49 | Сообщение # 13 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Ну можно уйти с PicBasicPro, и перейти на Proton. А можно использовать библиотеку в PicBasicPro для работы с дробными числами. Ссылка была на сайте, но что то не могу найти. Доступно только для пользователей
Сообщение отредактировал
ivan_fd - Ср, 01.09.2010, 23:49
|
|
|
|
terrarus |
Дата: Чт, 02.09.2010, 08:58 | Сообщение # 14 |
Группа:
Пользователи
Ранг:
Помогаю всем
Сообщений:
451
Замечания:
±
На сайте с 21.08.2008
Статус:
Offline
|
Quote (vova5812) Как при помощи PicBasicPro более-менее точно разделить 3500/1500. На калькуляторе ответ 2,33333... Quote (ivan_fd) Ну можно уйти с PicBasicPro, и перейти на Proton Dim VR1 as Float Dim VR2 as Word VR1 = 3500 VR2 = 1500 VR1 = VR1 / VR2 ' Результат будет равен 2.333
Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
|
|
|
|
Dmitry |
Дата: Пт, 03.09.2010, 02:40 | Сообщение # 15 |
Группа:
Пользователи
Ранг:
Могу и подсказать
Сообщений:
157
Замечания:
±
На сайте с 12.05.2009
Статус:
Offline
|
Разбаловались тут с Протоном, а в PBP тоже можно точно поделить: Code a VAR WORD b VAR WORD tmp VAR WORD res VAR WORD
a = 3500 b = 1500
DISABLE ' Нужно ставить, если в программе есть On Interrupt tmp = a * 1000 ' в tmp записывается младшие 16 бит результата, а во внутренней переменной компилятора - ' полный 32-битный результат (точнее 31-битный, число не более 2 147 483 648) ' tmp больше нигде не используется, это просто переменная-заглушка res = DIV32 1500 ' Внутренняя 32-битная переменная делится на 1500, получаем res=2333 ' Не допускается никаких других команд между предыдущим умножением и командой DIV32, ' иначе потеряется результат умножения во внутренней переменной компилятора ENABLE ' Нужно ставить, если в программе есть On Interrupt Дальше работаем с переменной res, зная, что число в ней на 3 порядка больше. По другому с дробными числами в PBP нельзя, только увеличивать на 2-3 порядка и учитывать это в дальнейших расчетах. Зато экономия памяти по сравнению с Протоновским float сумасшедшая. Применяю сей метод и в протоне на мелких процах с 2-4 Кб памяти.
Сообщение отредактировал
Dmitry - Пт, 03.09.2010, 02:44
|
|
|
|