Форум по микроконтроллерам: Счетчик Импульсов - Форум по микроконтроллерам

Перейти к содержимому

Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

Счетчик Импульсов Может кто уже делал?

#1 Пользователь офлайн   skrvad 

  • Активный участник
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 48
  • Регистрация: 05 Февраль 10

Отправлено 17 Февраль 2010 - 12:48

Доброго всем дня или вечера. Мне необходимо сосчитать импульсы со скоростью КМОП(561) логики.
Может кто уже решал подобную задачу?
Подробно. В станке три режима измерений.
1 Поворот на заданный градус.
2 Реверсивное измерение движения.
3 Однонаправленное измерение движения.
Все работает на железной логике, ни единого контроллера. Датчики использую мышиные оптические.
Исполнительные механизмы 3 шаговых двигателя + 1(рабочий асинхронник). Все работает довольно надежно.
Время от времени изменяется либо 1, либо 3 измерение. И получается не точность.
(Механика жесткая, редукторы без люфтов, шаговики не на пределе возможности
в момент измерения вибрация отсутствует).
С мышиного датчика сигнал идет на компаратор с демпфером.
Осцилограф не видит помех от датчиков.
Остается одно считать импульсы паралельно схеме для сравнения.
Собрал в Проте. схемку на PIC16f628 с выходом на LCD, написал на Бейсике счетчик с ростом частоты до 2к пропуски импульсов.
Попробовал СИ там код прошивки на пределе (дальше не ковырял).
На Асм не писал (не знаю). Хочу позже переделать платы упраления на процессоры.
Подскажите, как решить первую задачку, не наступая на грабли.
Заранее спасибо Вадим.
(Может куда еще написать подскажите.)
С 98г. электроника как хобби, но сейчас пдумываю заниматься ею плотнее.
0

#2 Пользователь офлайн   Admin 

  • Администратор
  • PipPipPip
  • Группа: Администратор
  • Сообщений: 585
  • Регистрация: 08 Август 08

Отправлено 17 Февраль 2010 - 19:12

Если нужно просто сосчитать кол-во импульсов поступивших на вход МК, то лучше всего использовать прерывания. При каждом прерывании инкрементировать кол-во импульсов и выводить на ЛСД.
0

#3 Пользователь офлайн   skrvad 

  • Активный участник
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 48
  • Регистрация: 05 Февраль 10

Отправлено 17 Февраль 2010 - 20:05

Спасибо за ответ. Именно так я и делаю. Подключаю вместе со своим счетчиком счетчик протеуса. До 2кГц частотой импульсы считаются правильно, а частотой выше начинаются пропуски. Может не на бейсике нужно писать? Может какую-то часть на Асм нужно. То ,что в продаже есть пишут счетчик готовый до 30 кГц. Это го наверное не хватит. Мне нужно сверить импульсы с датчика, а там непонятно отуда берутся иногда всплески, на станке считает 561 серия. Или там наводки, или косяк датчика. Осцилограф не помогает. Нет последовательности проблемы. 8 часов может работать нормально, а может за 10 минут выдать 2-3 раза сбой счета.
Вадим.
С 98г. электроника как хобби, но сейчас пдумываю заниматься ею плотнее.
0

#4 Пользователь офлайн   Alex 

  • Активный участник
  • PipPipPip
  • Группа: Администратор
  • Сообщений: 320
  • Регистрация: 08 Август 08
  • Пол:Мужчина
  • Город:http://forum.eldigi.ru/

Отправлено 18 Февраль 2010 - 08:59

Вам нужно заюзать таймер с внешним тактированием. Не пропустит ни одного импульса. До 30-40 Мгц будет работать.
0

#5 Пользователь офлайн   skrvad 

  • Активный участник
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 48
  • Регистрация: 05 Февраль 10

Отправлено 18 Февраль 2010 - 12:41

Просмотр сообщенияAlex (18.2.2010, 8:59) писал:

Вам нужно заюзать таймер с внешним тактированием. Не пропустит ни одного импульса. До 50-70 Мгц будет работать.

Спасибо.
Я пробую, подключаю TMR0 в OPTION на RA.4 и обнуляю после считывания.
Вроде бы правильно? А с переполнениями пока не понял как их организовать или по каким адресам они находятся.
С 98г. электроника как хобби, но сейчас пдумываю заниматься ею плотнее.
0

#6 Пользователь офлайн   Alex 

  • Активный участник
  • PipPipPip
  • Группа: Администратор
  • Сообщений: 320
  • Регистрация: 08 Август 08
  • Пол:Мужчина
  • Город:http://forum.eldigi.ru/

Отправлено 18 Февраль 2010 - 19:19

Какие переполнения Вы имеете в виду ?
0

#7 Пользователь офлайн   skrvad 

  • Активный участник
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 48
  • Регистрация: 05 Февраль 10

Отправлено 18 Февраль 2010 - 19:37

Просмотр сообщенияAlex (18.2.2010, 19:19) писал:

Какие переполнения Вы имеете в виду ?

