Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.92/12: Рейтинг темы: голосов - 12, средняя оценка - 4.92
Imkymiir90
0 / 0 / 0
Регистрация: 05.01.2017
Сообщений: 3
1

ИК барьер на TSOP173x, захват сигнала.

08.01.2017, 15:51. Просмотров 2261. Ответов 4
Метки нет (Все метки)

Пытаюсь написать прошивку для ИК барьера на STM32F3. В качестве приемника использую классический TSOP1736.
С генерацией ШИМ на ИК светодиод разобрался, пачки импульсов отправляются, длительность пачки импульсов 1 мс, время между пачками 5 мс, частота импульсов 36 khz .
Для приема сигнала использую захват таймера, он тоже работает.
Остановился вот на чем...
Когда срабатывает захват автоматически вызывается функция void HAL_TIM_IC_CaptureCallback(TIM_HomdleTypeDef *htim), я ее добавил в main.
Теперь необходимо добавит к этой функции код, который будет подавать напряжение на ножку контроллера, при пересечении луча, то есть когда высокий уровень сигнала(~5 V) с TSOP длится более 10 мс. А когда сигнал снова восстановится, снять напряжение с ножки контроллера. Пока не знаю с какой стороны решить этот вопрос.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.01.2017, 15:51
Ответы с готовыми решениями:

Захват сигнала
Здравствуйте. Подскажите, есть сигнал с длительностью восходящего фронта(1) -...

Захват сигнала с осциллографа
Здравствуйте! У меня есть программа написанная в среде Matlab, которая...

Барьер зенера
Нужно к контроллеру подключать периферию, которая находится во взрывоопасной...

Семипроцентный барьер
Прошу помощи с задачей! В Государственную Думу Федерального Собрания...

Лазерный барьер
Хочу сделать лазерный барьер. Вот нашел готовый вариант:...

4
hd44780
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,605
08.01.2017, 17:16 2
Я захватываю сигнал этих датчиков любым 2-канальным таймером. 2 канала - минимум, можно 4. Одноканальный дл этого непригоден. Таймер в режиме захвата PWM сигнала.
См. http://we.iosyitistromyss.ru/STM32/ir-u ... ast-1.html Там есть готовый код для линейки F105/F107, однако я успешно применяю его на F4.

Куб и его HAL не использую, с этим сами разбирайтесь :) .
0
Imkymiir90
0 / 0 / 0
Регистрация: 05.01.2017
Сообщений: 3
09.01.2017, 10:13 3
Цитата Сообщение от hd44780
Я захватываю сигнал этих датчиков любым 2-канальным таймером. 2 канала - минимум, можно 4. Одноканальный дл этого непригоден. Таймер в режиме захвата PWM сигнала.
См. http://we.iosyitistromyss.ru/STM32/ir-u ... ast-1.html Там есть готовый код для линейки F105/F107, однако я успешно применяю его на F4.

Куб и его HAL не использую, с этим сами разбирайтесь :) .
Статья хорошая, практически готовое решение, читал ее до этого. Но для быстрого старта, начал работу с CubeMX, поэтому с рукописями пока сложновато :) Поэтому пока буду пробовать в кубе, реализовать данный код.
0
Imkymiir90
0 / 0 / 0
Регистрация: 05.01.2017
Сообщений: 3
09.01.2017, 17:26 4
Может упростить код и сделать так. Исходя из того, что в данном случае период сигнал является всегда неизменным (6 мс), его ненужно декодировать, а просто давать сигнал когда время прошедшее после последнего прерывания превышает например 10 мс. Как реализовать это в коде?
0
sid_otix
0 / 0 / 0
Регистрация: 11.10.2013
Сообщений: 326
10.01.2017, 17:18 5
Цитата Сообщение от Imkymiir90
Может упростить код и сделать так. Исходя из того, что в данном случае период сигнал является всегда неизменным (6 мс), его ненужно декодировать, а просто давать сигнал когда время прошедшее после последнего прерывания превышает например 10 мс. Как реализовать это в коде?
Вы же сами по сути ответили на свой вопрос :)
Мутите обычный таймер со срабатыванием 1мс, в обработчике прерывания пишите как то так:
Код
{
check_flag=1;
}
В теле основного цикла ставите условие

Код
If (check_flag)
{
if (GPIOA->IDR & GPIO_IDR_xx)  //это опрос вывода "xx" для Порта "А"
{ i++;// инкрементируем счетчик ну и можно еще чего нибудь воткнуть если надо
}
else
{ i=0; flag=0;} //если у вас с выхода ИК пришет 0 - значит надо сделать сброс переменных

check_flag=0;
if (i>=10)
{flag=1; i=10;}   // Переменная Flag - равна 1 если более 10 мс уровень был "1"
}
Скорее всего можно сделать еще проще....
0
10.01.2017, 17:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.01.2017, 17:18

Соленоид и выходной барьер
Соленоид :ASCO series 327 ,барьер выходной дискретный :KFD2-SL2-Ex2 ...

ИК барьер, принцип работы
Разбираюсь в принципе работы данного устройства... возникли вопросы, помогите...

Потенциальный барьер конечной высоты
Добрый день! Скажите пожалуйста,а почему у меня не определяет переменную i, и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru