Easyelectronics.ru

Электроника для всех
Текущее время: 14 дек 2018, 06:00

Часовой пояс: UTC + 5 часов




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: SAMD21 таймер
СообщениеДобавлено: 20 янв 2018, 06:53 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 23 мар 2012, 16:18
Сообщения: 146
Столкнулся с новой задачей. Нужно поступающие на вход пачки импульсов с частотой
около 90 кГц, подсчитать. Длина пачки импульсов около 10-55 мс(зависит от кол-ва импульсов). За это время может проскочить
от 1 до 4096 импульсов. Затем идет пауза, около 50 мс (боле-менее стабильно).
Сейчас вариант подсчета реализован через прерывание, без таймера. Все ок, но подсчет идет софтварно и не всегда
это удобно, т.к. это не основная задача процессора. Нужно организовать подсчет через таймер, дабы
количество подсчитанных импульсов записывалось в переменную. А уж из переменной они извлекались по
необходимости. Может кто уже решал данный вопрос, без применения ASF ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SAMD21 таймер
СообщениеДобавлено: 22 янв 2018, 22:18 
Только пришел

Зарегистрирован: 21 фев 2017, 01:23
Сообщения: 16
zat, приветствую. Можно воспользоваться Event System микроконтроллера. External Interrupt Controller будет ловить импульсы и генерировать события (event) на каждый импульс. Эти события может поймать таймер (TC или TCC) и увеличить свой счётчик на единицу. Эти действия будут происходить без вмешательства ядра микроконтроллера. Вам же нужно будет периодически считывать значение счётчика таймера, значение которого будет равно количеству импульсов, ну и обрабатывать возможные ситуации его переполнения. Вот как-то так, если я правильно понял задачу.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SAMD21 таймер
СообщениеДобавлено: 23 янв 2018, 23:06 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 23 мар 2012, 16:18
Сообщения: 146
Да вроде так и пытаюсь сделать, но что-то идет не так. Задача в целом простая.
На вход компаратора поступают пачки импульсов. Частота следования 90 кГц.
Длительность одной пачки до 50 мс (4096 имп. максимум). Затем пауза 50 мс. и так постоянно. Длительность
пачки зависит от кол-ва импульсов, но пауза всегда 50 +- 4 мс.
Попробовал сделать через таймер.
Ловлю первый импульс в пачке, запоминаем в переменной, пауза, обнуление и опять по кругу.
Но что-то идет не так.
Такое ощущение, что счетчик не в ту сторону считает, или я неправильно подсчитал тайминги.
Сейчас выдает 1200 импульсов, но периодически прыгает значение, то 300 ,то 800, то 1200.
А должно быть постоянно почти 1200 +- 20 . Т..е таймер как-то не так считает. Как будто временной
интервал попадает в середину пачки.
Сегодня уже подумал, что выведу на лапу сигнал от таймера и гляну осликом, что же там происходит.
Осциллограмма входного сигнала.


Вложения:
Pulse.png
Pulse.png [ 36.04 Кб | Просмотров: 576 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SAMD21 таймер
СообщениеДобавлено: 24 янв 2018, 22:28 
Только пришел

Зарегистрирован: 21 фев 2017, 01:23
Сообщения: 16
Если не затруднит, можно чуть подробней о связке компаратора и таймера? Паузу между пачками определяете от первого или последнего импульса?
Если не жалко двух таймеров, то могу предложить такой вариант (SAMD21_TC_EVSYS.ZIP, чуть модифицировал предложение из предыдущего своего сообщения). Правда я использую не компаратор, а EIC, но не суть важно. По детекции переднего фронта на PA15 (EXTINT15), генерится событие. Это событие по Event channel 0 передаётся таймеру TC3. Таймер TC3, получив событие, отрабатывает Event action - увеличивает свой счётчик на 1. Это же событие от EXTINT15 по Event channel 1 передаётся таймеру TC4. Таймер TC4 отрабатывает Event action Retrigger - или стартует, если остановлен, или сбрасывает значение своего счётчика, если запущен. После детекции последнего импульса в пачке таймер TC4 тикает до переполнения (импульсов нет, никто сообщения таймеру не посылает). Переполнение таймера происходит примерно через 1.5 мс. Этого вполне достаточно, чтобы быть уверенным, что импульсы с частотой 90кГц уже не идут. Время можно и меньше поставить, но тут цель показать сам принцип. Итак, таймер TC4 переполнился, сгенерировалось прерывание по переполнению. Можно считывать счётчик TC3, который будет равен количеству импульсов в пачке. Да, два таймера жирновато для такой простой задачи, но зато ядро микроконтроллера будет отвлекаться на подсчёт импульсов только на момент прерывания TC4.


Вложения:
SAMD21_TC_EVSYS.ZIP [14.58 Кб]
Скачиваний: 33
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SAMD21 таймер
СообщениеДобавлено: 25 янв 2018, 20:20 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 23 мар 2012, 16:18
Сообщения: 146
Спасибо, сегодня поковыряюсь, отпишусь. ТС3 и ТС4 вместе будут работать ? Просто они же как бы пара, один регистр делят
пополам. И вот обратил внимание, в евенте задается обратный отсчет. Я обратный отсчет задаю в счетчике, евент не использую. Может не в ту сторону задаю, или неправильно, но теперь думаю можно будет проверить.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SAMD21 таймер
СообщениеДобавлено: 25 янв 2018, 22:05 
Только пришел

Зарегистрирован: 21 фев 2017, 01:23
Сообщения: 16
Цитата:
ТС3 и ТС4 вместе будут работать ?

Да, у меня таймеры используются в 16-и битном режиме. В этом случае они работают независимо друг от друга. А вот в 32-х битном режиме это уже единый таймер TC4.
Мой пардон - заметил несколько очепяток.
1. TC4 переполняется примерно за 8 мс, а не за 1.5 мс.
2. Функция EVSYS_Init настройка Event channel 1, опечатки в комментариях. На работу, конечно, не влияет, но во избежании когнитивного диссонанса при вечерне-ночном анализе кода лучше поправлюсь. Правильно будет так
Код:
EVSYS->USER.reg = EVSYS_USER_CHANNEL(2) | EVSYS_USER_USER(0x13); // Channel 1, Event user - TC4
EVSYS->CHANNEL.reg = EVSYS_CHANNEL_CHANNEL(1) | EVSYS_CHANNEL_PATH_ASYNCHRONOUS | EVSYS_CHANNEL_EVGEN(0x1B); // Channel 1, Event generator - EXTINT15


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB