Таймер как энкодер

Бубулиндо
Пт 11 сентября 2015 г. 10:57 утра
Привет,

Это мой первый пост здесь. Я играл с кленовыми досками в течение некоторого времени (написание одной из библиотек RTC в Интернете), и я решил, что высыхает свои кленовые доски и поднимал туда, где остановился.

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

Я добавил поддержку этой функции в классе Hardwaretimer и связанном таймере.C/H файлы, но не уверен, что будет лучшим способом добавить их в официальный репозиторий для STM32Duino.

Кто -нибудь может дать мне указание, пожалуйста?

Mrburnette
Пт 11 сентября 2015 12:25
I've added support for this functionality on the HardwareTimer class and related timer.c/h files, but am not sure what would be the best way to add these to the official repository for the stm32duino.

Бубулиндо
Пт 11 сентября 2015 г. 14:27
Спасибо.

Я развел arduino_stm32 и загрузил изменения в свой git.

https: // github.com/bubulindo/arduino_stm32.git

Я работаю немного больше над наброском примера, чтобы включить его в программу симуляции.

Rogerclark
Сб 12 сентября 2015 г. 18:58
Можете ли вы создать запрос на притяжение, на GitHub, так как в противном случае это действительно трудно определить, что вы изменили

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

Спасибо

Бубулиндо
Сб 12 сентября 2015 г. 20:13
Я буду.

Я просто заканчиваю пример, так как все еще неясно относительно подсчета краев (не соответствует тому, что находится на руководстве).

victor_pv
Сб 12 сентября 2015 г. 11:01
Бубулиндо написал:Я буду.

Я просто заканчиваю пример, так как все еще неясно относительно подсчета краев (не соответствует тому, что находится на руководстве).

Rogerclark
Солнце 13 сентября 2015 г., 4:50 утра
Спасибо, ребята...

Бубулиндо
Солнце 13 сентября 2015 г. 16:42
Привет, господа,

Я добавил пример в папку Arduino_stm32 \ Примеры \ Sensors и сделал запрос на вытяжение.
Пример имеет квадратурный симулятор энкодера внутри, чтобы иметь возможность проверить энкодер в качестве таймера. Нужно только два прыгуна.

Что касается этого режима, я думаю, что будет иметь больше смысла в конечном итоге создать класс Encoder, где поддерживается нулевой импульс. Возможно, это может быть интересно...

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

Дайте мне знать, если чего -то не хватает.

123Francoz
Пт 12 февраля 2016 г. 12:16
Привет, @BubUlindo, я читаю вашу ветку здесь
и я получил библиотеку, это твоя правильно?
Мне было полезно узнать, как получить доступ к регистрам таймеров,
Читая это, я смог это написать (TIMER1->regs).gen->CR1 = 0x00;

Martinayotte
Пт 12 февраля 2016 г. 13:58
Я предоставил подробный ответ в другой ветке: ViewTopic.PHP?f = 2&P = 10619#P10619
Прямой доступ к RTC_BASE->Cnth

rreignier
Вт 16 февраля 2016 г., 21:04
Всем привет,
Я здесь новый, и мне интересно, почему @BubuLindo не создал запрос на притяжение кода кодера, который кажется довольно интересным.
Есть ли проблема, которую я должен знать, прежде чем пытаться ее использовать?
Спасибо

Бубулиндо
Чт, 01 сентября 2016 г., 11:24
Привет,

Жизнь как бы мешала, и я полагаю, я попал в стену с обновлениями на Ардуино, вероятно, сломал ее.

Я искал, и я изменил библиотеку Hardwaretimer, чтобы включить код энкодера, однако, это может быть не лучшим способом. Ваши мысли по этому вопросу благодарны.

Я реформировал его и проверил этот код как отдельную библиотеку, которая хранится в:

https: // github.com/bubulindo/stm32encoder/tree/master

Посмотрите на это и дайте мне знать, если чего -то не хватает. Чтобы запустить пример, провод D4 до D10 и D5 на D11, замена этих соединений изменит направление количества кодеров.

rreignier
Сб 03 сентября 2016 г., 13:23
О, это звучит как хорошая идея, чтобы поместить его в библиотеку.
Я постараюсь проверить его позже с помощью двигателя DC и кодера.

Сначала я вижу, что вы назвали его Encoder.H Так может быть немного вводит в заблуждение с библиотекой энкодеров PJRC: https: // www.PJRC.com/teensy/td_libs_encoder.HTML и код здесь: https: // github.com/paulstoffregen/encoder
Может быть, это хорошая идея, чтобы сохранить то же имя, но использовать тот же API, поэтому код Arduino, который использует библиотеку PJRC, сможет работать на STM32 (только используемый вывод соответствует аппаратному таймеру).

Но после просмотра исходного кода библиотека называется STM32encoder и файл STM32encoder.H, так что в примере должна быть ошибка.

Бубулиндо
Солнце 04 сентября 2016 г., 6:33
Привет,

Ты прав... У меня также установлена ​​библиотека энкодеров PJRC, и я задавался вопросом, почему мой не будет компилироваться, а затем в итоге переименовал ее в STM32encoder.

