подсчет оборотов инкрементного энкодера
Я делаю проект, который требует от меня использования энкодера faulhaber, и у меня есть 2-канальный 16 строк на оборот. Я раньше не работал с энкодерами и, основываясь на том, что я обнаружил, строки на оборот означают, сколько импульсов я получаю за каждый оборот, поэтому в своем коде я использовал прерывание и подсчитывал, сколько раз мой канал A менялся, пока он не достиг 32 счетов. один раз для каждого максимума к минимуму и один раз для каждого минимума к максимуму для моих 16 импульсов, что, по моему мнению, означает, что у меня был один оборот, но когда я тестирую код примерно после 1/6 вращения, мой счетчик достигает 32 и Буду признателен, если кто-нибудь подскажет, в чем я ошибаюсь .
Это техническое описание кодировщика, который я использую IE2_16. р>
вот код:
volatile long int ticks = 0 ;
unsigned long int rev = 0 ;
const int channelA = 2 ;
void setup(){
Serial.begin(9600);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
pinMode(8,OUTPUT);
pinMode(channelA,INPUT);
attachInterrupt(digitalPinToInterrupt(channelA), numCunts, CHANGE);
digitalWrite(7,LOW);
digitalWrite(8,HIGH);
analogWrite(6,15);
}
void loop(){
Serial.println(rev);
if(ticks>=32){
ticks = 0;
rev++;
}
}
void numCunts(){
ticks+=1 ;
}
@masut, 👍-1
1 ответ
Нет, есть несколько проблем с декодированием. Во-первых, вы обнаруживаете каждое изменение. Вы хотите обнаруживать только изменения нарастающего или спадающего фронта.
Во-вторых, изменения, скорее всего, зашумлены, поэтому вам нужно написать свой декодер, чтобы "устранить дребезг" показаний. С 2-канальным энкодером, который вы используете, обычный способ сделать это состоит в том, чтобы реагировать на изменения переднего фронта на канале A только после того, как вы увидели изменение переднего фронта на канале B, и наоборот.
См. эту ссылку для описания того, как они работают: http://www.creative-robotics.com/quadrature- введение
Я пытался написать свой собственный декодер, но это сложнее, чем вы думаете, сделать это правильно. Я бы посоветовал использовать чью-нибудь библиотеку поворотных энкодеров.
И быстрый поиск в Google выявил эту библиотеку на github: https://github.com/PaulStoffregen/Encoder
(Я не знаю, хорошо это или нет. Это первое, что я нашел.)
- Считывание нескольких поворотных энкодеров
- Инкрементный кодер
- Считывание выходных данных энкодера с помощью оптрона
- Как выбрать входной контакт 600 кГц, разделить его на 4 и сгенерировать низкочастотный сигнал на выходном контакте Arduino
- Инкрементный поворотный энкодер отправляет данные, когда вал не трогается
- Сможет ли Arduino Uno считывать 3-кратные инкрементальные энкодеры?
- Многооборотный потенциометр - это боль, стоит ли вместо этого использовать инкрементный энкодер?
- Необъяснимое поведение int в кодировщике/светодиодном проекте