[Решен] Hardtimerasencoder.Ино пример

Jimbo13
Вт 28 ноября 2017 г., 21:25
Я не могу получить хардтимазанкодер.INO, чтобы работать над моим BluePill STM32F103, любые предложения, пожалуйста.

https: // github.com/rogerclarkmelbourne/ ... ncoder.Ино
С моей областью я определил, что физический вывод 14 и 15 был выходом симулятора.
Я подключил физический PIN14 до 12, 15-13. *TIMER2 inputs -> Digital Pins used to simulate. * D2 -> D4 * D3 -> D5

victor_pv
Вт 28 ноября 2017 г. 22:11
Я полагаю, что у Bluepill нет штифтов, показывает только названия портов (PA1, PA2, PB0 и т. Д.)
Эти имена D2, D4 из клена. Номера выводов в BluePill и Maple/Maple Mini не совпадают. Не уверен, на что вы имеете в виду с помощью Phisical Pin 14 и 15, так как я считаю, что ни одна версия Bluepill не использует только цифры для выводов.
Если вы используете номера выводов пакетов Dip, это сбивает с толку, лучше использовать PA0, PA1 и т. Д., Для остальных, чтобы понять, что вы соединяете, где.
Что касается функции таймера энкодера, она должна использовать входные данные (каналы) 1 и 2 из того же таймера для работы. Таким образом, входные контакты должны быть CH1 и CH2 одного и того же устройства таймера.

Zoomx
Ср 29 ноября 2017 г. 7:49
На чертеже соединения должны быть

PA_10 -> PB_5
PB_3 -> PB_4

Как вы можете видеть здесь
Изображение

Jimbo13
Ср 29 ноября 2017 г. 9:36 утра
Я использую рутинную аутику, как показано ниже.
Изображение
Я посмотрел на распинущую кленовую распину, но не смог коррелировать булавку D2-D5, поэтому я запустил программу, предполагая, что распределение штифтов будет разобраться. Затем я искал вывод симулятора, который появился на физическом штифте (в легкой бирюзовой диаграмме) 14 и 15. Затем я выпустил часть настройки таймера и погасил то, что будет входными контактами D2 D3 вверх и вниз, и используя применение, которое я обнаружил, что это физические контакты 12 и 13.
Итак, я подключил физический вывод от 14 до 12, 15-13.

Я только что попытался использовать PA10 вместо D2 в качестве ввода в программе.
PB3 вместо D3 в качестве входного
PB5 вместо D4 в качестве вывода
PB4 вместо D5 в качестве вывода
Я получил выход для симулятора на PB5, но не на PB4
Я подключил PB5 к PA10, затем PB3, но получил:
1016 Считается
Направление 0
Полные обороты: 4294967295
1016 Считается
Направление 0
Полные обороты: 4294967295
1016 Считается
Направление 0
Полные обороты: 4294967295

Я немного смущен, но буду исследовать булавки позже более подробно.

Джим

victor_pv
Ср 29 ноября 2017 г. 16:09
Я не знаю, откуда поступают цифры в этой диаграмме, но в общих досках контакты к численному соотношению-прямая PA0-15, затем PB0-15 и т. Д., За исключением не всех контактов во всех MCUS доступны во всех MCUS. Числа не пропущены, вместо этого используется следующее последовательное число для следующего выходящего выхода подряд подряд. Они в перечислении:
https: // github.com/rogerclarkmelbourne/ ... rd/poard.час

Поскольку ни одному из них не назначено значение, компилятор начнет с 0 для PA0.

Чтобы избежать путаницы, всегда используйте PA0, PA1 и т. Д. В ваших эскизах, поскольку 0 в Maple Mini соответствует другому штифту, чем чертеи, и это может соответствовать чему -то еще на другой плате.

Что касается выбора PIN -кода, оба входа должны быть CH1 и CH2 того же таймера.
PA10 и PB3 - разные таймеры, а на вершине PA10 - 3 канала этого конкретного таймера.
Поправьте меня, если я ошибаюсь, но в соответствии с справочным руководством вам нужно использовать входные данные 1 и 2.

На диаграмме, PA8 и PA9 - CH1 и 2 того же таймера, попробуйте эти 2.

Jimbo13
Ср 29 ноября 2017 г., 22:25
Хорошо, Виктор, это сработало.
Я также получил таймер 1 3 и 4, работая с помощью:
Хардворетимер таймер (1); PA8-9
Хардворетимер таймер (3); PA6-7
Хардворетимер таймер (4); PB6-7

И многому научился в процессе.

Спасибо

Джим