Это должно быть довольно уникальным именем и более или менее соответствует другим библиотекам.

Попробуй это с правильным оборудованием. Мой пример имитирует ступени энкодера и не только то, что он тоже имитирует их довольно медленно. Если у вас есть установка с сборкой двигателя/энкодера, где вы можете подтвердить это, это было бы здорово. :)

rreignier
Солнце 04 сентября 2016 г. 14:15
Привет,

Я думаю, что имя stm32encoder в порядке. Но вы должны внести изменения в пример (который должен быть в своем собственном каталоге с тем же именем, что и в библиотеке), в библиотеке.Свойства и ключевые слова.TXT файлы.

Также измените Enc.Направление () к Enc.getDirection () в примере.

Я пробовал это на Maple Mini, Blue Pill и Olimexino-STM32. Почему так много досок? Потому что мне не удалось заставить его работать сначала на Maple Mini. Цифровые контакты не называются такими же, как кленов (я не так использую для использования STM32Duino на этих досках), поэтому у меня сначала были случайные фигуры.
С правильными булавками это работает хорошо (я пытался прочитать только значение революций. Кстати, вы должны попытаться интегрировать обратный вызов прерывания в библиотеку. Я знаю, что это нелегко без трюков, я видел, как вы публикуете в другой ветке о работе со экземплярами.

Но оставшаяся проблема заключается в том, что подсчет делится на 2, если я сравниваю с тем, что я использую код ST HAL.
Я не понимаю проблему, потому что используется определенный count_both_channels, и он помещает 0x3 в регистр SMCR, который кажется в порядке. Так что, может быть, вы более опытные, чем я, чтобы понять проблему.

Бубулиндо
Солнце 04 сентября 2016 г. 18:43
Спасибо.
Теперь я понимаю, что я сильно испортил управление файлами (по какой -то причине я не могу разобраться в GitHub).
В любом случае, я загрузил исправления, которые вы ссылались.

Когда вы сказали, что количество было наполовину, это звучало для меня как проблема прескаля. Конечно же, это.

Руководство говорит, что значение предварительного прекалера может быть от 1 до ~ 65000. Тем не менее, я пропустил фактическое описание прекалера, где они добавляют бит безопасности.
Далее вниз, в руководстве говорится об этом: fck_psc / (psc [15: 0] + 1) Поэтому, когда вы положили 1 на прокалеровское поле, у вас на самом деле есть предварительный проклятор двух. Документация не имеет ни одной из них в примерах, поэтому я могу компенсировать это, вычитая 1 из пользовательского ввода в коде.

Мне больно, что я не нашел способ получить прерывания в классе, так как это сделало бы его гораздо более чистым интерфейсом. Но если не выглядит так, как это возможно, или легко возможно. Я прошел все функции таймеров и USART, которые являются для меня самыми развитыми библиотеками и не нашли способ связать его с частными членами (количество поворотов) класса.
Сейчас я смотрю в АЦП, так как он выглядит как хороший проект (учитывая, что очень мало было выведено в интерфейс стиля Arduino) за то, что он вытащил ржавчину из моих навыков C и узнал немного больше C++.

Если кто -то знает, как это обойтись... Я был бы признателен за это. :)

Дайте мне знать, чего еще не хватает. :)

rreignier
Пн, 05 сентября 2016 г., 18:15
Привет,

Спасибо за обновления и объяснение о прескалере, но кажется, что вы еще не добавили исправление.
Я попытался положить 0 в качестве прескалера, и я получаю полное разрешение. Спасибо.

Кроме того, я забыл упомянуть раньше, но в первом примере отсутствует сериал.Заглавное () оператор в setup ().
И в ключевых словах есть оставшийся «энкодер».txt file.

В любом случае, хорошо, что вы добавили некоторые расширенные функции в ARDUINO, как API. В настоящее время я учусь использовать эти чипы STM32, используя библиотеку HAL, но я понял, что в основном пытаюсь имитировать API Arduino, потому что это то, к чему я привык. Я решил использовать HAL вместо STM32Duino, потому что я хочу использовать все аппаратные функции для освобождения процессора, вещи, которые невозможно с Raw Arduino API.
Например, я прочитал кучу ультразвуковых датчиков с прерыванием захвата ввода и выделенным таймером, чтобы запланировать триггеры и избежать помех между датчиками. Таким образом, процессор почти ничего не делает с API Arduino, я бы использовал функцию Pulsein (), которая делает занятое ожидание.

Бубулиндо
Пн, 05 сентября 2016 г., 18:47
Привет,

Я сделал сейчас.
Честно говоря, я начал с HALMX, но мне это не нравится, так как под капюшоном слишком много для капюшона.
Я был очень счастлив, когда увидел, что это включало Freertos, но затем понял, что они даже добавили обертку вокруг этого. Это означает, что вам нужно копаться в их файлах, если вы хотите что -то проверить.

Кроме того, я не могу по -настоящему понять, как перемещать код оттуда оттуда...

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