TMR0 использую как счетчик до 255 импульсов, по другому пока не получается.
Поэтому приходится его часто проверять и обнулять. Вычитал что его можно использовать с переполнениями в 3-х переменных, 1-сам счетчик, 2-я x255, 3-я x255x255 в сумме 255+(255*255)+(255*255*255)=16 646 655 импульсов до заполнения счетчика соотв. проверять (считывать результат) намного реже. Как это сделать пока не въехал.
Спасибо за участие.
С 98г. электроника как хобби, но сейчас пдумываю заниматься ею плотнее.
0

#8 Пользователь офлайн   Alex 

  • Активный участник
  • PipPipPip
  • Группа: Администратор
  • Сообщений: 320
  • Регистрация: 08 Август 08
  • Пол:Мужчина
  • Город:http://forum.eldigi.ru/

Отправлено 18 Февраль 2010 - 19:58

Это называется предделитель, и постделитель. Т.е. до и после таймера можно подключить аппаратные счётчики.
Но нужно учитывать одно, что Вы не сможете считать значения этих делителей. Они нужны только для подсчёта полных (вместе с делителями) переполнений таймера.
Что Вам нужно. А нужо задействовать не TMR0, а TMR1 (он 16 бит) и считать ещё его переполнения. Переполнения можно узнать просто - прерывание. Делаем обработчик и инкрементируем в нём переменную. Она и будет являться старшими байтами Вашего счётчика.
0

#9 Пользователь офлайн   skrvad 

  • Активный участник
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 48
  • Регистрация: 05 Февраль 10

Отправлено 18 Февраль 2010 - 21:24

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

#10 Пользователь офлайн   Alex 

  • Активный участник
  • PipPipPip
  • Группа: Администратор
  • Сообщений: 320
  • Регистрация: 08 Август 08
  • Пол:Мужчина
  • Город:http://forum.eldigi.ru/

Отправлено 18 Февраль 2010 - 21:38

Незачто. Обращайтесь если что.
0

#11 Пользователь офлайн   skrvad 

  • Активный участник
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 48
  • Регистрация: 05 Февраль 10

Отправлено 27 Февраль 2010 - 10:20

Просмотр сообщенияAlex (18.2.2010, 21:38) писал:

Незачто. Обращайтесь если что.

А можно еще помощи?
Все работает, все примерно хорошо. Только Прот. ругается, пишет

[PIC 16 CORE] PC=0x009B Stack underflow executing CALL i.
[PIC 16 CORE] PC=0x005D Stack underflow executing RETURN instruction.

Ну и так далее, только адреса меняются. Причем, ошибка начинается после 5-го импульса.
Вписал местами, где возврат из условных переходов CLRWDT, стал Прот. ругаться меньше
Не 7500 ошибок а 4500, после добавил в двух местах PCON = %00000111 , Стало ошибок
меньше 2000.

Я чего-то не понимаю. Вложений GoSub у меня не более 3-х. Стэк переполняться не может.
Счетчик команд я не контролирую. Или компилятор не верный. Или настройки Протеуса не
правильные. Или то, что на бейсике я написал програмку?

Подскажите. Могу выложить все файлы, если нужно.


Позже нашел в Debug Протеуса отключил instruction execution. Ошибки больше не показывает
но сомнения остались. Раз выскакивали ошибки значит они есть?
С 98г. электроника как хобби, но сейчас пдумываю заниматься ею плотнее.
0

#12 Пользователь офлайн   Alex 

  • Активный участник
  • PipPipPip
  • Группа: Администратор
  • Сообщений: 320
  • Регистрация: 08 Август 08
  • Пол:Мужчина
  • Город:http://forum.eldigi.ru/

Отправлено 28 Февраль 2010 - 08:26

Это не протеус виноват. Включите эту опцию обратно, дабы потом не напороться на глюки.
Ошибка явно в программе. И не важно сколько у Вас там вложений, стек может переполняться и без них.
Выложите проект, посмотрим.
0

#13 Пользователь офлайн   Alex 

  • Активный участник
  • PipPipPip
  • Группа: Администратор
  • Сообщений: 320
  • Регистрация: 08 Август 08
  • Пол:Мужчина
  • Город:http://forum.eldigi.ru/

Отправлено 28 Февраль 2010 - 09:27

Вот накатал примерчик, гляньте. Правда на Си, но код прокоментирован достаточно, что бы понять что к чему.
Прикрепленный файл  pulse.rar (19,25К)
Количество загрузок:: 247
Удачи.
0

#14 Пользователь офлайн   skrvad 

  • Активный участник
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 48
  • Регистрация: 05 Февраль 10

Отправлено 28 Февраль 2010 - 11:21

Просмотр сообщенияAlex (28.2.2010, 9:27) писал:

Вот накатал примерчик, гляньте. Правда на Си, но код прокоментирован достаточно, что бы понять что к чему.
Прикрепленный файл pulse.rar
Удачи.

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

Я полностью все файлы выкладываю. Асм+Pbe в матлабе пробовал компилировать, получается тоже самое.

Прикрепленные файлы

  • Прикрепленный файл  Pr.rar (51,92К)
    Количество загрузок:: 117

