Мульти Серво-тестер на STM32F103

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Задумал я мульти серво-тестер и так получается, что все задумки технически укладываются в возможности этого процессора. На первом этапе удалось общими усилиями подготовить среду для этого девайса и скомпилировать  достаточно интересный проект генератора от Dimax, который сообщил, что мои хотелки связанные с точным измерением длины импульса (До долей микросекунд) легко реализуются с помощью таймера этого девайса  и он где то уже код этот выкладывал. Увы не нашел.

Для того чтобы начать требуется функции:

1-я функция - измерение длительности сигнала шим в частотном диапазоне от 50 до 300 гц и трансляция на выводной пин с возможность изменения частоты в стандартные 20, 8 и 4 миллисекунды (50 -250гц).

2-я функция - выдача стандартных значений шим с длительностью импульса 1000 -1500 -2000 мксек (также в диапазоне частот 50-250герц) синхронно на восемь выходов.

3-я функция - выдача регулируемого значения шим от 400 до 3000 мксек (также в диапазоне частот 50-250герц)

Прошу помочь с реализацией функции измерения длительности сигнала шим и его частоты.

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Значит ли это (stm), что переносить на второй таймер avr уже неактуально?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

Значит ли это (stm), что переносить на второй таймер avr уже неактуально?

Очень даже актуально!!!

STM это далёкое будущее с высокой степенью неопределенности, а AVR это настоящее и уже работающее...
PS буду строить квадрокоптер 8 двигателей по соосной схеме... еще даже раму не делал, закупаюсь комплектующими  (STM - потребуется 8 каналов шим)

PPS ARHAT сейчас скажет, бери мегу )))

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Не факт вовсе. Мега прямое управление BLDC больше чем 1 мотором не тянет, ибо там компаратор в количестве адын штук. Тоже искал решение .. увы "фигвам". Можно сваять только "полетный контроллер", который будет управлять готовыми драйверами моторов .. ну так это задача куда проще и на мегах уже решена.

Чтобы нормально управлять моторами напрямую надо к каждому из них иметь свой компаратор. Можно конечно прилепить внешние, но .. нафига, если есть готовые контроллеры моторов по смешным ценам? :)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Arhat109-2 пишет:

Не факт вовсе. Мега прямое управление BLDC больше чем 1 мотором не тянет, ибо там компаратор в количестве адын штук. Тоже искал решение .. увы "фигвам". Можно сваять только "полетный контроллер", который будет управлять готовыми драйверами моторов .. ну так это задача куда проще и на мегах уже решена.

Чтобы нормально управлять моторами напрямую надо к каждому из них иметь свой компаратор. Можно конечно прилепить внешние, но .. нафига, если есть готовые контроллеры моторов по смешным ценам? :)

я напрямую и не собирался связка ESC-мотор остается, мне надо чтобы эта связка во всем диапазоне 1000-2000 выдавала на всех моторах одинаковые обороты

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

?!? Моторы разные, пропеллеры - отличаются, драйвера хоть на чуточку, но тоже разные, да даже напряжения питания будут слегка отличаться! Одинаковое управление моторами - далеко не лучшая идея. А Вы знакомились с кодом полетных контроллеров? Там ведь это совсем не так должно быть (не смотрел, но осуждаю) :)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Arhat109-2 пишет:

?!? Моторы разные, пропеллеры - отличаются, драйвера хоть на чуточку, но тоже разные, да даже напряжения питания будут слегка отличаться! Одинаковое управление моторами - далеко не лучшая идея. А Вы знакомились с кодом полетных контроллеров? Там ведь это совсем не так должно быть (не смотрел, но осуждаю) :)


НЕТ! Так как это выше моих возможностей ))) Я просо подберу попарно с наиболее близкими значениями из недорогих, брать хорошие моторы и регуляторы это выше моих возможностей, а надёжности хоцца
Да приятель собрал, дорогие двигатели, дорогие регуляторы, мозги дорогие, а регуль дым пустил )))
Дорого тоже оказывается не значит, что какчественно, не советская военка чай

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em, не, калибровать моторы нужно обязательно. Никак без этого. Но это ж, вроде, несложно.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

