www.open-tager.ru
http://www.open-tager.ru/forum/

Умный датчик. Smart sensor.
http://www.open-tager.ru/forum/viewtopic.php?f=5&t=4949
Страница 4 из 17

Автор:  Alexies [ 27 дек 2016, 13:42 ]
Заголовок сообщения:  Re: Умный датчик. Smart sensor.

Pingvin писал(а):
Как у Вас происходит захват?
Я так и не понял... :?

Строчка
Код:
HAL_TIM_IC_Start_IT(&htim14, TIM_CHANNEL_1);

запускает таймер 14 в режиме Input Capture для канала 1. Таймер настроен на захват по обоим фронтам первого канала (см. tim.c). Когда приходит любой фронт, HAL вызывает каллбэк
Код:
HAL_TIM_IC_CaptureCallback()

Строчка
Код:
uint16_t capture_time = htim->Instance->CCR1;

записывает время захвата в тиках таймера в capture_time. Время предыдущего фронта лежит в last_edge_ticks (названия переменных не очень хорошие).
Если таймер переходит через максимум и сбрасывается, разность capture_time - last_edge_ticks всё равно корректна, т. к. предел счета и предел uint16_t совпадают, и работает очевидная особенность целочисленной арифметики: 1 - 65535 == 2.
Дальше в коде каллбэка работает элементарный детерминированный автомат, который разбирает последовательность интервалов.
Регулярно из главного цикла программы вызывается функция ir_task_tick(). Она проверяет таймаут передачи и обнаруживает конец посылки. Если конец обнаружен, то посылка копируется в другой буфер, и буфер приема очищается. Это нужно, чтобы пока входные данные обрабатываются, можно было уже принимать другие. Иначе есть риск, что в процессе обработки данные изменятся - это состояние "гонки данных", допускать такого нельзя.

Автор:  Alexies [ 27 дек 2016, 13:59 ]
Заголовок сообщения:  Re: Умный датчик. Smart sensor.

LTagKirov писал(а):
1. "Заряжается" таймер для счётчика измерения длительности, подробности надо уточнить, практически это самое интересное ;)
2. Функция обратного вызова срабатывает после импульса на ножке или по таймеру?, интересно на любую
ножку можно повесить такую функцию ? И на каждую ножку будет нужен свой обработчик ?
Есть ли ограничение на количество ножек, ну кроме корпуса МК?
3. Импульс разбирается на соответствие части пакета с помощью автомата.
4. По результату разбора пакета - автомат обнуляется.
5. Полученный пакет хранится в буфере и забирается по мере необходимости.


1. Запуск при правильно настроенном таймере - 1 строчка, см, предыдущий пост.

2. В режиме захвата значения по внешнему импульсу происходит следующее: когда на ножку МК приходит фронт, текущее значение счетчика таймера аппаратно записывается в специальный регистр, а уже потом вызывается прерывание. Это позволяет максимально точно определять время прихода фронта, т.к. прерывание может неопределенное время ждать окончания других прерываний, да и точно не известны все тайминги. Соответственно в коде прерывания можно никуда не торопясь считать данные из регистра захвата.
По поводу ножек: у микроконтроллера есть несколько таймеров. Некоторые из них "продвинутые", и содержат, обычно, 4 "канала". Каналы могут генерировать ШИМ или захватывать внешнее значение как я описал. Ну и ещё некоторые вещи делать. В контроллере смарт-сенсора два таймера с 4 каналами и один с 1 каналом. Каналы привязаны к ножкам. Иногда есть возможность сделать remap - сменить ножку на какую-то другую определенную. В мощных МК есть до 4 вариантов, в слабых вариантов может не быть. Наш контроллер - один из слабейших.

Если нужно просто сделать прерывание по внешнему сигналу без захвата таймера, то в STM32 можно назначить обработчик почти на любую ножку МК. Даже на все сразу. Это называется EXTI.

Например, в Caustic я не использую захват таймера, а просто по прерыванию от нужной ножки беру время из "системных часов", сделанных на двух "последовательно соединенных" таймерах, считающих микросекунды. Точности более чем достаточно, и нет ограничения на выбор ножки для ИК-приемника. К тому же "системные часы" используются во многих местах Caustic.

3. Ага.
4. Ага.
5. Ага.

Автор:  LTagKirov [ 27 дек 2016, 14:26 ]
Заголовок сообщения:  Re: Умный датчик. Smart sensor.

