Настройка потенциометра для работы мотора
- Войдите на сайт для отправки комментариев
Чт, 06/09/2018 - 21:22
Всем привет. Не могу настроить потенциометр управления моторчиком так, чтобы при малейшем повороте вправо мотор начинал крутиться с минимальной скорость, а при выкручивании доконца мотор набирал скорость 100%
У меня получается два варианта: либо мотор стартует с середины указателя потенциометра при значении ШИМ 185 и набирает 100% скорости при максимально выкрученном потенциометра, либо
к нулевому значению я прибавляю значение чуть меньше 185 (к примеру 175), то мотор начинает крутиться при небольшом повороте потенциометра, но на середином положении мотор уже набирает скорость 100%. Подскажите, как мне осуществить задумку, я только начал осваивать arduino
const int input3 = 2; //переменная на драйвер мотора L293D контакт input3, разъем D2 на arduino const int input4 = 3; //переменная на драйвер мотора L293D контакт input4, разъем D3 на arduino const int enable2 = 5; //переменная на драйвер мотора L293D контакт enable2, разъем D5 на arduino. числом управляем скоростью мотора #define pot A0 //переменная pot для потенциометра b10k, разъем A0 void setup() { Serial.begin(9600); pinMode(input3, OUTPUT); //инициализируем in3 как выход pinMode(input4, OUTPUT); //инициализируем in4 как выход pinMode(enable2, OUTPUT); //инициализируем en2 как выход pinMode(pot, INPUT); //инициализируем pot как вход } void loop() { int x = analogRead(pot); //задаем переменную x, данные с потенциометра 0-1023 int y = map(x, 0, 1023, 0, 255); //задаем переменную y(x) в пределах 0-255 int z = y+175; //при значении z=185-190 мотор начинает крутиться. digitalWrite(input3, HIGH);//направление вращения мотора digitalWrite(input4, LOW);//направление вращения мотора // if (y>135) // { analogWrite(enable2, z); // } if (y<11) { analogWrite(enable2, 0); } if (z>255) { analogWrite(enable2, 255); } Serial.print("x="); Serial.print(x); Serial.print(" y="); Serial.println(y); delay(200); }
Скорее всего Вам нужно взять потенциометр с правильной характеристикой (taper). У Вас какой? Поди логарифмический? Ну или программно её исправлять.
Я взял B10K он линейный. Дело в том, что при ШИМ <185 мотор жужжит, но не крутится
Да и мотор тоже "логарифмический". Вы что думаете что скорость прямопропорционально напряжению на нем или скважности. Опять же скорость может проседать от большой нагрузке (моменте) на моторе. Особенно если напряжение пониженое.
Вот это не поможет: map(x, 0, 1023, 185, 255); ?
а мотор ваш подходит к драйверу (или наоборот) ?
Если речь про DC-моторчик, то у него обратно-линейная характеристика скорости вращения от момента на валу: чем больше нагрузка (трение в т.ч.), тем меньше скорость. Есть т.н. "останавливающий момент" при котором скорость на валу 0.
Также, тяговый момент у него линейно зависит от тока, подаваемого на мотор. Чем больше ток - тем больший момент он может преодолеть на одной скорости. Для одного и того же момента на валу, ток мотора прямо и линейно зависит от напряжения на нем.
Якорь мотора + редуктор + исп. механизм обладают определенной инерцией к изменению скорости вращения. Она может быть достаточно велика, в миниуме - у меня получалось что-то около 16мсек для типового 130-го мотора с Али.
И последнее: ШИМ, подаваемый на мотор это периодический сигнал. Включено/выключено. Он конечно в значительной степени интегрируется конденсатором мотора, но не совсем.
Отсюда, если Вы хотите управлять скоростью мотора, требуется понимать что при изменении нагрузки значение ШИМ должно быть РАЗНЫМ. В частности, это относится к моменту трогания с места. И ещё: чем выше частота ШИМ, тем ХУЖЕ управляется мотор, особенно на "малых оборотах". Как ни странно.
Соответственно, если Вы хотите "стартовать" с меньшего ШИМ - попробуйте снизить его частоту. Далее, если Вы хотите управлять мотором ЛИНЕЙНО, потребуется снять его характеристику в рабочем состоянии (под нагрузкой) и уже по ней преобразовывать положение резистора в величину ШИМ. Небольшая табличка будет лучше справляться с задачей чем map().
Както в РУ машинке делал при пуске на 10мс 100% а потом плавненько поднимал.
Тела находящиеся в спокойствии ленивые и им надо дать пинка - физика блин...
Или ввести обратную связь по оборотам + регулятор
Мужики то ли я вас не понимаю, то ли вы не поймете, что я хочу :)
Мне нужно помочь с кодом. У меня обычный DC-моторчик от игрушек на 5V. Задумка такая:
Изначально у меня был такой простой код
Экспериментальным путем когда я крутил потенциометр и наблюдал значения X и Y в мониторе порта я выяснил, что при значении Y меньше 185 моторчик жужжит, но не крутится. А при значении Y=185 он начинает крутиться и скорость его возрастает до максимальной при значении Y=255. Как-то не прикольно было выкручивать наполовину потенциометр, чтобы он начал работать, а хотелось, чтобы я повернул чуть чуть ручку потенциометра (например на значение Y=10), а программа уже подставила в значение Y=185. А далее когда я продолжал выкручивать потенциометр, то значение Y росло плавно, параллельно оставшимся значениям на потенциометре.
Я как собака представляю как это нужно написать, но не могу подобрать слова, мучаюсь два дня. Не хватает у меня знаний, поэтому прошу помощи у вас
Вот здесь же Вам всё написали: #4
Вот здесь же Вам всё написали: #4
Поначалу не сработало, но потом поковырялся и все получилось!
Теперь код выглядит таким образом
Если кто-нибудь напишет как правильнее написать, буду признателен :)
Вас наверное еще сюрприс будет ждать в виде того что при нагрузке на валу он и со 185 не тронется:)
Обратная связь нужна...
Точно, ждет :) Потом я буду использовать 24V DC-motor и блок питания для него. Ну и стартовое значение ШИМ подкорректирую под него. Спасибо
А что Вы имеете ввиду под обратной связью? Стало интересно
Энкодер, например. Любой датчик, который сможет сигнализировать, что мотор тронулся и крутится.
прямо сказать, не верно тестирование игрушка мотор и далее заменить на большой мотор. Будете иметь плохой опыт
Плохой опыт - это тоже хорошо. Если не совершать ошибок, то нельзя и научиться их преодолевать.