ua6em пишет:
НЕТ! Так как это выше моих возможностей ))) Я просо подберу попарно с наиболее близкими значениями из недорогих, брать хорошие моторы и регуляторы это выше моих возможностей, а надёжности хоцца
Да приятель собрал, дорогие двигатели, дорогие регуляторы, мозги дорогие, а регуль дым пустил )))
Дорого тоже оказывается не значит, что какчественно, не советская военка чай

Да ладно, Вам. Ничего там запредельного нет. "мотоблок" (пропеллер + мотор + регуль + сила) всё это калибруется как "единое целое" и пофиг из чего оно состоит. :) Калибровка может делаться даже и автоматически по гирокомпасу - минимизируем показания по ускорению в режиме "завис над точкой" .. у сына так 2-х моторный вертолет взлетает: поднял - его "повело" то туда, то сюда .. 1-3-5сек помотало и всё, можно летать куда хочешь. Мы ему пластилином нос утяжеляли, чтобы надурить .. ага, щаз-з..

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

ua6em, не, калибровать моторы нужно обязательно. Никак без этого. Но это ж, вроде, несложно.

Я механик по образованию...хочется избежать непонятного поведения, а оно сейчас есть, сижу вот часами анализирую полётные логи, всё не так, всё не так ребята, начиная от питания меги, всё сделано чтобы оно билось и заказывалось на китайских сайтах

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

ua6em пишет:

1-я функция - измерение длительности сигнала шим в частотном диапазоне от 50 до 300 гц и трансляция на выводной пин с возможность изменения частоты в стандартные 20, 8 и 4 миллисекунды (50 -250гц).

Мне известны 3 метода измерить параметры сигнала на 16-битном таймере в stm32.

1. как у меня в генераторе - сначала измерятся частота, далее зная какая частота идёт на вход рассчитать делитель таймера, настроенного на "PWM input mode" .

2. вариация предыдущего - но сразу настроить делитель на самую низкую возможную частоту. Не подходит для широких диапазонов. Это вариант с самым компактым кодом.

3. измерять с единичным делителем клоков, но на переполнение настроить прерывание, в котором будет икременироваться дополнительная переменная, таким образом будет вирутальное 32-битное разрешение. Это будет самое точное измерение, но при этом и самый трудный код, так же возможны подводные камни при одновременном приходе прерывания захвата и переполнения.

А вот на 32-битном таймере это просто пяток строк, т.к. делитель там не нужен. И никаких камней. :)  Жаль что в f103 нет 32-битных таймеров. Так что в идеале взять мк типа Ф030, про которого как то a5021 писал. Это именно то, что надо.

 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

ua6em пишет:

ЕвгенийП пишет:

ua6em, не, калибровать моторы нужно обязательно. Никак без этого. Но это ж, вроде, несложно.

Я механик по образованию...хочется избежать непонятного поведения, а оно сейчас есть, сижу вот часами анализирую полётные логи, всё не так, всё не так ребята, начиная от питания меги, всё сделано чтобы оно билось и заказывалось на китайских сайтах

Ну .. с этим надо на Р/С форумы... тут вряд ли кто вам что подскажет, а там есть спецы очень даже.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

dimax пишет:

ua6em пишет:

1-я функция - измерение длительности сигнала шим в частотном диапазоне от 50 до 300 гц и трансляция на выводной пин с возможность изменения частоты в стандартные 20, 8 и 4 миллисекунды (50 -250гц).

Мне известны 3 метода измерить параметры сигнала на 16-битном таймере в stm32.

1. как у меня в генераторе - сначала измерятся частота, далее зная какая частота идёт на вход рассчитать делитель таймера, настроенного на "PWM input mode" .

2. вариация предыдущего - но сразу настроить делитель на самую низкую возможную частоту. Не подходит для широких диапазонов. Это вариант с самым компактым кодом.

