Наскільки точно я можу отримати Arduino за допомогою обертових кодерів?


15

Крокові двигуни часто дорогі для великого мотора. Однак за допомогою потужного, стандартного двигуна постійного струму та обертового кодера ви можете «імітувати» кроковий двигун. Наскільки точними є обертові кодери з Arduino просто з базовим циклом і не так багато іншого коду? Це буде "пропускати пульс" і не записувати достатньо обертання часто? Як я можу впоратися з цим набагато більше коду? Чи є кращий спосіб зробити це? Чи допоможуть переривання? Чи є якась схема, яка допомогла б вирішити цю проблему?

Примітка. Це, ймовірно, не перевищить 4 обертання в секунду ... (Це може бути багато, але якщо ви робите свинцевий механізм гвинтового гвинта, який би становив лише 24 дюйми в хвилину, якщо є 10 обертів на дюйм лінійного руху. )


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

Відповіді:


10

Перерви - це те, що ви використали б у цій ситуації.

Швидкість, про яку ви згадали, досить повільна, тому, ймовірно , ви зможете порахувати її всередині циклу, однак це не рекомендується, оскільки для типового циклу потрібно буде виконати багато циклів тактових годин, і це залежить від кількості випусків на цикл Ви можете пропустити деякі підрахунки.

Для цього робляться переривання, оскільки вони можуть бути спровоковані в будь-який час, незалежно від стану циклу.

Існує названа функція, attachInterrupt()яка прийме три аргументи.

  1. Штифт переривання
  2. Службовий режим переривання
  3. Режим

Нижче наводиться приклад підрахунку перерви

volatile int myCounter = 0;

void setup(){
    attachInterrupt(0, count, RISING);
}

void count(){
    myCounter++;
}

Режими такі:

НИЗЬКИЙ, ЗМІНЕНИЙ, ВІДПОВІДНИЙ, ПАЛИЙ

Більше інформації про використання переривань можна отримати тут .

Залежно від кодера, який ви використовуєте, вам потрібно буде адаптувати код за вашими потребами та зробити ще кілька розрахунків, щоб визначити свою позицію, але це має бути гарною відправною точкою.

Редагувати Ось приклад коду з Arduino Sandbox для використання обертового кодера.


1
Детектор крайового переривання на Duemilanove легко обробляє 100 країв в секунду (6500 об / хв на моторі).
Шлях до незнайомця

@WayfaringStranger Отже, тоді у Uno немає проблем. Спасибі!
Анонімний пінгвін

1
@AnnonomusPerson - Скільки робіт ви готові вкласти? Якщо ви перебуваєте голими ( ISR_NAKED()), ви можете пропустити автоматичне збереження контексту на C і зняти швидкості переривання 100-500 Хц без проблем, але ви в основному пишете збірку в C на цьому етапі.
Коннор Вольф

1
Якщо ви хочете повністю банановий документ про оптимізацію абсолютного лайна з-за реакції переривання, дивіться тут . Розміщення коду безпосередньо в таблиці переривань для подальшого зменшення затримки переривання!
Коннор Вольф

1
Також зауважте, що якщо ви збираєтесь із затримкою з низькою затримкою, функція arduino attachInterrupt вводить цілий додатковий накладний набір функціональних викликів порівняно з використанням ISR()прямого переривання .
Вонор Коннор

3

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

Читання обертових кодерів: http://playground.arduino.cc/Main/RotaryEncoders

Квадратурний кодер занадто швидкий для Arduino (з рішенням): http://www.hessmer.org/blog/2011/01/30/quadrature-encoder-too-fast-for-arduino/

Бібліотека Encoder Teensy: https://www.pjrc.com/teensy/td_libs_Encoder.html

Читання обертового кодера на Arduino: http://www.circuitsathome.com/mcu/reading-rotary-encoder-on-arduino/

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.