Мульти Серво-тестер на STM32F103
- Войдите на сайт для отправки комментариев
Задумал я мульти серво-тестер и так получается, что все задумки технически укладываются в возможности этого процессора. На первом этапе удалось общими усилиями подготовить среду для этого девайса и скомпилировать достаточно интересный проект генератора от Dimax, который сообщил, что мои хотелки связанные с точным измерением длины импульса (До долей микросекунд) легко реализуются с помощью таймера этого девайса и он где то уже код этот выкладывал. Увы не нашел.
Для того чтобы начать требуется функции:
1-я функция - измерение длительности сигнала шим в частотном диапазоне от 50 до 300 гц и трансляция на выводной пин с возможность изменения частоты в стандартные 20, 8 и 4 миллисекунды (50 -250гц).
2-я функция - выдача стандартных значений шим с длительностью импульса 1000 -1500 -2000 мксек (также в диапазоне частот 50-250герц) синхронно на восемь выходов.
3-я функция - выдача регулируемого значения шим от 400 до 3000 мксек (также в диапазоне частот 50-250герц)
Прошу помочь с реализацией функции измерения длительности сигнала шим и его частоты.
Значит ли это (stm), что переносить на второй таймер avr уже неактуально?
Значит ли это (stm), что переносить на второй таймер avr уже неактуально?
Очень даже актуально!!!
STM это далёкое будущее с высокой степенью неопределенности, а AVR это настоящее и уже работающее...
PS буду строить квадрокоптер 8 двигателей по соосной схеме... еще даже раму не делал, закупаюсь комплектующими (STM - потребуется 8 каналов шим)
PPS ARHAT сейчас скажет, бери мегу )))
Не факт вовсе. Мега прямое управление BLDC больше чем 1 мотором не тянет, ибо там компаратор в количестве адын штук. Тоже искал решение .. увы "фигвам". Можно сваять только "полетный контроллер", который будет управлять готовыми драйверами моторов .. ну так это задача куда проще и на мегах уже решена.
Чтобы нормально управлять моторами напрямую надо к каждому из них иметь свой компаратор. Можно конечно прилепить внешние, но .. нафига, если есть готовые контроллеры моторов по смешным ценам? :)
Не факт вовсе. Мега прямое управление BLDC больше чем 1 мотором не тянет, ибо там компаратор в количестве адын штук. Тоже искал решение .. увы "фигвам". Можно сваять только "полетный контроллер", который будет управлять готовыми драйверами моторов .. ну так это задача куда проще и на мегах уже решена.
Чтобы нормально управлять моторами напрямую надо к каждому из них иметь свой компаратор. Можно конечно прилепить внешние, но .. нафига, если есть готовые контроллеры моторов по смешным ценам? :)
я напрямую и не собирался связка ESC-мотор остается, мне надо чтобы эта связка во всем диапазоне 1000-2000 выдавала на всех моторах одинаковые обороты
?!? Моторы разные, пропеллеры - отличаются, драйвера хоть на чуточку, но тоже разные, да даже напряжения питания будут слегка отличаться! Одинаковое управление моторами - далеко не лучшая идея. А Вы знакомились с кодом полетных контроллеров? Там ведь это совсем не так должно быть (не смотрел, но осуждаю) :)
?!? Моторы разные, пропеллеры - отличаются, драйвера хоть на чуточку, но тоже разные, да даже напряжения питания будут слегка отличаться! Одинаковое управление моторами - далеко не лучшая идея. А Вы знакомились с кодом полетных контроллеров? Там ведь это совсем не так должно быть (не смотрел, но осуждаю) :)
НЕТ! Так как это выше моих возможностей ))) Я просо подберу попарно с наиболее близкими значениями из недорогих, брать хорошие моторы и регуляторы это выше моих возможностей, а надёжности хоцца
Да приятель собрал, дорогие двигатели, дорогие регуляторы, мозги дорогие, а регуль дым пустил )))
Дорого тоже оказывается не значит, что какчественно, не советская военка чай
ua6em, не, калибровать моторы нужно обязательно. Никак без этого. Но это ж, вроде, несложно.
Да приятель собрал, дорогие двигатели, дорогие регуляторы, мозги дорогие, а регуль дым пустил )))
Дорого тоже оказывается не значит, что какчественно, не советская военка чай
Да ладно, Вам. Ничего там запредельного нет. "мотоблок" (пропеллер + мотор + регуль + сила) всё это калибруется как "единое целое" и пофиг из чего оно состоит. :) Калибровка может делаться даже и автоматически по гирокомпасу - минимизируем показания по ускорению в режиме "завис над точкой" .. у сына так 2-х моторный вертолет взлетает: поднял - его "повело" то туда, то сюда .. 1-3-5сек помотало и всё, можно летать куда хочешь. Мы ему пластилином нос утяжеляли, чтобы надурить .. ага, щаз-з..
ua6em, не, калибровать моторы нужно обязательно. Никак без этого. Но это ж, вроде, несложно.
Я механик по образованию...хочется избежать непонятного поведения, а оно сейчас есть, сижу вот часами анализирую полётные логи, всё не так, всё не так ребята, начиная от питания меги, всё сделано чтобы оно билось и заказывалось на китайских сайтах
1-я функция - измерение длительности сигнала шим в частотном диапазоне от 50 до 300 гц и трансляция на выводной пин с возможность изменения частоты в стандартные 20, 8 и 4 миллисекунды (50 -250гц).
Мне известны 3 метода измерить параметры сигнала на 16-битном таймере в stm32.
1. как у меня в генераторе - сначала измерятся частота, далее зная какая частота идёт на вход рассчитать делитель таймера, настроенного на "PWM input mode" .
2. вариация предыдущего - но сразу настроить делитель на самую низкую возможную частоту. Не подходит для широких диапазонов. Это вариант с самым компактым кодом.
3. измерять с единичным делителем клоков, но на переполнение настроить прерывание, в котором будет икременироваться дополнительная переменная, таким образом будет вирутальное 32-битное разрешение. Это будет самое точное измерение, но при этом и самый трудный код, так же возможны подводные камни при одновременном приходе прерывания захвата и переполнения.
А вот на 32-битном таймере это просто пяток строк, т.к. делитель там не нужен. И никаких камней. :) Жаль что в f103 нет 32-битных таймеров. Так что в идеале взять мк типа Ф030, про которого как то a5021 писал. Это именно то, что надо.
ua6em, не, калибровать моторы нужно обязательно. Никак без этого. Но это ж, вроде, несложно.
Я механик по образованию...хочется избежать непонятного поведения, а оно сейчас есть, сижу вот часами анализирую полётные логи, всё не так, всё не так ребята, начиная от питания меги, всё сделано чтобы оно билось и заказывалось на китайских сайтах
1-я функция - измерение длительности сигнала шим в частотном диапазоне от 50 до 300 гц и трансляция на выводной пин с возможность изменения частоты в стандартные 20, 8 и 4 миллисекунды (50 -250гц).
Мне известны 3 метода измерить параметры сигнала на 16-битном таймере в stm32.
1. как у меня в генераторе - сначала измерятся частота, далее зная какая частота идёт на вход рассчитать делитель таймера, настроенного на "PWM input mode" .
2. вариация предыдущего - но сразу настроить делитель на самую низкую возможную частоту. Не подходит для широких диапазонов. Это вариант с самым компактым кодом.
3. измерять с единичным делителем клоков, но на переполнение настроить прерывание, в котором будет икременироваться дополнительная переменная, таким образом будет вирутальное 32-битное разрешение. Это будет самое точное измерение, но при этом и самый трудный код, так же возможны подводные камни при одновременном приходе прерывания захвата и переполнения.
А вот на 32-битном таймере это просто пяток строк, т.к. делитель там не нужен. И никаких камней. :) Жаль что в f103 нет 32-битных таймеров. Так что в идеале взять мк типа Ф030, про которого как то a5021 писал. Это именно то, что надо.
А если последовательное включение двух таймеров, их же там много?
ua6em, последовательно не уверен что можно. Можно по идее паралельно стартануть 2 таймера, один с единичным делителем, второй с делителем 65535. Соотвентственно 32-битный результат забирать сразу с двух. Но тоже хлопотно всё это грамотно организовать. Я б вряд ли пошёл на такое, зная что есть чип за 60 рублей, который позволит всё сделать особых без трудов :)
Акститесь! Разрядность всегда наращивалась последовательным соединением. Программным или аппаратным - не важно. Все там работает как часы. Где-то в старых примерах от СТМ можно найти реализацию. Может даже и в новых есть, уже не следил.
ssss, а как эти примеры могут называться? Сам я примеров объединения таймеров именно в режиме PWM input mode не находил. Тоже обдумывал этот вариант, и возможно не хватило ума сообразить как его реализовать. Я бы может и вернулся к этому вопросу из спортивного интереса, но нужен какой-то пинок в нужном направлении :)
ua6em, я сам понимаю что на f030 тяжело всё это сделать, учитывая что готовых плат с ней нету, а главное поддержки в arduino ide тоже нету. Тогда остаётся старая добрая Due. Пример 32-битного захвата PWM под неё я выкладывал. Так что хороший вариант :)
ssss, а как эти примеры могут называться? Сам я примеров объединения таймеров именно в режиме PWM input mode не находил. Тоже обдумывал этот вариант, и возможно не хватило ума сообразить как его реализовать. Я бы может и вернулся к этому вопросу из спортивного интереса, но нужен какой-то пинок в нужном направлении :)
ua6em, я сам понимаю что на f030 тяжело всё это сделать, учитывая что готовых плат с ней нету, а главное поддержки в arduino ide тоже нету. Тогда остаётся старая добрая Due. Пример 32-битного захвата PWM под неё я выкладывал. Так что хороший вариант :)
Дима! Буквально в первом запросе о цепочке таймеров
Подпункт - СИНХРОНИЗАЦИЯ ТАЙМЕРОВ. Но в статье примеры на классическом С, я попытался переделать - облом.
ua6em, если вы про параграф "Синхронизация таймеров" то это не тот режим. То что там описано используется у меня в частотометре при подсчёте числа импульсов.
dimax Понятно! Я не настоящий сталевар, с таймерами только пытаюсь разбираться )))
Установил KEIL чтобы посмотреть, да, это совсем иной уровень по сравнению с IDE, точно не для начинающих
ua6em, угу. А одновременно изучать новую IDE и новый МК это просмто вынос мозга. Поэтому я решил сначала изучить МК, а потом по необходимости перейти на другую IDE. Но необходимости так и не возникло ;-)))
ua6em, угу. А одновременно изучать новую IDE и новый МК это просмто вынос мозга. Поэтому я решил сначала изучить МК, а потом по необходимости перейти на другую IDE. Но необходимости так и не возникло ;-)))
кайло это для бизнеса, там всё по уму, проект, стадии и итд
кайло это для бизнеса, там всё по уму, проект, стадии и итд
Фи! Откуда такие мысли? Тогда и ИАР для бизнеса, и ЖЦЦ, да?
ssss, а как эти примеры могут называться? Сам я примеров объединения таймеров именно в режиме PWM input mode не находил. Тоже обдумывал этот вариант, и возможно не хватило ума сообразить как его реализовать. Я бы может и вернулся к этому вопросу из спортивного интереса, но нужен какой-то пинок в нужном направлении :)
По прерыванию захвата считываем оба таймера, проверяем было ли переполнение, корректируем старший счётчик если надо. Как-то так. Давно это было, точностей всех уже не помню, но работало даже на СТМ8С103, где соединения таймеров и отродясь то не было.
ua6em, я сам понимаю что на f030 тяжело всё это сделать, учитывая что готовых плат с ней нету, а главное поддержки в arduino ide тоже нету. Тогда остаётся старая добрая Due. Пример 32-битного захвата PWM под неё я выкладывал. Так что хороший вариант :)
Ничего страшного в f030 нет. Таймера там те же. Отойдите уже от ардуины полностью и откройте для себя мир всех возможностей разных МК.
кайло это для бизнеса, там всё по уму, проект, стадии и итд
Фи! Откуда такие мысли? Тогда и ИАР для бизнеса, и ЖЦЦ, да?
то, что не для начинающих - точно.
IDE и выстрелила благодаря очень низкому уровню входных знаний для старта.
А здесь даже пакет развернуть и настроить под плату нужны знания и далеко не интуитивные
Да и цены на STM32F030 не гуманные, да и не увидел я на камне 32 битных таймеров
ua6em, ну я ж ссылку то кидал. наш коллега a5021 всё расписал - таймер там неофициальный :) Голый чип совсем недорого.. что-то до 100р. Но я не соблазнюсь его брать :)
то, что не для начинающих - точно.
IDE и выстрелила благодаря очень низкому уровню входных знаний для старта.
А здесь даже пакет развернуть и настроить под плату нужны знания и далеко не интуитивные
Как по мне - наоборот. Загрузил ИДЕ и тупо по даташиту и референсу. А Ардуина - комок непонятно чего и для чего.
Работал с разными камнями и ИДЕ, но смысла ардуины понять так и не смог, не одолел, "Ну не шшшшмагла!"(с)...
Да и цены на STM32F030 не гуманные, да и не увидел я на камне 32 битных таймеров
Дело ваше.
Я уже три платки взял stm32F103, одну на 407 чипе, есть еще полётный контроллер на 405 чипе и 8 битная 103 чип )))
Только примеров мало
Примеров много в cubemx. Есть бесплатный атолик, который сразу из Куба компилит проект без каких либо телодвижений. Ставится атолик без вопросов и не нужны настройки. Есть пошаговая отладка. В кубе создаётся проект под контроллер и всю инициализации пишет куб. Остаётся только тело написать. Покрайней мере в такой связке что то сложнее мигания светодиода и писать проще для STM.
то, что не для начинающих - точно.
IDE и выстрелила благодаря очень низкому уровню входных знаний для старта.
А здесь даже пакет развернуть и настроить под плату нужны знания и далеко не интуитивные
Как по мне - наоборот. Загрузил ИДЕ и тупо по даташиту и референсу. А Ардуина - комок непонятно чего и для чего.
Работал с разными камнями и ИДЕ, но смысла ардуины понять так и не смог, не одолел, "Ну не шшшшмагла!"(с)...
Да и цены на STM32F030 не гуманные, да и не увидел я на камне 32 битных таймеров
Дело ваше.
Коллега, а в CubeMX можете скинуть проект конфигурации STM32F103C8 таймер по PWM и 8 каналов выхода PWM
А вы куб открывали? То что вы просите делается в двадцать нажатий мышки. В таймерах выбрать тактирование и выбрать режимы каналов. Потом уже в main дописать запуск таймеров. Но я думаю потребуется ещё что то. Тактирование выставить, ноги настроить. Прерывания инициализировать. В папке Куба есть примеры.
Примеров в кубе не нашёл, увы.
Собрал простенький пример для - поморгать светодиодиком -
Это просто ужас!!! Минут 20 ушло на, то чтобы понять, как и что...
Использую HAL...компилятор Keil 5
Без серьёзных знаний микроконтроллера и что у него и как даже думать нельзя о написании программы
В IDE значительно попроще
Есть тут кто поможет сконфигурировать два 16 битных таймера в цепочку, зацепить их на запуск от высокого уровня на ноге и остановку при низком (сигнал PWM) и всё это зацепить на прерывание?
c:\Users\1\STM32Cube\Repository\STM32Cube_FW_F1_V1.6.1\Projects\STM3210C_EVAL\Examples\
Искать вокруг этого пути.
Простите. Перечитал тему и не понял, зачем нужен 32 битный таймер для поставленной задачи? Точности 10^(-5) не хватает?
Есть тут кто поможет сконфигурировать два 16 битных таймера в цепочку, зацепить их на запуск от высокого уровня на ноге и остановку при низком (сигнал PWM) и всё это зацепить на прерывание?
Я тут нашёл апноут полезный, пока вдумчиво не читал, времени нет. Так что прокомметировать не могу.
тут нашёл апноут полезный, пока вдумчиво не читал, времени нет. Так что прокомметировать не могу.
Поигрался в Сube попробовал настроить таймера, вход на PA6
Подключай ST-Link и смотри в отладчике, что происходит, а про IDE забудь, шлак это.
Да до отладчика еще... тут бы по шагам видео или картинки глянуть - правильная настройка таймеров в режиме мастер-слэйв, для 32-х битного измерения входного импульса
Может попробовать почитать апноту? А отладчиком не пренебрегай, в нем можно настроить таймера не написав ни строчки кода.
ua6em, по поводу того апноута AN2592: Провёл вчера большую работу, по проверке того алгоритма, что там описан. Там три модели обьединения таймеров, нас интересует "32-bit input capture timer resolution" Сделал всё как там написано - не работает.
У меня очень веские основания полагать, что автор этого апноута либо никогда не запускал таймер в этом режиме и выложил голые догадки, либо же при написании алгоритма допустил ошибки (или не указал что-то важное что тоже приравниваю к ошибке). В доказательство этого не только тот факт, что у меня не получилось добиться работы, но и то, что нигде в инете нет рабочего примера именно этого алгоритма. Я поставил "на уши" гугля и яндекс - оба клянуться, что ничего не знают. Т.е. выходит этим способом никто не объединял таймеры. Ещё одним косвенным подтверждением того, что автор апноута отнёсся невнимательно к составлению алгоритма - некоторые настройки описаны довольно точно, например "selecting TI1FP1 as the input trigger by setting the TS bits in the SMCR register" -очень точное указание что делать. Некоторые размыто, но всё же понятно "the external signal is connected to channel 1 and the rising edge is configured as the active edge" , - кто работал с таймерами тот догадается какие биты прописать для rising edge . А какие то настройки и вовсе не указаны, например то, что тот же вход, указанный в предыдущей строке нужно перевести в режим "capture input", об этом почему-то ни слова. В общем алгоритм нерабочий. Если кто-то из сведущих коллег возьмётся подтвердить, или опровергнуть на практическом примере -буду благодарен.
Потом решил попробывать просто паралельную работу таймеров, без синхронизации. Исследуемый сигнал подключается на входы обоих таймеров, tim3 считает без делителя, tim2 с делителем на 65536, таким образом суммарно получается 32-битная разрядность. Таймеры меж собой никак не сихронизированы, только входящим сигналом. Поэтому сбрасывают захваченные значения в регистры захвата в принципе одновременно, но разница во времени гипотетически может быть. В идеале надо бы читать регистры по флагам , для простоты не стал этим заморачиваться. Скетч выдаёт длину периода в тактах, длину "единицы" в тактах, частоту в Герцах.
Добавил в setup
Serial.begin(115200);
На А0 и А6 подаем совместно?
PS Если кто-то из сведущих... - сомневаюсь, практически нет информации на русскоязычных форумах и сайтах
ua6em, я кстати не случайно не написал строчки Serial.begin() он там включен по-умолчанию :)
Входы да, запаралелить физически.
Кстати ещё раз посмотрел аддон от stm , (тут его упомянули первый раз), так вот, там есть поддержка мк f030r8t6, который в свою очередь тоже должен иметь неофициальный 32-битный таймер. (сведений, подтверждающих это на 100% я не нашёл правда) Конечно самому травить и паять демоборд с 64-ногим мк -это совсем крайняя степень фанатизма, а вот купить готовый для поиграться с этим мк вполне можно. В том же чип-дипе есть .
Я пользую STM32f303k8 в формате nano. https://www.terraelectronica.ru/product/2087245 . И 32бит таймер и 3 DAC канала и 5МГц оцифровка. Цена не гуманная. Там у них брал по 7 евро.
nik182, да, тоже интересный вариант. Главное поддержка для ардуины есть :) В чип-дипе примерно столько же стоит, правда под заказ.
Кстати ещё раз посмотрел аддон от stm , (тут его упомянули первый раз), так вот, там есть поддержка мк f030r8t6, который в свою очередь тоже должен иметь неофициальный 32-битный таймер. (сведений, подтверждающих это на 100% я не нашёл правда) Конечно самому травить и паять демоборд с 64-ногим мк -это совсем крайняя степень фанатизма, а вот купить готовый для поиграться с этим мк вполне можно. В том же чип-дипе есть .
в китае на треть дороже
ua6em, я кстати не случайно не написал строчки Serial.begin() он там включен по-умолчанию :)
Входы да, запаралелить физически.
Проверил от приемника, сигнал в диапазоне 1000 до 2000 мксек, цифирки бегут, частота 50.00 ... 49.99
Я пользую STM32f303k8 в формате nano. https://www.terraelectronica.ru/product/2087245 . И 32бит таймер и 3 DAC канала и 5МГц оцифровка. Цена не гуманная. Там у них брал по 7 евро.
Видимо давно это было, брать тогда самый дешёвый полётный контроллер и будет щастье
На платке зазмера со спичечный коробок получаем:P
ua6em, да 300 рублей экономии потом неприятностями аукнутся. Там наверняка половина ног не разведено.. Всё таки лучше полноценную плату со всеми пинами, даже не в нано-формфакторе.
ua6em, да 300 рублей экономии потом неприятностями аукнутся. Там наверняка половина ног не разведено.. Всё таки лучше полноценную плату со всеми пинами, даже не в нано-формфакторе.
Видимо да!!!
Кстати, а ты эту доку по последовательному соединению таймеров и даже на русском читал???
Стр82...
ua6em, не читал. Но там к сожалению без конкретики..
ua6em, не читал. Но там к сожалению без конкретики..
Но пишут что можно...еще читал что для именно для 103 процессора нельзя настроить таймер на запуск от фронта и остановку от спада сигнала, либо одно, либо другое