Jimbo13
Пт, 01 декабря 2017 г., 17:24
Продолжение с некоторой информацией, которая может быть заинтересована.
Мне потребовался вращающийся энкодер, чтобы сделать преобразователь проводной проволоки с разрешением 1 мм. У меня прикреплен шкив диапазона 20 мм к моему вращению, так что pi*d = 62.8 мм. Поэтому я купил ротационный энкодер Bourns EM14 с 64 PPR, который делает каждый импульс примерно 1 мм (скорректирован по коэффициенту масштаба).
Ссылаясь на справочное руководство ST «RM0008» (Page391) в режиме квадратурного энкодера Счетчик подсчитывается при каждом переходе двух входов. Это означает, что счетчик фактически имеет значение 4 * 64 = 128 PPR, что было бы хорошо задним числом, так как я мог бы использовать более дешевый 16 PPR Encoder.
Quadcounter2.png
Quadcounter2.PNG (22.15 киб) просмотрено 1258 раз

victor_pv
Сб 02 декабря 2017 г. 14:38
Вы должны использовать таймер.SetPrescaleFactor (4) для получения деления на 4.

Причина для субстракта 1 заключается в том, что настройки прескалера начинаются с 0:
0 -> Разделите на 1
1 -> Разделите на 2
2 -> Разделите на 3
3 -> Разделите на 4

Это так, как работает регистр Прескалера, задокументированный в справочном руководстве, если вы хотите найти больше.
Если вы используете таймер.SetPrescaleFactor (5) Ваша шкала будет выключен.

Кокоспалм
Солнце 29 апреля 2018 13:01
[victor_pv - Ср 29 ноября 2017 г. 16:09] -
Что касается выбора PIN -кода, оба входа должны быть CH1 и CH2 того же таймера.
PA10 и PB3 - разные таймеры, а на вершине PA10 - 3 канала этого конкретного таймера.
Поправьте меня, если я ошибаюсь, но в соответствии с справочным руководством вам нужно использовать входные данные 1 и 2.

На диаграмме, PA8 и PA9 - CH1 и 2 того же таймера, попробуйте эти 2.
Я немного смущен. Что вы имеете в виду с «оба входных данных должны быть CH1 и CH2 в одно и то же время?
Мой таймер.getCount () просто работает нормально, но фанк ничего не делает...
У меня есть настоящий подключен энкодер, поэтому мне не нужны что -то эмуляция.
Это мой код:
#define PPR 1024 HardwareTimer timer(3); //initialize a timer long ints = 0; void func(){ if (timer.getDirection()){ ints--; } else{ ints++; } } void setup() { //define the Timer channels as inputs. pinMode(PA6, INPUT_PULLUP); //channel A pinMode(PA7, INPUT_PULLUP); //channel B Serial.begin(115200); Serial.println("encoderTest"); //configure timer as encoder timer.setMode(1, TIMER_ENCODER); //set mode, the channel is not used when in this mode. timer.pause(); //stop... timer.setPrescaleFactor(1); //normal for encoder to have the lowest or no prescaler. timer.setOverflow(PPR); //use this to match the number of pulse per revolution of the encoder. Most industrial use 1024 single channel steps. timer.setCount(0); //reset the counter. timer.setEdgeCounting(TIMER_SMCR_SMS_ENCODER3); //or TIMER_SMCR_SMS_ENCODER1 or TIMER_SMCR_SMS_ENCODER2. This uses both channels to count and ascertain direction. timer.attachInterrupt(1, func); //channel doesn't mean much here either. timer.resume(); //start the encoder... } //Support variables. unsigned long interval=0; //variable for status updates... char received = 0; void loop() { //encoder code if (millis() - interval >= 100) { Serial.print(timer.getCount()); Serial.print("\t"); Serial.print(timer.getDirection()); Serial.print("\t"); Serial.println(ints); interval = millis(); //update interval for user. } }

victor_pv
Вторник, 1 мая 2018 г., 8:08 вечера
Если вы захотите использовать аппаратный таймер для чтения энкодера и указания направления, вам необходимо использовать 2 контакта, которые соответствуют CH1 и CH2 того же устройства Timer Adwange Timer. OP использовал 2 контакта, которые не соответствовали тому же аппаратному таймеру, поэтому ему пришлось изменить. Изменение этой проблемы решить эту проблему в качестве следующего поста после этого показывает.

Просто примечание, у вас есть полная революция, установленная на 1024. Из вывода, который вы показываете, вы не достигли этого. Я лично не использовал таймер в качестве кодирования, но я считаю, что func () будет вызван, когда вы завершите революцию. Может быть неправ, хотя, я не смотрел, как таймеры работают как кодеры.

Кокоспалм
Пт, 04 мая 2018 г., 11:12
Хорошо, спасибо, я думаю, что получил это сейчас :)

Поддержка STM32F103RT6