3. измерять с единичным делителем клоков, но на переполнение настроить прерывание, в котором будет икременироваться дополнительная переменная, таким образом будет вирутальное 32-битное разрешение. Это будет самое точное измерение, но при этом и самый трудный код, так же возможны подводные камни при одновременном приходе прерывания захвата и переполнения.

А вот на 32-битном таймере это просто пяток строк, т.к. делитель там не нужен. И никаких камней. :)  Жаль что в f103 нет 32-битных таймеров. Так что в идеале взять мк типа Ф030, про которого как то a5021 писал. Это именно то, что надо.

 

А если последовательное включение двух таймеров, их же там много?

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

ua6em, последовательно не уверен что можно. Можно по идее паралельно стартануть 2 таймера, один с единичным делителем, второй с  делителем 65535. Соотвентственно 32-битный результат забирать сразу с двух. Но тоже хлопотно всё это грамотно организовать. Я б вряд ли пошёл на такое, зная что есть чип за 60 рублей, который позволит всё сделать особых без трудов :)

ssss
Offline
Зарегистрирован: 01.07.2016

Акститесь! Разрядность всегда наращивалась последовательным соединением. Программным или аппаратным - не важно. Все там работает как часы. Где-то в старых примерах от СТМ можно найти реализацию. Может даже и в новых есть, уже не следил.

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

ssss, а как эти примеры могут называться?  Сам я примеров объединения таймеров именно в режиме PWM input mode не находил. Тоже обдумывал этот вариант, и возможно не хватило ума сообразить как его реализовать. Я бы может и вернулся к этому вопросу из спортивного интереса, но нужен какой-то пинок в нужном направлении :)

ua6em, я сам понимаю что на f030 тяжело всё это сделать, учитывая что готовых плат с ней нету, а главное поддержки в arduino ide тоже нету. Тогда остаётся старая добрая Due. Пример 32-битного захвата PWM  под неё я выкладывал. Так что хороший вариант :)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

dimax пишет:

ssss, а как эти примеры могут называться?  Сам я примеров объединения таймеров именно в режиме PWM input mode не находил. Тоже обдумывал этот вариант, и возможно не хватило ума сообразить как его реализовать. Я бы может и вернулся к этому вопросу из спортивного интереса, но нужен какой-то пинок в нужном направлении :)

ua6em, я сам понимаю что на f030 тяжело всё это сделать, учитывая что готовых плат с ней нету, а главное поддержки в arduino ide тоже нету. Тогда остаётся старая добрая Due. Пример 32-битного захвата PWM  под неё я выкладывал. Так что хороший вариант :)

Дима! Буквально в первом запросе о цепочке таймеров
 

Подпункт - СИНХРОНИЗАЦИЯ ТАЙМЕРОВ. Но в статье примеры на классическом С, я попытался переделать - облом.
 

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

ua6em, если вы про параграф "Синхронизация таймеров" то это не тот режим. То что там описано используется у меня в частотометре при подсчёте числа импульсов.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

dimax Понятно! Я не настоящий сталевар, с таймерами только пытаюсь разбираться )))
Установил KEIL чтобы посмотреть, да, это совсем иной уровень по сравнению с IDE, точно не для начинающих

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

ua6em, угу. А одновременно изучать новую IDE и новый МК это просмто вынос мозга. Поэтому я решил сначала изучить МК, а потом по необходимости перейти на другую IDE. Но необходимости так и не возникло ;-)))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

dimax пишет:

ua6em, угу. А одновременно изучать новую IDE и новый МК это просмто вынос мозга. Поэтому я решил сначала изучить МК, а потом по необходимости перейти на другую IDE. Но необходимости так и не возникло ;-)))


кайло это для бизнеса, там всё по уму, проект, стадии и итд

ssss
Offline
Зарегистрирован: 01.07.2016

ua6em пишет:

кайло это для бизнеса, там всё по уму, проект, стадии и итд

Фи! Откуда такие мысли? Тогда и ИАР для бизнеса, и ЖЦЦ, да?

