[Фрагмент] оптический инкрементный энкодер с использованием счетчика таймера

Jdenis
Ср 22 августа 2018 г., 7:28
Поэтому мне нужен был постепенный энкодер для моего проекта, я купил несколько дешевых из Китая, что -то около 10USD каждый...

После этого я посмотрел на таблицу данных от STM32F1 и обнаружил, что у них есть встроенный счетчик инкрементного энкодера, поэтому моя миссия состояла в том, чтобы заставить это работать!

Вот видео работает:



Теперь сначала код:

Сначала установите контакты на вход (в данном случае PB6 и PB7)

На установке:
HardwareTimer timer4(4); timer4.pause(); TIMER4->regs.adv->CCMR1 |= 0x0101; TIMER4->regs.adv->CCER |= 0x0000; TIMER4->regs.adv->SMCR |= 0x0303; (reads 8 clock cycles to make sure) TIMER4->regs.adv->CR1 |= 0x0001; timer4.refresh(); timer4.resume();

Jdenis
Сб 01 сентября 2018 11:43
На YouTube я получил вопрос:

Гнурелигион

Это довольно гладко! Можете ли вы почувствовать любые удары, как вращающийся энкодер, или он раскатится гладко?
Здесь из http: // www.STM32duino.компонент.

Ответ абсолютно без ударов, это как шариковая подшипника! (вероятно, потому что это :ржу не могу: )

Ваше здоровье!

Стивестронг
Пт, сентябрь 07, 2018 8:42 утра
Можете ли вы опубликовать ссылку, откуда вы ее взяли? Какой тип это?

Flyboy74
Пт, сентябрь 07, 2018, 9:40
Возможно, это интересно для людей в этой теме.

Я принес 1 из этих роторных кодеров https: // www.aliexpress.com/item/rotatin ... 39904.HTML Для 1 из моих проектов, но в конце концов не использовал его.

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

RGD
Пн 10 сентября 2018 г. 14:43
Привет, JDenis

Это выглядит очень интересно, но у меня еще три вопроса:

Этот код имеет более 16 бит или > 65536 Считается?

и если это не составлять 2400 графиков с 600 PPR -энкодером? Может быть, нужно изменить режим подсчета для использования падения и повышения края?

Где я могу найти информацию о битах конфигурации таймера, которые используются в вашем коде?

Янсун
Солнце 04 ноября 2018 г. 9:42
[RGD - Пн 10 сентября 2018 г. 14:43] -

Этот код имеет более 16 бит или > 65536 Считается?
Вы нашли ответ на это? Мне нужно 32 -битное значение

Янсун
Солнце 13 января 2019 г. 20:33
[Jdenis - Ср 22 августа 2018 г. 7:28] -
Вот и все, работает ужасно идеально!!!!
Я сделал несколько тестов с кодом, и это работает, но не идеально. Когда вы отключите 1line (a или b, не имеет значения), он остается подсчетом (или вниз, в зависимости от канала, который вы отключаете). Так что это на самом деле то же самое, если вы переключаете один пульс вверх и вниз. Вы на самом деле двигаетесь вперед и назад к тому же значению, но счетчик отсчитает. Я думаю, что код должен выглядеть так:
HardwareTimer timer4(4); timer4.pause(); TIMER4->regs.adv->CCMR1 = 0xf1f1; //Capture compare mode register, now CC1S AND CC2S TIMER4->regs.adv->CCER = 0x0000; // Capture/compare enable register TIMER4->regs.adv->SMCR = 0x0003; //(reads 8 clock cycles to make sure) // slave mode control registe TIMER4->regs.adv->CR1 = 0x0001; TIMER4->regs.adv->PSC = 0x0000; TIMER4->regs.adv->ARR = 0xffffffff; timer4.refresh(); timer4.resume();

Янсун
Солнце 13 января 2019 г. 20:37
Для 16-32 -битного таймера у меня есть разжигание, но это не элегантно
/* pins to input in this case PB6 and PB7 */ unsigned int count = 0; unsigned int prevCount = 0; int overFlowCnt = 0; long encCnt = 0; char userInput = 0; void tim3Handler(void) { count = TIMER4->regs.adv->CNT; if ( prevCount > 40000 && prevCount <= 65535 && count < 20000) { //overflow ++ overFlowCnt ++; } if (prevCount >= 0 && prevCount < 20000 && count >= 40000) { //overflow ++ overFlowCnt --; } encCnt = (65535 * overFlowCnt) + count; prevCount = count; }//end tim3handler void setup() { HardwareTimer timer4(4); timer4.pause(); TIMER4->regs.adv->CCMR1 = 0xf1f1; //Capture compare mode register, now CC1S AND CC2S TIMER4->regs.adv->CCER = 0x0000; // Capture/compare enable register TIMER4->regs.adv->SMCR = 0x0003; //(reads 8 clock cycles to make sure) // slave mode control registe TIMER4->regs.adv->CR1 = 0x0001; TIMER4->regs.adv->PSC = 0x0000; TIMER4->regs.adv->ARR = 0xffffffff; timer4.refresh(); timer4.resume(); Serial.begin(9600); } void loop() { Serial.print("now: "); Serial.print(count); Serial.print(" flow Count: "); Serial.print(overFlowCnt); Serial.print(" Enc count: "); Serial.println(encCnt); delay(300); }

mausi_mick
Пн 28 января 2019 г., 2:49
один вопрос:

Могу ли я использовать его для двух инкрементных энкодеров ?

Rogerclark
Пн 28 января 2019 г., 4:38 утра
Я уверен, что вам нужно использовать другой таймер для другого кодера.

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

Янсун
Чт 14 февраля 2019 г. 9:57 утра
Timer4 использует PB6/PB7 и Timer3 использует PA6/PA7. Я не проверил, можете ли вы использовать несколько энкодеров одновременно.

Если вы установите Cube MX, вы можете легко увидеть, какие контакты вам нужны, и я думаю, если вы можете использовать несколько энкодеров одновременно.

STM32 Duino *Loop *