TBD
TBD
Всем привет! Пытаюсь в робототехнику, пока не очень успешно) Прошу совета, как дебажить то, что не работает.
Моя цель - отправить с компа на stm32 команду через провода по CAN шине.
Что у меня есть:
1) Модуль CANable USBпреобразователь CANdleLight TJA1051T/3 - втыкаю в комп
2) WCMCU-230 модуль CAN шины на базе SN65HVD230 - подключаю туда CanH и CanL
3) STM32 bluepill STM32F103C8Tx - надеюсь тут поймать пакет и обработать.
Код писал с помощью ChatGpt, и в итоге уперся в то, что на уровне кода по ощущениям все норм, а вот на железячном не норм. И я не понимаю как понять, где же норм, а где не норм, т.е. как это все дебажить, с какой стороны подступиться.
Ниже поподробней напишу про настройки и код
С компа код на C# через библиотеку LibUsbDotNet
Устройство определяется, устройство открывается, принимает настроечные пакеты.
В режиме LoopBack загораются три лампочки, и синяя моргает, когда жму кнопку "отправить пакет"
Когда включаю Normal Mode - горит только красная лампочка.
И вот уже здесь я не понимаю - либо я неправильно что-то проинициализировал, либо так и должно быть, либо имеет значение вся сеть устройств на CAN шине, включая терминирующие резисторы. Но выглядит подозрительно. Документация на адаптер? Не нашел(
Отправляю такое: ID: 0x123 DLC:4 Data: 11-22-33-44Echo: FFFFFFFF
В ответ спустя секунду приходит такое: ID: 0x20000127 DLC:4 Data: 11-22-33-44Echo: FFFFFFFF
Говорят, что это ошибка на отсутствие ответа из сети на отправленный пакет. Но как понять - пытался он его отправить, или даже и не пробовал?
Вот еще фоточки соединений:


Кто захочет посмотреть код, вот тут он:
https://github.com/VogdVogd/CanTest/tree/main/Assets/Scripts
Точка входа - LibUsbDotNetTest.cs
По таймингам целился в 500000
И немного про STM32:
Вот, пока так. Скажите, если нужна еще доп инфа!
UPD: нашел косяк кода при инициализации Can Usb. Теперь он горит лампочками.
В STM32 прописал отправку пакета, отправляется что-то, через HAL_CAN_GetError ошибок нет.
Can Usb что-то ловит, но не то что нужно. В момент отправки из STM32 приходит два пакета по 20 байт
RAW (20): FF-FF-FF-FF-0C-00-00-20-08-00-00-00-00-30-04-00-00-00-00-00
RAW (20): FF-FF-FF-FF-0C-00-00-20-08-00-00-00-00-30-02-00-00-00-00-00
Выглядят как коды ошибок, как будто физически пакеты неправильно собрались из шины.
Видимо, какой-то разсинхрон таймингов или чего-то еще, придется осциллограф добывать и смотреть какое устройство на каких таймингах работает... Ух как это все сложно!
Тестовый стенд для сканирования жидкости по частотам, провел измерения от 10 кГц до 240 кГц с шагом 10 кГц, искал Дебаевскую релаксацию на высоких, не нашёл еще xD.
Делюсь первыми результатами замеров дистиллята:
По первому результату на 10 кГц значения АЦП=44653, 20 кГц=33495, 30 кГц=41507, 40 кГц=41507 есть некие верблюжьи горбы, начиная с 50 кГц до 170 кГц сигнал очень хороший. С 230 кГц до 240 кГц наблюдается падение, надо бы расширить диапазон до 500 кГц, позже...и это дистиллированная вода.
По результатам простой проточной воды тоже картинка интересная, явно существенный спад сигналов, а на частотах 230 кГц до 240 кГц нету резкого падения, надо расширять диапазон однозначно, рабочие частоты с 50 по 120 кГц, отличные показания на первый раз.
И это все будет передаваться на MQTT через WiFi канал с помощью ESP32 на микропитончике))), в общем такие первые потуги.
Важное замечание, занимаюсь этим в свободное от основной деятельности время :)
Изучаю электронику и микроконтроллеры ~2 месяца, с веб бекендом знаком относительно давно.
Для ЛЛ: штука с которой можно отправлять сообщения на удаленный сервер (сайт), по командам что-то включать/выключать, стать успешным стримером на собственной стриминговой площадке! (точнее сказать... html страничка отображающая графику из склеенных пикселей на удаленном сервере на который они приходят от STM32).
Видео-версия поста:
https://rutube.ru/video/a8dc0cf622f6ba1cd9ab055a7aba4fc0/
+ Тоже самое видео только ютуб:
https://www.youtube.com/watch?v=PIxWcxboZJY
Попытка оформить пост в текстовом формате:
Убедительная просьба посмотреть видео, так как писать я не умею, а нейрослоп за свой текст выдавать не хочу, да и в конкретном случае видео нагляднее.
Все начиналось с чтения «Чарльз Платт — Электроника для начинающих», попутно заказывая всякие непонятные штуки с Алиэкспресс, которые требуются в книге (а которые не требуются, летели в корзину заказов по принципу «дешево и прикольно выглядит», почти всё ценой до 200 р).
Прочитав примерно половину книги, детали, которые требуются дальше, еще не успели приехать.
Но успели приехать: паяльный набор дурака новичка(привет синий паяльник), какой-то набор начинающего ардуинщика (как оказалось, огрызок) и куча всяких плат/флюсов и мешок электронных компонентов (начиная от таймеров, заканчивая самими нераспаянными микроконтроллерами и подложками для них).
Вот и решил, что помигаю светодиодом через плату, это же ненадолго... Ага.
После мигания захотелось уже пощелкать реле через кнопку, потом попробовать вывести текст на дисплейчик двустрочный LCD1602, потом сделать импровизированный калькулятор и т. д. В конце концов я кое-как подключил уже другой экранчик 128*160 по SPI (спасибо логическому анализатору за 300 рублей) и вывел первую картинку Windows XP.
И тут меня посетила мысль... У меня же есть джойстик! Что если поверх картинки будет другая двигаться, которой я буду управлять джойстиком?!
Так я изобрел велосипед.
За этой идеей, помимо страшнючего для новичка интерфейса 3-х всадников апокалипсиса от компании ST (Cube IDE, Cube MX, Cube Programmer), меня ожидало еще и знакомство с FreeRTOS (а там и LVGL), так как на тот момент уже понимал, что дело пахнет писюнами и всё крутить в цикле на флагах не прокатит вдолгую. Хотя как я понял freeRTOS тоже цикл, но на стероидах.
Так началось приключение длиною почти в месяц... Сопли, слезы, DMA. Короче, заработала шайтан-машина.
Что можно: менять цвет фона экрана, управлять яркостью ползунком (ШИМ), включать музыку, отправлять сообщения на удаленный сервер (или на локальный ПК, если указать порт), отправлять команды на запуск задач с удаленного сервера (или с локального ПК, предварительно установив импровизированное рукопожатие).Ну и конечно же, запустить стрим :)
На чем работает железо: LVGL графика, freeRTOS ОС (шутка про GNU), язык C (и храни господь HAL).
Сервер: Nginx, Docker, FastAPI (Django админка будет, наверное)
Что дальше? Скорее всего попытаюсь сделать что-то многофункциональное(возможно, даже полезное) и запихнуть это в плату за 100-200р ради спортивного интереса. Как дополнительный квест - утилизировать 100% времени микроконтроллера.
А вообще хочу попробовать спроектировать свою кривую-косую плату(это же вроде ПЛИС? не?), где все будет на одном месте, а не то что stm32 -> esp8266, хотя я думал при покупке что это просто какой-то голый wifi модуль.
Про железку:
купил я вот такую штуку - STM32H723ZGT6 (https://www.ozon.ru/product/1-sht-modul-otladochnoy-platy-s-...). Здоровая, сука!
И программатор к ней - клон ST-link V2 (https://www.ozon.ru/product/programmator-st-link-stlink-st-l...).
Через CUbeIDE прошить не могу - он наотрез отказывается скачивать что-то с интернета. В PlatformIO такой камень отсутствует, но есть Nucleo H723. Попробовал его с ST-link - не идет - ошибка. Вшитая с завода "мигалка светодиодом" успешно слетела, новая не встает, камень в защите. Выходит из защиты только если сделать st-info --probe с зажатым RESET, а потом отпустить и еще раз. Попытка стирания флеша проваливается. Или стирается, но новую прошивку не принимает.
Прошил rpi-pico на picoprobe, подключил через SWD, шил через openocd. Перешил на micropython, шил скриптом через uart. Никак.
Info : Listening on port 3333 for gdb connections [stm32h7x.cpu0]
halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0xfffffffe msp: 0xfffffffc
Info : Device: STM32H72x/73x Info : flash size probed value 1024k Info : STM32H7 flash has a single bank Info : Bank (0) size is 1024 kb, base address is 0x08000000
Info : Bank (0) size is 1024 kb, base address is 0x08000000 Error: [stm32h7x.cpu0] clearing lockup after double fault [stm32h7x.cpu0] halted due to debug-request, current mode: Handler HardFault xPSR: 0x01000003 pc: 0xfffffffe msp: 0xffffffd8
В общем вот так. Основная проблема - не получается зашить в этот камень хоть что-то.
Чего делать то, выкинуть нахер?
Кто-нибудь уже успешно шил такую фигню?
Вот такой заголовок придумал) Нужен ваш совет коллеги , надумал я пойти ,точнее попробовать, трудоустроиться в разработку embedded . За плечами опыт работы инженером , ведущим инженером электроником в направлении ремонта ИБП , схемотехнику знаю , с приборами работать умею. И вот сидя дома томным вечером я понял , что хочу сменить работу. ))
Из нужного знаю Си , ну как знаю , синтаксис , работу с памятью разобрал, указатели, битовые операции , немного поморгал светодиодом на отладке . А вопрос в следующем : какой необходим набор минимальных знаний и умений чтобы пройти на позицию джуна . Если кому не лениво напишите пожалуйста .Спасибо за внимание .)
Недавно в моих руках оказался уникальный кнопочный телефон - Маском Н2. Сначала я подумал что это просто китайский NoName-телефон по типу DEXP'а, или Fly'я, однако сняв заднюю крышку - я обомлел... И в том числе из-за использования корпуса от неприметной раскладушки - Samsung GT-C3520. Интересно узнать, что он скрывает у себя внутри?
Что за девайс?
На первый взгляд кажется что телефоны на фото - близнецы и ничем друг от друга не отличаются. Однако левое устройство выдаёт отсутствие логотипа Samsung, а также камеры, которая была заменена на логотип компании-производителя: некой Маском. После краткого гугления, оказалось что эта компания занимается исключительно госпроектами: разработка аудиосистемы в Кремле, создание супервычислительного научного комплекса и создание мобильных спец. лабораторий. В общем, компания серьезная...
Казалось бы, на первый взгляд это просто китайский бюджетный NoName-телефон с переклеенным шильдиком и кастомным логотипом, где из чипов только система на кристалле от MediaTek/Spreadtrum, микросхема флэш-памяти и усилитель мощности. Однако здесь внимание сразу привлекает использование внешнего радиомодуля Telit, который сам по себе стоит около двух-трех тысяч рублей. Не слишком похоже на обычный кнопочник...
Так уж получилось, что аппарат достался мне из утиля вместе с коробочкой. Несколько лет назад его списали по причине повреждения сим-лотка, выкинули на свалку, а оттуда он попал ко мне - в гиковские ручки, которые любят всё необычное :)
Комплект поставки максимально простой: сам телефон, зарядное устройство и небольшой мануал. Если честно, упаковка немного напоминает советскую - и этому есть своя причина.
Дело в том, что данный телефон стоил целых 34 тысячи рублей и предназначался специально для государственных служб. В мануале указано что устройство является защищенным и физически отключает микрофон при закрытии флипа, благодаря чему его можно использовать на закрытых собраниях. Если честно, я так и не понял почему телефон нельзя использовать для обработки чувствительной информации, но можно ходить с ним на собрания. Если кто-то шарит - расскажите пожалуйста в комментариях :)
Что внутри?
Увидев модем от Telit, я просто не смог удержаться и не разобрать Н2, дабы узнать что-же он там скрывает внутри. Серийный телефон на нестандартной платформе, да ещё и разработанный в РФ... У меня аж мурашки по коже были от потенциальной крутости такого устройства :)
Схемотехника и инженерные решения оказались очень необычными по меркам телефона. Например за питание в обычных кнопочных отвечает отдельный чип - так называемый контроллер питания, который совмещает в себе чарджер, DC-DC преобразователи, набор LDO, а также Watchdog. В Маском Н2 же используются отдельные чипы, выполняющие схожую функцию: например за зарядку отвечает модуль TP4056 разработки TPower, за питание микроконтроллера (процессора) - обычный 3.3v/300mA ULDO-регулятор по типу AMS1117, а в качестве драйвера, формирующего питание подсветки дисплея - Texas Instruments LM2733YMF. В качестве того самого механизма защиты с отключением микрофона используется аппаратный SPDT-свитч Analog Devices ADG884, Input-сигнал для которого идёт с датчика Холла флипа устройства. Решение весьма изящное :)
Радиомодуль Telit GE866-QUAD достоин отдельного разговора. Это по сути почти готовый внешний телефон, который общается с микроконтроллером или AP-процессором посредством шины UART. Общение происходит обычными AT-командами, как и в случае с радиомодулем вашего смартфона. Внутри него скрывается:
Неизвестный Baseband-процессор, состоящий из обычного ARM (?) ядра и DSP-сопроцессора для работы с GSM-модулем. Именно он выполняет основные функции телефона: звонки, СМС, работа с SIM-картой, хранение телефонной книги и даже выход в интернет. В обычных кнопочных телефонах, Baseband сразу же выполняет функции центрального процессора и отвечает за пользовательский интерфейс, Java и другие функции.
Baseband возможно собственной разработки Telit, а возможно и что-то от MediaTek/Qualcomm - как в случае с SIMCOM SIM800 (по крайней мере, Telit использует Qualcomm'овские MSM'ки в своих LTE-модемах).
RF-фронтэнд (может быть как частью бейсбенда, так и отдельным чипом). Он отвечает за всю "магию" под капотом аналоговой части и перегоняет исходящие цифровые GSM-пакеты от DSP в аналоговый сигнал на усилитель, а входящие из эфира - в цифровой. Если я не ошибаюсь, именно фронтэнд считает число палочек качества связи :)
Усилитель мощности. Тут думаю всё очевидно.
Возможно микросхема флэш-памяти с прошивкой модема, однако флэшка может быть и частью Baseband'а.
Интересно и то, что Telit сама когда-то делала ODM-телефоны для других брендов. У нас некоторые из них продавались под брендом RoverPC (RoverPC M1 - Telit SP600) и i-Mate (JAMA). Наверняка есть ещё какие-то интересные модели :)
Самое интересное у Н2 скрывается под металлическим экраном... и это микроконтроллер STM32F427 производства компании STMicroelectronics, который используется в качестве центрального процессора. Это очень "жирный" и крутой микроконтроллер, который состоит из:
Одного ARM-ядра Cortex-M4F, которое способно работать на частоте до 180МГц. Это в три раза больше, чем у ARM7TDMI в Motorola E398, в полтора раза больше, чем ARM926EJ-S в Siemens S65 и примерно на уровне Nokia времен C2 и X3. Однако M4F - куда более современное ядро и выдаёт 225 DMIPS в бенчмарке Dhrystone, что ставит его примерно на уровне Pentium MMX 200 (Dhrystone 2 с оптимизациями) и Pentium III 450 (без оптимизаций). Кроме того, у M4F есть FPU - заметно помогает с отрисовкой графики.
2 мегабайта встроенной Flash-памяти и 256 килобайт оперативной SRAM-памяти. Для сравнения, в Siemens C65 32 мегабайта NOR-памяти и 4 мегабайта SDRAM (но в Н2 основная память в модеме).
Большого числа периферийных ядер: FSMC для подключения внешней памяти, контроллер 8080-дисплеев, три 12-битных ADC, два 12-битных DAC'а, 4 UART'а, 3 I2C... прямо таки мечта эмдбеддщика :)
Основная изюминка здесь в том, что обычно в кнопочных телефонах не используют микроконтроллеры общего назначения. В них используются однокристальные ASIC'и, которые были разработаны специально для использования в мобильных гаджетах в целях максимального удешевления производства. Здесь же используется дорогущая STM'ка, которая сама по себе стоит не меньше 400-500 рублей (MediaTek MT6261DA стоит около 300 рублей при мелком опте, а это уже почти готовый телефон), что и намекает на мелкосерийную и российскую натуру разработки устройства.
С обратной стороны платы расположился копирайт (в ODM-устройствах информация о производителе обычно не указывается, ограничиваясь маркировкой модели). Мой экземпляр произведен в 2019 году.
В целом, конструктивно телефон прост и надежен как автомат АК-47. Он собран из обычных компонентов, которые можно найти в любом более-менее крупном радиомагазине, все чипы используют выводные корпуса, а не BGA, что делает телефон устойчивее к падениям, а вся схемотехника устройства считывается глазами инженера за пару минут. Единственное действительно слабое место устройства - модуль зарядки TP4056. Дело в том, что у этого чипа очень много подделок и контрафактные экземпляры банально не держат ток зарядки в 500мА и выше, сильно нагреваясь и перегорая. Но учитывая емкость родного Samsung-овского аккумулятора в 800мА, вряд-ли чарджер здесь подвержен серьезным нагрузкам...
Даже я будучи не инженером нарисовал принципиальную схему у себя в голове уже через 5 минут после изучения устройства. Простота - во благо :)
Включаем
После включения нас встречает логотип Маском и рабочий стол, который всеми силами пытается пародировать интерфейс Nokia. Немудрено, аппарат ведь специально разработан чтобы быть внешне знакомым и при этом не выделятся среди других телефонов.
Поскольку в качестве основного процессора здесь используется микроконтроллер общего назначения, прошивку инженерам пришлось написать с нуля. Вся UI-часть телефона, плюс управление модемом разработано в РФ, что иронично - ведь когда-то у нас частично разрабатывали Motorola E398, CDMA-телефоны LG и по слухам некоторые телефоны Samsung.
Основное меню устройства состоит всего из четырех пунктов: настройки, журнал звонков, контакты и СМС. Функционал беднее чем в Nokia 3310, но учитывая назначение Н2 этому особо не удивляешься. Нет даже змейки, хотя процессор устройства способен потянуть Doom и даже Quake!
Встроенные программы реализованы на самом базовом уровне. В контактах есть возможность назначить только номер и имя, никаких подгрупп или фотографий при вызове.
У Н2 также есть некая программа для синхронизации с ПК, которую мне найти не удалось. В пункте Настройки можно найти специальный пункт для этого, а софт показывает число переданных данных (байтов? Пакетов? Контактов?)
Интересен и тот факт, что данные хранятся только на SIM. Это чётко можно заметить по окну "пожалуйста, подождите" при запуске меню сообщений, поскольку в это время телефон запрашивает данные из модема.
В целом, по программной части телефон очень простой и в нем реализован лишь базовый функционал. Однако это не делает его плохим или бесперспективным: я думаю что если бы Н2 был более массовым (пусть даже при цене в 6-7к рублей), то его давным давно бы уже замоддили, запилили кастомные прошивки и возможно даже написали свою с нуля. Но увы, к сожалению этих телефонов очень мало, на авито их не найти и телефон, который может по праву называться российским, так и канул в лету. Может хоть я оставлю небольшой след на скрижалях истории? :)
Заключение
Вообще, я уже писал статью об этом телефоне год назад. Однако та версия не была богата на детали, плюс, по моему мнению, требовала некоторого ремастера и с ней могли ознакомиться не все заинтересованные Пикабушники. Так что в рамках статьи-шортса, думаю, самое то :)
А если вам интересна тематика ремонта, моддинга и программирования для гаджетов прошлых лет — подписывайтесь на мой Telegram-канал «Клуб фанатов балдежа», куда я выкладываю бэкстейджи статей, ссылки на новые статьи и видео, а также иногда выкладываю полезные посты и щитпостю. А ролики (не всегда дублирующие статьи) можно найти на моём YouTube канале.
Если вам понравилась статья и вы хотите меня поддержать, у меня есть Boosty, а также виджет на Пикабу ниже. А ещё мне можно отправить какое-нибудь интересное железо: устройства на WinCE/WinMobile, смартфоны на Symbian, китайские кнопочники, китайские подделки на iPhone/Samsung из начала 2010-х, ретро-ПК железо - всё это я очень люблю, коллекционирую и пишу о них интересные статьи - как, например, эта :) Всем огромное спасибо!
Всем привет!
В данной статье я хочу Вам рассказать про датчик HEDR(от компании avago technologies) - это двухканальный инкрементальный оптический датчик, предназначен для измерения пройденного пути, линейной скорости, угловой скорости и направлении вращения вала.
С помощью данного датчика будет реализован энкодер на базе микроконтроллера STM32, который будет производить вычисление пройденного пути.
В данной статье будет рассмотрено:
Принцип работы датчика HEDR-5420-ES214;
Схема подключения к микроконтроллеру STM32;
Программная реализация (расчет пройденного пути и вывод информации на дисплей).
Технические характеристики датчика HEDR-5420-ES214
Напряжение питания [ 4.5 - 5.5В ];
Тип выхода [ квадратурный ];
Диаметр вала [ 5 мм ];
Разрешение [ 200 отсчетов на оборот ];
Рабочая температура [ от -10°C до +85°C ].
Принцип работы датчика HEDR-5420-ES214
Устройство состоит из трех основных компонентов:
Источник света (светодиод, формирующий поток света);
Оптическая система (линза, обеспечивает фокусировку и отражение света);
Фотодетектор.
Линза фокусирует излучаемый свет на кодовое колесо (диск с чередующимися отражающими и неотражающими участками), при вращении диска, отраженный свет проходит обратно через оптическую систему и попадает на фотодиоды, таким образом на их поверхности формируется чередующийся рисунок света и тени, соответствующий узору кодового диска.
Эти изменения интенсивности света преобразуются в внутренние сигналы А и В, которые проходят через компараторы в составе обработки сигналов, на выходе формируются два цифровых прямоугольных сигнала - канал А и В, находящиеся в квадратурной фазе на 90°, что позволяет микроконтроллеру определять направление вращения вала, к примеру:
если канал А опережает канал B - вращение происходит в одну сторону;
если канал B опережает канал А - вращение происходит в противоположную сторону.
Для своей задачи применяется следующая последовательность, если канал А опережает канал B - движение энкодера считается положительным, если на оборот, то движение будет отрицательным.
Схема подключения к микроконтроллеру STM32
В данной схеме используются преобразователь напряжения DA1 (+12V +5V) и стабилизатор напряжения DA2, дисплей подключается к выводам МК 21_SCL_I2C2 и 22_SDA_I2C2, датчик HEDR подключается к выводам МК 29_CH.A и 30_CH.B, данные сигналы сначала проходят через делители, R17-R18-[CH.A] и R15-R16-[CH.B], так как датчик работает от +5V, сигналы соответственно тоже у него +5V, я всегда стараюсь дополнительно защитить МК, после делителя амплитуда сигналов снизится до +3.3V, копипастить информацию по описанию узлов преобразователя, стабилизатора, узла обвязки напряжения питания и резонатора для МК не особо хочется, поэтому кому интересно можно почитать статью [Модуль обработки и коммутации данных, с внешними управляющими устройствами по RS-485 на STM32]
Настройка микроконтроллера STM32F030CCTx в CubeIDE
Настройка RCC и SYS (в RCC выбираю Crystal/Ceramic Resonator, так как у меня внешний кварц на 8 МГц)
Настройка дисплея
Взаимодействие дисплея с МК будет через I2C2
Настройка выводов узла подключения датчика HEDR
TIM1_CH1 (к данному выводу будет подключаться сигнал CH.A);
TIM1_CH2 (к данному выводу будет подключаться сигнал CH.B).
Таймер используется в режиме Encoder mode - это специальный аппаратный режим, который позволяет микроконтроллеру автоматически подсчитывать импульсы от инкрементального датчика и определять направление вращения, данная конфигурация освобождает МК от необходимости программно обрабатывать прерывания по каждому импульсу.
Encoder Mode TI1 and TI2 данный параметр указывает, что используется оба канала датчика (A и B), это дает разрешение X4 - т.е. счетчик будет увеличиваться на 4 шага за один полный оборот.
Описание режимов
TI1 - подсчет ведется по фронту одного канала А, направление определяется по уровню В, разрешение 1.8 градусов;
TI2 - аналогично логике TI1, но базируется на канале В;
TI1 and TI2 - подсчет ведется на каждом фронте обоих каналов (А+, А-, В+, В-), направление определяется автоматически, т.е. количеством импульсов на оборот 200, я получаю 800 шагов на оборот, разрешение будет 0.45 градусов.
Input Filter - включает цифровую фильтрацию входного сигнала, помогает убрать дребезг и шум, значения от 0 до 15, чем выше значение, тем надежнее фильтрация, но будет повышаться задержка.
Polarity (Rising Edge) - счетчик реагирует на восходящие фронты сигнала.
Настройка Clock
Программная реализация ведомого устройства
Ссылка на скачивание исходного кода [ https://t.me/ChipCraft В закрепленном сообщении [ #исскуствомк_исходный_код — Исходный код для Encoder_HEDR_5420_STM32F030CCTx].
Модуль process_Encoder
Данный модуль реализует считывание сигналов с инкрементального датчика HEDR и вычисляет:
Количество импульсов на оборот;
Пройденную дистанцию;
Отображение данных на дисплее.
#define ENCODER_MODE_X4 4
Данный параметр отражает режим подсчета импульсов, привожу формулу
Этот режим обеспечивает максимальную точность - 0.45 на один шаг.
#define WHEEL_DIAMETR_M 0.230f // 230 мм
#define WHEEL_RADIUS_M (WHEEL_DIAMETR_M / 2.0f)
Здесь я задаю геометрические размеры колеса, на валу которого установлен датчик%
Диаметр колеса 230 мм (0.230м);
Радиус вычисляется так:
#define STEPS_PER_REV (ENCODER_PPR * ENCODER_MODE_X4)
Максимальное количество шагов за один оборот
#define CIRCUMFERENCE_M (2.0f *M_PI * WHEEL_RADIUS_M)
Длина окружности колеса - это путь, который проходит колесо за один оборот
т.е. при моем радиусе 0.115, получится за один полный оборот 0.72 м.
Функция display_init() - инициализация дисплея
Инициализируется драйвер дисплея;
Выполняется заливка экрана черным цветом;
На дисплее на 2 секунды отображается стартовый экран с надписью ''ChipCraft";
После задержки экран очищается для дальнейшей работы.
библиотеку для работы с дисплеем я взял с [https://github.com/afiskon/stm32-ssd1306/tree/master]
Функция display_update()
Отвечает за визуализацию информации на дисплее:
Экран предварительно очищается с помощью ssd1306_Fill(Black);
В верхней части по центру отображается надпись «Encoder»;
Ниже последовательно выводятся:
количество импульсов;
дистанция;
Буфер графики передается на дисплей вызовом ssd1306_UpdateScreen()
Функция encoder_Handler()
Логика работы:
считывание текущего значения таймера;
определение разницы (delta) между текущим и предыдущим значениями;
накопление общего счетчика enocoder_position;
вызов функций для вычисления дистанции и обновление дисплея.
Функция get_distance_m() - вычисление пройденной дистанции
Переводит количество импульсов датчика в физическую длину пути в (метрах).
process_Encoder.c
#include "./Project/process_Encoder.h"
#include "./Project/shared.h"
#include "./Project/ssd1306.h"
#include "./Project/ssd1306_fonts.h"
#include "main.h"
#include <stdlib.h>//abs
#include <string.h>//memset
#include <stdio.h>
#include <stdint.h>
#include <math.h>
#define ENCODER_PPR 200 // импульсов на оборот
#define ENCODER_MODE_X4 4
#define WHEEL_DIAMETR_M 0.230f // 230 мм
#define WHEEL_RADIUS_M (WHEEL_DIAMETR_M / 2.0f)
#define STEPS_PER_REV (ENCODER_PPR * ENCODER_MODE_X4)
#define CIRCUMFERENCE_M (2.0f *M_PI * WHEEL_RADIUS_M)
uint16_t current_count= 0;
int16_t delta = 0;
float distance = 0.0f;
int32_t encoder_position = 0;
uint8_t ssd1306_buffer[SSD1306_BUFFER_SIZE];
void display_init(void) {
ssd1306_Init();
ssd1306_Fill(Black);
ssd1306_SetCursor(20, 25);
ssd1306_WriteString("ChipCraft", Font_11x18, White);
ssd1306_UpdateScreen();
HAL_Delay(2000);
ssd1306_Fill(Black);
ssd1306_UpdateScreen();
}
void encoder_Handler(void) {
static uint16_t last_count = 0;
current_count = __HAL_TIM_GET_COUNTER(&htim1);
delta = (int16_t)(current_count - last_count);
encoder_position += delta;
last_count = current_count;
get_distance_m();
display_update(encoder_position, distance);
}
void display_update(int32_t pulses, float distance) {
char buf[32];
ssd1306_Fill(Black);
ssd1306_SetCursor(25, 2);
ssd1306_WriteString("Encoder" ,Font_11x18, White);
sprintf(buf, "Pulses: %ld", pulses);
ssd1306_SetCursor(2, 22);
ssd1306_WriteString(buf, Font_7x10, White);
sprintf(buf, "Dist: %.2f m", distance);
ssd1306_SetCursor(2, 36);
ssd1306_WriteString(buf, Font_7x10, White);
ssd1306_UpdateScreen();
}
float get_distance_m(void){
distance = ((float) encoder_position / STEPS_PER_REV) * CIRCUMFERENCE_M;
return distance;
}
Модуль proj_main() - главный метод
Выполняется инициализация дисплея;
Запуск таймера;
Запуск функции encoder_Handler().
proj_main.c
#include "./Project/shared.h"
#include "./Project/proj_main.h"
#include "./Project/process_Encoder.h"
#include "./Project/process_Encoder.h"
void proj_main()
{
volatile const char *ch = ";V-F-BIN;ver: "VER_PROG(VER_a,VER_b,VER_c);(void)ch;//0x8008b00
display_init();
HAL_TIM_Encoder_Start(&htim1, TIM_CHANNEL_ALL);
while (1){
//хэндлеры
encoder_Handler();
}//while (1)
}
Если статья показалась Вам интересной, буду рад выпустить для Вас еще множество статей исследований по всевозможным видам устройств, так что, если не хотите их пропустить — буду благодарен за подписку на мой ТГ-канал.