ssss
Offline
Зарегистрирован: 01.07.2016

dimax пишет:

ssss, а как эти примеры могут называться?  Сам я примеров объединения таймеров именно в режиме PWM input mode не находил. Тоже обдумывал этот вариант, и возможно не хватило ума сообразить как его реализовать. Я бы может и вернулся к этому вопросу из спортивного интереса, но нужен какой-то пинок в нужном направлении :)

По прерыванию захвата считываем оба таймера, проверяем было ли переполнение, корректируем старший счётчик если надо. Как-то так. Давно это было, точностей всех уже не помню, но работало даже на СТМ8С103, где соединения таймеров и отродясь то не было.

Цитата:

ua6em, я сам понимаю что на f030 тяжело всё это сделать, учитывая что готовых плат с ней нету, а главное поддержки в arduino ide тоже нету. Тогда остаётся старая добрая Due. Пример 32-битного захвата PWM  под неё я выкладывал. Так что хороший вариант :)

Ничего страшного в f030 нет. Таймера там те же. Отойдите уже от ардуины полностью и откройте для себя мир всех возможностей разных МК.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ssss пишет:

ua6em пишет:

кайло это для бизнеса, там всё по уму, проект, стадии и итд

Фи! Откуда такие мысли? Тогда и ИАР для бизнеса, и ЖЦЦ, да?

то, что не для начинающих - точно.
IDE и выстрелила благодаря очень низкому уровню входных знаний для старта.
А здесь даже пакет развернуть и настроить под плату нужны знания и далеко не интуитивные
Да и цены на STM32F030 не гуманные, да и не увидел я на камне 32 битных таймеров

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

ua6em, ну я ж ссылку то кидал. наш коллега a5021 всё расписал - таймер там неофициальный :) Голый чип совсем недорого.. что-то до 100р. Но я не соблазнюсь его брать :)

ssss
Offline
Зарегистрирован: 01.07.2016

ua6em пишет:

то, что не для начинающих - точно.
IDE и выстрелила благодаря очень низкому уровню входных знаний для старта.
А здесь даже пакет развернуть и настроить под плату нужны знания и далеко не интуитивные

Как по мне - наоборот. Загрузил ИДЕ и тупо по даташиту и референсу. А Ардуина - комок непонятно чего и для чего.

Работал с разными камнями и ИДЕ, но смысла ардуины понять так и не смог, не одолел, "Ну не шшшшмагла!"(с)...

Цитата:

Да и цены на STM32F030 не гуманные, да и не увидел я на камне 32 битных таймеров

Дело ваше.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Я уже три платки взял stm32F103, одну на 407 чипе, есть еще полётный контроллер на 405 чипе и 8 битная 103 чип )))
Только примеров мало

nik182
Offline
Зарегистрирован: 04.05.2015

Примеров много в cubemx. Есть бесплатный атолик, который сразу из Куба компилит проект без каких либо телодвижений. Ставится атолик без вопросов и не нужны настройки. Есть пошаговая отладка. В кубе создаётся проект под контроллер и всю инициализации пишет куб. Остаётся только тело написать. Покрайней мере в такой связке что то сложнее мигания светодиода и писать проще для STM.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ssss пишет:

ua6em пишет:

то, что не для начинающих - точно.
IDE и выстрелила благодаря очень низкому уровню входных знаний для старта.
А здесь даже пакет развернуть и настроить под плату нужны знания и далеко не интуитивные

Как по мне - наоборот. Загрузил ИДЕ и тупо по даташиту и референсу. А Ардуина - комок непонятно чего и для чего.

Работал с разными камнями и ИДЕ, но смысла ардуины понять так и не смог, не одолел, "Ну не шшшшмагла!"(с)...

Цитата:

Да и цены на STM32F030 не гуманные, да и не увидел я на камне 32 битных таймеров

Дело ваше.

Коллега, а в CubeMX можете скинуть проект конфигурации STM32F103C8 таймер по PWM и 8 каналов выхода PWM

