Энкодер соединен с валом двигателя. Энкодер выдает более высокие значения, чем ожидалось.
Я новичок и у меня нет большого опыта работы с Arduino. пожалуйста, помогите мне. Я намерен построить робота, который будет двигаться по прямой даже по неровным поверхностям, подобным тем, которые мы видим на сельскохозяйственных полях (это всего лишь прототип, поэтому я хочу запустить его на обычных поверхностях для бездорожья). У робота 4 двигателя, по одному на каждое колесо. Я планирую использовать метод обратной связи энкодера, чтобы двигаться прямо. Прямо сейчас я подключил диск с прорезями к валу двигателя постоянного тока и пытаюсь получить показания от энкодера и отобразить их через определенный интервал (5 секунд) на последовательном мониторе. Подсчет, который я получаю, далек от истины. Диск имеет 30 слотов. Всего за 2–3 вращения я насчитал около 180.
Я использую Arduino R3. Выход энкодера:- Pin2 (внешнее прерывание) Контакты двигателя: - 8,9 Я прилагаю код ниже.
const int motorPin1 = 8; // Контакт 14 L293
const int motorPin2 = 9; // Контакт 10 L293
const int encoder_pin = 2;
volatile unsigned int count = 0;
int time1 = 0;
int time2 = 0;
void setup() {
// поместите сюда свой код установки для однократного запуска:
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(encoder_pin,INPUT);
digitalWrite(encoder_pin,HIGH);
attachInterrupt(0,encoder,RISING);
Serial.begin(9600);
digitalWrite(motorPin1,HIGH);
digitalWrite(motorPin2,LOW);
time1 = millis();
}
void loop() {
// поместите сюда свой основной код для многократного запуска:
time2 = millis();
if(abs((time2 - time1) > 5000))
{
digitalWrite(motorPin1,LOW);
digitalWrite(motorPin2,LOW);
Serial.println(count);
}
}
void encoder()
{
count++;
}
конец кода
Диск, который я установил на вал, не вращается точно в вертикальной плоскости. Но у меня мигает энкодер, когда я вращаю вал рукой. Может ли быть причиной этого смещение?
@Gautam Vikhe, 👍0
2 ответа
Лучший ответ:
Думаю, это своего рода проблема устранения дребезга, вызванная шумом на выводе прерывания. Поведение также может ухудшиться из-за упомянутого вами несоответствия. Вы можете убедиться в этом, вращая вал вручную, хотя вы и «получаете мигания», я сомневаюсь, что они точны в подсчете.
В этом случае вы можете сделать две вещи:
- добавьте к выводу прерывания емкость или RC-фильтр, чтобы сгладить пики напряжения, если они есть. Это уменьшит вероятность случайного срабатывания прерывания (и не решит проблему), но в качестве нижнего прохода оно также ограничивает максимальную скорость счета, которую вы можете обнаружить.
- реализовать устранение дребезжания в программном обеспечении. Обычно это делается путем игнорирования входного сигнала в течение определенного периода времени («мертвое время») после возникновения прерывания. Поскольку вы ожидаете периодический сигнал и поведение по устранению дребезга может быть разным на разной скорости, было бы неплохо зафиксировать промежуток времени между двумя «миганиями» и сделать время простоя зависимым от этой расчетной скорости.
Ещё: способ проверки метки времени немного неправильный. Вместо этого вам следует сделать что-то вроде этого:
void setup() {
unsigned long starttime=millis();
}
void loop() {
if (millis()-starttime > 5000) {
starttime=millis();
// помещаем сюда код, который будет запускаться каждые 5000 мс
}
}
Обычно поворотный энкодер имеет как минимум два датчика.
Инкрементные поворотные энкодеры обычно имеют только 2 датчика. Абсолютные или позиционные энкодеры имеют больше возможностей и позволяют определить абсолютную ориентацию датчика, считывая битовую комбинацию.
Чтобы прочитать инкрементный энкодер, вы пишете свой код, обращающий внимание только на попеременные изменения в датчиках. Это дает вам автоматическое устранение дребезга контактов. Предлагаю вам поискать код Arduino для декодирования поворотных энкодеров.
- Управление двигателем Arduino Uno с помощью 2 реле, 2 концевых выключателей и Bluetooth. Вперед Назад Стоп
- Arduino сбрасывается или зависает во время работы, только когда подключены двигатели постоянного тока
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Как устранить шум от вентилятора 12 В с ШИМ-управлением на низкой скорости
- Arduino uno + cnc Shield v3 + драйвер шагового двигателя A4988 + AccelStepper?
- Считывание нескольких поворотных энкодеров
- Как заставить сервопривод вращаться на угол больше 180°
- Почему Adafruit motor shield не крутит моторы?