Alexies писал(а):
Например, в Caustic я не использую захват таймера, а просто по прерыванию от нужной ножки беру время из "системных часов", Точности более чем достаточно, и нет ограничения на выбор ножки для ИК-приемника.
Так сначала и думал про устройство, но смотрю по коду смартдатчика и вижу что хитрее заточено ;) В принципе согласен, таймеры экономить смысле нет никакого, выгоды от того что они остановлены особо нету - из МК их не выковырять ну пусть тогда работают, а 3..4 зон вполне достаточно для геймплея.

Автор:  Pingvin [ 27 дек 2016, 16:56 ]
Заголовок сообщения:  Re: Умный датчик. Smart sensor.

Ну мой вариант аппаратного захвата много проще, ИМХО

По поводу ремапов...
Сегодня целый день голову ломал - не могу вывести ШИМ сигнал на ножку PA9 (Таймер 1, второй канал).
На PB1 выводится (таймер 14, первый канал).
Вроде все аналогично делаю, что за фигня?
Алтернативные функции настраиваю.
Может ремап ещё какой нужен?
:?
Кода под рукой нет.

Автор:  onegray [ 27 дек 2016, 17:46 ]
Заголовок сообщения:  Re: Умный датчик. Smart sensor.

Наверное вы MOE для 1-го таймера забыли включить.

Автор:  Pingvin [ 27 дек 2016, 18:46 ]
Заголовок сообщения:  Re: Умный датчик. Smart sensor.

onegray писал(а):
Наверное вы MOE для 1-го таймера забыли включить.

А что это такое?

P.S.
Нашел в ref man
Код:
TIMy->BDTR |= TIM_BDTR_MOE;


А как это при помощи SPL выставить?
Буду копать, спасибо!

Автор:  Alexies [ 27 дек 2016, 22:10 ]
Заголовок сообщения:  Re: Умный датчик. Smart sensor.

Начинаю потихоньку самую сложную часть проекта: взаимодействие через однопроводной последовательный порт. Новый код пишу пока в ветку https://github.com/DAlexis/lasertag-sma ... ementation . Протокол обмена предлагаю назвать SSP - Smart Sensor Protocol, собственно. Аббревиатура, вроде, не затасканная.

Чтобы проще было тестировать связь, пока в качестве повязки будет выступать компьютер. На нем будет работать эмулятор на питоне или на C++.

Первая очевидная трудность состоит в следующем: многие, и я в том числе, выводят отладочную информацию на компьютер при помощи свободного UART-а. Трудность в том, что у выбранного чипа только один UART. А отлаживать код без возможности вставить printf() куда-то - дело неблагодарное. Другой вариант - ввод через SWD - не поддерживается на Cortex M0, судя по всему. Поэтому в протоколе будет предусмотрено "дебажное сообщение", которое никто не должен принимать. В общем дело идет, может завтра заработают некоторые команды.

Автор:  Pacifist [ 28 дек 2016, 01:00 ]
Заголовок сообщения:  Re: Умный датчик. Smart sensor.

Alexies писал(а):
НПротокол обмена предлагаю назвать SSP - Smart Sensor Protocol, собственно. Аббревиатура, вроде, не затасканная.
...

Абсолютно не затасканная, к примеру - Synchronous Serial Port

Автор:  Pingvin [ 28 дек 2016, 05:43 ]
Заголовок сообщения:  Re: Умный датчик. Smart sensor.

SSCP - Smart Sensor Communication Protocol


Предлагаю добавить широковещательную команду для синхронизации (обнуления) системных таймеров.
Иначе как пакеты потом обрабатывать, не зная точного времени получения?

Автор:  Pingvin [ 28 дек 2016, 08:44 ]
Заголовок сообщения:  Re: Умный датчик. Smart sensor.

Я сделал это! 8-)
Смарт RGB диоды покорились! ;) :)

Второй канал таймера 1, ножка PA9.
DMA прикручено.

Прием пакета и RGB индикация уже есть...

Ещё раз спасибо onegray! :geek:

Кстати - от 3,3В прекрасно работает!
Яркость опупенная - в глазах "зайчики".

API такое
Цитата:

#define NUM_LEDS 2

RGB_t leds[NUM_LEDS];

int main(void)
{

ws2812b_Init();
leds[0].r=100;
leds[0].g=0;
leds[0].b=0;

leds[1].b=100;

while(1)
{
while (!ws2812b_IsReady()); // wait
ws2812b_SendRGB(leds, NUM_LEDS);

}
}


И кстати..
PA9 - толерантна к 5В.
Так что питать можно напрямки от лития, не нагружая линейный стабилизатор.
Ща запитаю RGB от 5 Вольт.
P.S. От 5В - полёт нормальный! ;) 8-)

Страница 4 из 17 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/