nik182
Offline
Зарегистрирован: 04.05.2015

А вы куб открывали? То что вы просите делается в двадцать нажатий мышки. В таймерах выбрать тактирование и выбрать режимы каналов. Потом уже в main дописать запуск таймеров. Но я думаю потребуется ещё что то. Тактирование выставить, ноги настроить. Прерывания инициализировать. В папке Куба есть примеры.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

nik182 пишет:
А вы куб открывали? То что вы просите делается в двадцать нажатий мышки. В таймерах выбрать тактирование и выбрать режимы каналов. Потом уже в main дописать запуск таймеров. Но я думаю потребуется ещё что то. Тактирование выставить, ноги настроить. Прерывания инициализировать. В папке Куба есть примеры.

Примеров в кубе не нашёл, увы.
Собрал простенький пример для - поморгать светодиодиком -
Это просто ужас!!! Минут 20 ушло на, то чтобы понять, как и что...
Использую HAL...компилятор Keil 5
Без серьёзных знаний микроконтроллера и что у него и как даже думать нельзя о написании программы

В IDE значительно попроще

Есть тут кто поможет сконфигурировать два 16 битных таймера в цепочку, зацепить их на запуск от высокого уровня на ноге и остановку при низком  (сигнал PWM) и всё это зацепить на прерывание?

nik182
Offline
Зарегистрирован: 04.05.2015

c:\Users\1\STM32Cube\Repository\STM32Cube_FW_F1_V1.6.1\Projects\STM3210C_EVAL\Examples\

Искать вокруг этого пути.

nik182
Offline
Зарегистрирован: 04.05.2015

Простите. Перечитал тему и не понял, зачем нужен 32 битный таймер для поставленной задачи? Точности 10^(-5) не хватает? 

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

ua6em пишет:

Есть тут кто поможет сконфигурировать два 16 битных таймера в цепочку, зацепить их на запуск от высокого уровня на ноге и остановку при низком  (сигнал PWM) и всё это зацепить на прерывание?

Я тут нашёл апноут полезный, пока вдумчиво не читал, времени нет. Так что прокомметировать не могу.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

dimax пишет:

 тут нашёл апноут полезный, пока вдумчиво не читал, времени нет. Так что прокомметировать не могу.

Поигрался в Сube попробовал настроить таймера, вход на PA6
 

/* TIM2 init function */
static void MX_TIM2_Init(void)
{

  TIM_ClockConfigTypeDef sClockSourceConfig;
  TIM_SlaveConfigTypeDef sSlaveConfig;
  TIM_MasterConfigTypeDef sMasterConfig;

  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 0;
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 0;
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  if (HAL_TIM_OnePulse_Init(&htim2, TIM_OPMODE_SINGLE) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  sSlaveConfig.SlaveMode = TIM_SLAVEMODE_TRIGGER;
  sSlaveConfig.InputTrigger = TIM_TS_ITR2;
  if (HAL_TIM_SlaveConfigSynchronization(&htim2, &sSlaveConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

}

/* TIM3 init function */
static void MX_TIM3_Init(void)
{

  TIM_MasterConfigTypeDef sMasterConfig;
  TIM_IC_InitTypeDef sConfigIC;

  htim3.Instance = TIM3;
  htim3.Init.Prescaler = 0;
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim3.Init.Period = 0;
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_IC_Init(&htim3) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  if (HAL_TIM_OnePulse_Init(&htim3, TIM_OPMODE_SINGLE) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;
  sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
  sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
  sConfigIC.ICFilter = 0;
  if (HAL_TIM_IC_ConfigChannel(&htim3, &sConfigIC, TIM_CHANNEL_1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

}

 

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Подключай ST-Link и смотри в отладчике, что происходит, а про IDE забудь, шлак это.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Да до отладчика еще... тут бы по шагам видео или картинки глянуть - правильная настройка таймеров в режиме мастер-слэйв, для 32-х битного измерения входного импульса

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Может попробовать почитать апноту? А отладчиком не пренебрегай, в нем можно настроить таймера не написав ни строчки кода.

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

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-битная разрядность.  Таймеры меж собой никак не сихронизированы, только входящим сигналом. Поэтому сбрасывают захваченные значения  в регистры захвата в принципе одновременно, но разница во времени гипотетически может быть. В идеале надо бы читать регистры по флагам , для простоты не стал этим заморачиваться. Скетч выдаёт длину периода в тактах, длину "единицы" в тактах, частоту в Герцах.

uint32_t imp_long, imp_hi;
void setup() {
pinMode(PA6,INPUT_PULLDOWN); // вход измерения PWM счёт младших 16 бит
pinMode(PA0,INPUT_PULLDOWN); // вход измерения PWM счёт старших 16 бит 

//обнуление регистров
TIMER3_BASE->CR1=0;//стоп таймер
TIMER3_BASE->PSC=0;  TIMER3_BASE->CNT=0;  TIMER3_BASE->CCR1=0; TIMER3_BASE->CCR2=0; 
TIMER3_BASE->CCR3=0;  TIMER3_BASE->CCR4=0;TIMER3_BASE->PSC=0;TIMER3_BASE->SR=0;
TIMER3_BASE->CCMR2=0; TIMER3_BASE->ARR=65535;
TIMER3_BASE->CR2=0; TIMER3_BASE->PSC= 0; 
TIMER2_BASE->CR1=0;//стоп таймер 
TIMER2_BASE->CCER=0;  TIMER2_BASE->CNT=0;  TIMER2_BASE->CCR1=0; TIMER2_BASE->CCR2=0; 
TIMER2_BASE->CCR3=0; TIMER2_BASE->CCR4=0;TIMER2_BASE->PSC=0;TIMER2_BASE->SR=0;
TIMER2_BASE->CCMR2=0; TIMER2_BASE->SMCR=0; TIMER2_BASE->ARR=65535;

//настройка счёта младших 16 бит
TIMER3_BASE->SMCR=(1<<6)|(1<<4)|(1<<2);// TS:101(TI1FP1) SMS:100(RESET MODE)
TIMER3_BASE->CCMR1=(1<<9)|(1<<0);// CC2 input,mapped on TI1, CC1 input,mapped on TI1
TIMER3_BASE->CCER=(1<<5)|(1<<4)|(1<<0);// cc2-capt.en/falling(4,5)   cc1-capt.en/rising(0)   
TIMER3_BASE->EGR=1; //перечитать регистры.
TIMER3_BASE->CR1=(1<<0);// старт захвата PWM
//настройка счёта старших 16 бит
TIMER2_BASE->PSC=0xffff; //divider =65536
TIMER2_BASE->SMCR=(1<<6)|(1<<4)|(1<<2);//TS:101(TI1FP1) SMS:100(RESET MODE)
TIMER2_BASE->CCMR1=(1<<9)|(1<<0);// CC2 input,mapped on TI1, CC1 input,mapped on TI1
TIMER2_BASE->CCER=(1<<5)|(1<<4)|(1<<0);// cc2-capt.en/falling(4,5)   cc1-capt.en/rising(0)   
TIMER2_BASE->EGR=1; //перечитать регистры.
TIMER2_BASE->CR1=(1<<0);// старт захвата PWM
}

void loop() {
imp_long = (TIMER3_BASE->CCR1 |  TIMER2_BASE->CCR1 << 16) +1  ;
imp_hi = (TIMER3_BASE->CCR2 |  TIMER2_BASE->CCR2 << 16) +1 ;
Serial.print(" long="); Serial.print( imp_long ); Serial.print(" hi=");Serial.print( imp_hi );
Serial.print(" freq="); Serial.print( (float)F_CPU/imp_long);
Serial.println("  ");
delay(300);
}

 

 

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Добавил в setup
Serial.begin(115200);
На А0 и А6 подаем совместно?

PS Если кто-то из сведущих... - сомневаюсь, практически нет информации на русскоязычных форумах и сайтах

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

ua6em, я кстати не случайно не написал строчки Serial.begin() он там включен по-умолчанию :)

Входы да, запаралелить физически.

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

Кстати ещё раз посмотрел аддон от stm , (тут его упомянули первый раз), так вот, там есть поддержка  мк f030r8t6, который в свою очередь тоже должен иметь неофициальный 32-битный таймер. (сведений, подтверждающих это на 100% я не нашёл правда) Конечно самому травить и паять демоборд с 64-ногим мк -это совсем крайняя степень фанатизма,  а вот купить готовый для поиграться с этим мк  вполне можно. В том же чип-дипе есть .

nik182
Offline
Зарегистрирован: 04.05.2015

Я пользую STM32f303k8 в формате nano. https://www.terraelectronica.ru/product/2087245 . И 32бит таймер и 3 DAC канала и 5МГц оцифровка. Цена не гуманная. Там у них брал по 7 евро. 

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

nik182, да, тоже интересный вариант. Главное поддержка для ардуины есть :) В чип-дипе примерно столько же стоит, правда под заказ.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

dimax пишет:

Кстати ещё раз посмотрел аддон от stm , (тут его упомянули первый раз), так вот, там есть поддержка  мк f030r8t6, который в свою очередь тоже должен иметь неофициальный 32-битный таймер. (сведений, подтверждающих это на 100% я не нашёл правда) Конечно самому травить и паять демоборд с 64-ногим мк -это совсем крайняя степень фанатизма,  а вот купить готовый для поиграться с этим мк  вполне можно. В том же чип-дипе есть .

в китае на треть дороже

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

dimax пишет:

ua6em, я кстати не случайно не написал строчки Serial.begin() он там включен по-умолчанию :)

Входы да, запаралелить физически.

Проверил от приемника, сигнал в диапазоне 1000 до 2000 мксек, цифирки бегут, частота 50.00  ... 49.99

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

nik182 пишет:

Я пользую STM32f303k8 в формате nano. https://www.terraelectronica.ru/product/2087245 . И 32бит таймер и 3 DAC канала и 5МГц оцифровка. Цена не гуманная. Там у них брал по 7 евро. 

Видимо давно это было, брать тогда самый дешёвый полётный контроллер и будет щастье

На платке зазмера со спичечный коробок получаем:P

Мм * плата 36x36 мм с монтажными отверстиями 30,5 мм.
* ~ 5 г.
* STM32F3 Процессор.
* Высокая емкость вспышки (Acro и Deluxe)
* MPU6050 акселерометр/гироскоп
* MS5611 Барометр (Deluxe только)
* HMC5883 компас (Deluxe только)
* Разъем MicroUSB.
* 4x 4pin JST-SH розетки (I2C, SWD 2 xUART)
* 2x 8pin JST-SH розетки (PPM, PWM, SERIAL RX, GPIO, ADC, В 3 В, В 5 В, GND)
* 8x 3pin-отверстия для штыревых заголовков для соединений ESC/Servo.
* 2x 4pin хотя-отверстия для штыревых заголовков для 2x серийных портов.
* 2x2 pin-отверстия для штыревых заголовков для напряжения батареи и зуммера.
 

 

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

ua6em, да 300 рублей экономии потом неприятностями аукнутся. Там наверняка половина ног не разведено.. Всё таки лучше полноценную  плату со всеми пинами, даже не в нано-формфакторе.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

dimax пишет:

ua6em, да 300 рублей экономии потом неприятностями аукнутся. Там наверняка половина ног не разведено.. Всё таки лучше полноценную  плату со всеми пинами, даже не в нано-формфакторе.


Видимо да!!!
Кстати, а ты эту доку по последовательному соединению таймеров и даже на русском читал???
Стр82...

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

ua6em, не читал. Но там к сожалению без конкретики..

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

dimax пишет:

ua6em, не читал. Но там к сожалению без конкретики..


Но пишут что можно...еще читал что для именно для 103 процессора нельзя настроить таймер на запуск от фронта и остановку от спада сигнала, либо одно, либо другое