Ответы пользователя по тегу Микроконтроллеры
  • Создание системы лазерного наведения?

    @Catethysis
    В России постройка управляемых модельных ракет запрещена.

    А если в порядке размышлений - то откуда вы будете посылать луч, и куда? С земли в небо - там ему отражаться не от чего. С неба на землю - ну это ещё туда забраться надо, чтобы светить. Сидеть в самолёте и подсвечивать цель? Глупо как-то, лучше самой ракетой непосредственно управлять. Я действительно не очень понимаю вашу идею.

    В принципе, телевизионные головки самонаведения придуманы уже очень давно и успешно производятся в России: https://ru.wikipedia.org/wiki/%D0%93%D0%BE%D0%BB%D...

    Что такое "ргд"-двигатель? Вы хотели сказать ЖРД или ТТРД?
    Ответ написан
  • Как подключить HDMI к stm32?

    @Catethysis
    Как подключить схемотехникчески? Проводами, я думаю.

    Вы задачу нормально опишите, что нужно получать, как обрабатывать. Думается мне, что даже если завести сигнал HDMI в STM32 - ну, сигнал разрешением 320*240 у вас может быть и получится принять, но на даже самую слабую обработку ресурсов не хватит. Налицо неверный выбор инструмента и/или задачи. По вашему вопросу непохоже что у вас получится каким-то образом решить все задачи ввода и обработки. Тем более ещё тег Ардуино, ну постеснялись бы уж, право слово :)

    Окей, я закончил плеваться ядом. Теперь по сути. Очевидно что это только ПЛИС и ничего больше.
    Во-первых, ввод сигнала. Как известно, в HDMI применяется LVDS сигнал, чтобы из него получить TTL-уровни, вам потребуется приёмник LVDS. Более того, стандарт последовательный и высокоскоростной, значит потребуется как-то распараллелить обработку. Всё это делают специальные микросхемы-десериализаторы, первое что приходит в голову - микросхема TMDS341. У максимки тоже есть несколько таких микросхем, например MAX9264. Из них выходит достаточно удобный интерфейс: от 18 до 24 бит цвета плюс несколько клоков (пиксельный клок и вертикальная/горизонтальная синхронизация). Это уже можно напрямую втыкать в ПЛИС, но кстати можно найти и ПЛИС с LVDS-входами, правда это выйдет дороже в сумме. Если нужно после обработки снова сделать HDMI - берёте похожую микросхему-сериализатор, вроде MAX9263.

    Как раз похожая задача, приём видео с HDMI и выделение в нём цветов на границах картинки для создания Ambilight: tqfp.org/Perfer/fonovaya-podsvetka-hdmi-fpga-led-c... Похоже, проект ещё не закончен, но думаю что с этого можно начать.

    Во-вторых, обработка. Честно, не знаю что сказать. Если вам нужно как-то по локти ковыряться в принятом видео, типа сжимать его или что-нибудь там распознавать - бросьте это всё, и возьмите просто компьютер с платой видеоввода. Вручную вы это всё не сделаете.
    В принципе, можно поискать компьютеры-на-плате вроде https://www.toradex.com/ru/products/colibri-arm-co... но вам потребуется как-то запихнуть в неё этот сигнал (понятно что не через GPIO, так как требуется прямой доступ к шине памяти), и написать драйвер для обработки этого дела.
    Кажется, на выставках я видел подобный комп с входом HDMI, но надо понимать что это крайне невостребованная фича, и найти такое будет огромной удачей.
    Если же вам нужно, к примеру, просто наложить на видео текст (это называется OSD, on-screen display), то в принципе всё решается прям внутри ПЛИС - вы закрашиваете в нужный момент пиксель белым цветом, и всё. Это чуть ли не единственная задача в железной обработке видео, которая решается более-менее просто.

    Готовых схем не найдёте, слишком уж специфичная задача. Инженеры, самостоятельно сделавшие такое, предпочтут продавать это решение, чем делиться им.

    Ну и всегда остаётся простой путь, сконвертировать hdmi в композит/компонент, а их уже легче ввести в любой компьютер или компьютерный модуль.
    Ответ написан
    4 комментария
  • Как реализоать экономный delay на микроконтроллере?

    @Catethysis
    Полностью согласен с @Gereykhanov, только на таймерах.
    Берём таймер TIM6 (самый простой таймер с базовыми функциями - чтобы более крутые таймеры оставить свободными), настраиваем его:

    // Включаем тактирование таймера
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); 
    
    // Настраиваем прескалер. При тактовой частоте 24МГц частота
    // таймера будет равна 24МГц/24000 = 1кГц
    TIM6->PSC = 24000;
    
    // Настраиваем период таймера = 1000 циклов - полный цикл таймера
    // будет равен 1/1кГц*1000 = 1 секунда.
    TIM6->ARR = 1000;
    
    // Разрешаем прерывание по окончанию счёта
    TIM6->DIER |= TIM_DIER_UIE;  
    
    // Включаем обработку всех прерываний от таймера TIM6
    NVIC_EnableIRQ(TIM6_DAC_IRQn);
    
    // Включаем таймер
    TIM6->CR1 |= TIM_CR1_CEN;

    после срабатывания таймера будет вызван обработчик прерывания
    void TIM6_DAC_IRQHandler(void)
    {
      if (TIM6->SR & TIM_SR_UIF) {
        // Сбрасываем флаг прерывания
        TIM6->SR &= ~TIM_SR_UIF;
    
        /* ваш код после задержки*/
      }
    }


    Это не функция delay(100), это скорее демонстрация асинхронного алгоритма - но нужно понимать, что в сложных программах, особенно связанных с передачей и приёмом данных снаружи, практически всё нужно делать на прерываниях.
    Во время работы таймера процессор полностью свободен, и может рассчитывать какую-то математику или обслуживать другие прерывания.
    Довольно часто в моих программах для STM32 void main выглядит просто как while(1) {}, а вся логика работы находится именно в прерываниях. Кстати, здесь уже рукой подать до конечных автоматов.
    Ответ написан
    Комментировать