С 98г. электроника как хобби, но сейчас пдумываю заниматься ею плотнее.
0

#15 Пользователь офлайн   skrvad 

  • Активный участник
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 48
  • Регистрация: 05 Февраль 10

Отправлено 28 Февраль 2010 - 11:38

Спасибо пример оОчень хорошо расписан, для чайников как я. Почитаю Си и плотненько им займусь, только мне вот эти скобочки всякие не очень. А в визуале Си++ можно пробовать что нибудь? Там просто если вопрос возник, поставил на слово курсор и F1 и справка по слову выскакивает. Может что подобное и для PIC есть?
С 98г. электроника как хобби, но сейчас пдумываю заниматься ею плотнее.
0

#16 Пользователь офлайн   Alex 

  • Активный участник
  • PipPipPip
  • Группа: Администратор
  • Сообщений: 320
  • Регистрация: 08 Август 08
  • Пол:Мужчина
  • Город:http://forum.eldigi.ru/

Отправлено 28 Февраль 2010 - 13:04

Посмотрел Вашу програму, и если честно, ничего в ней не понял (
Запустил Ваш проект, ничего не показывает почему-то :blink: Нашёл ошибку, импульсы должны приходить не на RB7, а на RB6. Подключил туда, всё равно ничего не показывает, одни нули :)
По поводу визуала Си, если имеете в виду для компа, то можете поюзать, синтаксис такой-же.

Цитата

Там просто если вопрос возник, поставил на слово курсор и F1 и справка по слову выскакивает. Может что подобное и для PIC есть?
Тут такого нет.
Скачайте . Там и Русский манул есть. Попробуйте, поюзайте. Для начинающих самое то.
0

#17 Пользователь офлайн   skrvad 

  • Активный участник
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 48
  • Регистрация: 05 Февраль 10

Отправлено 28 Февраль 2010 - 13:21

Просмотр сообщенияAlex (28.2.2010, 13:04) писал:

Посмотрел Вашу програму, и если честно, ничего в ней не понял (
Запустил Ваш проект, ничего не показывает почему-то :blink: Нашёл ошибку, импульсы должны приходить не на RB7, а на RB6. Подключил туда, всё равно ничего не показывает, одни нули :)
По поводу визуала Си, если имеете в виду для компа, то можете поюзать, синтаксис такой-же.

Тут такого нет.
Скачайте . Там и Русский манул есть. Попробуйте, поюзайте. Для начинающих самое то.

Спасибочки. В том проекте просто сначала нужно сброс нажать а потом считает все.
А сдесь сразу может считать но без сброса первого теряется 1-й импульс, после считает правильно.
7FFF последняя цифра накопления счетчика, дальше не думал, мне нужно не больше 1000.

Прикрепленные файлы

  • Прикрепленный файл  Pr1.rar (52,63К)
    Количество загрузок:: 102

С 98г. электроника как хобби, но сейчас пдумываю заниматься ею плотнее.
0

#18 Пользователь офлайн   Alex 

  • Активный участник
  • PipPipPip
  • Группа: Администратор
  • Сообщений: 320
  • Регистрация: 08 Август 08
  • Пол:Мужчина
  • Город:http://forum.eldigi.ru/

Отправлено 28 Февраль 2010 - 16:51

Ну всё у Вас нормально считает, без ошибок. А если нужно всего до 1000, тогда переполнения таймера смысла считать нет, его и так будет достаточно. :blink:
0

#19 Пользователь офлайн   Alex 

  • Активный участник
  • PipPipPip
  • Группа: Администратор
  • Сообщений: 320
  • Регистрация: 08 Август 08
  • Пол:Мужчина
  • Город:http://forum.eldigi.ru/

Отправлено 28 Февраль 2010 - 17:08

Нашёл у Вас ошибку по стеку. В отладчике видно хорошо что он переполняется.

Кусок кода.
ID:	 Ke = Le
		I = Ke - (( Ke / 10 ) * 10 )
		D = (Ke - Ke/100*100 - I)/10
		S = (Ke - Ke/1000*1000 - I - D*10)/100
		T = (Ke - Ke/10000*10000-I-D*10-S*100)/1000
		ST = Ke / 100000
		DesT = (Ke - ST*100000) / 10000
		GoSub St1
		CLRWDT
		GoTo main
Он выполняется после каждого приходящего импульса.
Во первых, это не правильно, т.к. этот кусок выполняется дольше периода приходящих импульсов, но это не критично. Во вторых, после инструкции GoSub St1, обратно возврата нет, т.е. до следующей инструкции (CLRWDT) программа не доходит. По этому после нескольких импульсов происходит переполнение.
0

#20 Пользователь офлайн   skrvad 

  • Активный участник
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 48
  • Регистрация: 05 Февраль 10

Отправлено 28 Февраль 2010 - 17:27

Все именно так. Большущее спасибо. Соберу в железе а потом буду копать Си.
С 98г. электроника как хобби, но сейчас пдумываю заниматься ею плотнее.
0

Поделиться темой:


Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей