ilalexey, в драйвере A3949 реализовано три алгоритма торможения (честно говоря это мой вольный перевод) 1)Brake (slow decay) медленное торможение ( ток частично идёт через диоды) 2,4,8 состояния по диаграммам 2) Fast decay SR (synchronous rectification) быстрое торможение (ток идёт через два нижних транзистора) 3,9 состояния по диаграммам 3) Fast decay SR быстрое торможение с зарядом батареи (ток течёт в направлении батареи, остальное естественно не реализовано) - шестое состояние по диаграммам.
Добавлено спустя 1 час 51 минуту 45 секунд: Я вот что ещё подумал.
А если попробовать такой алгоритм. 1) даём ШИМ 70% (т.е. заведомо большой ток, чтобы быть уверенным что мы стронулись с места) 2) ждём какое то количество микро секунд. 3) тормозим. 4) ждём какое то количество микро секунд. 5) смотрим положение сместились или нет. (abs(position-target) ) 6) если нет, прыгаем на первый шаг
Это должно быть примерно тоже самое что один шаг у шагового двигателя. если период импульсов step будет больше периода на шаге 2+4, всё должно работать. Нужно будет только подобрать временные константы. Начать нужно с частоты шим.
Конечно щёткам на двигателе будет не сладко. Но это в любом случае при таком способе управления. Чтобы уменьшить помехи обязательно нужно зашунтировать двигатель маленьким керамическим конденсатором, где то на вики кажется про это было.
Кстати, кажется в коде ошибка:
//super primitive control of the motor. if (position > target) { digitalWrite(MOTOR_DIR_PIN, HIGH); analogWrite(MOTOR_SPEED_PIN, motor_speed); } else if (position < target) { digitalWrite(MOTOR_DIR_PIN, LOW); digitalWrite(MOTOR_SPEED_PIN, motor_speed); } else { digitalWrite(MOTOR_SPEED_PIN, LOW); }
должно быть else if (position < target) { digitalWrite(MOTOR_DIR_PIN, LOW); analogWrite(MOTOR_SPEED_PIN, motor_speed); }
Добавлено спустя 25 минут 7 секунд: Я бы лучше поставил энкодер на вал двигателя, зная передаточное число можно будет привести к положению на выходе редуктора. В этом случае нагрузка на контроллер конечно будет больше.
За то на один шаг мы получим n импульсов с энкодера. допустим передаточное число N=10, т.е. за 10 оборотов двигателя редуктор поворачивает на один оборот допустим нам нужна точность 0,5градуса, чтобы сделать один оборот редуктора нужно 360/0,5=720 шагов (сигналов step) . за один шаг редуктора, ротор мотора должен повернуться на 0,5*10=5градусов, при этом энкодер выдаст 5градусов/0,35градусов=14 импульсов. Это уже кое что, в смысле за 14 импульсов можно рассчитать начальную и конечную точку в шаге. При этом точно контролировать когда жать на тормоз. Но писать нужно не на языке ардуино а на чистом СИ. Одна функция digitalwrite чего стоит! (в смысле очень медленная, есть тесты производительности)
Добавлено спустя 3 минуты 1 секунду: Тут может получиться так что atmega не будет успевать за импульсами step, нужно всё очень точно рассчитывать. Какая максимальная скорость должна быть у сервомотора на выходе? т.е. на выходе редуктора.
R3 forum87/topic15337.html R2 roboforum.ru/forum102/topic13980.html R4 roboforum.ru/post336339.html#p336339 Делать надо хорошо - плохо получится само!
Редуктор получается такой: 1) G6_G5 ... 48/20=2.4 2) G4_G3 ... 44/18=2.444444 3) G2_G1 ... 40/16=2.5 итого 14.666666 : 1 у нас имеется энкодер на 1024 позиции и 360гр. Что дальше с этими цифрами делать пока не решил. >Я бы лучше поставил энкодер на вал двигателя В том-то и затея - хотел баги редуктора обойти, чтобы на выдаче было больше чем позволяет шаговик. Я с этим єткодером ещё и сглупил на лишние 70грн. Узнал, что существует as5045 с разрешением 4096 позиций. Купил и впаял, а чтоб даташит поштудировать ума не хватило. Кинулся кабель подключать, а у 45й-то 3 и 4 нога "нот коннектед" оказывается Скорость, в данной ситуации, не так важна в принципе. В репликаторЖ шаговики комфортно живут на 68 едениц. Что это за еденицы, какой эквивалент чего с чем хз. По секундомеру не засекал, так что это для меня пока абстракция.
>хотел баги редуктора обойти, не понял, что значит обойти?
>В репликаторЖ шаговики комфортно живут на 68 едениц. Что это за еденицы, какой эквивалент чего с чем хз. обычно скорость подачи определяется как мм/сек, нужно выяснить. скорость двигателя может быть разной, всё зависит от конструкции передачи. Редуктор потом тоже что то будет вращать? шпильку или ремень?
R3 forum87/topic15337.html R2 roboforum.ru/forum102/topic13980.html R4 roboforum.ru/post336339.html#p336339 Делать надо хорошо - плохо получится само!
>не понял, что значит обойти? Размышлял так: энкодер даёт информацию о конечном положении вала, значит имея шестерни с люфтом, мы получим конечное положение вала в нужном месте. >Редуктор потом тоже что то будет вращать? шпильку или ремень? зависит от результата(если он будет конечно). скорее всего это будет маленький червячёк. Как я ранее говорил, это на четвёртую ось(формы вращения диаметром до 50-60мм) затея была.
Добавлено спустя 3 минуты 49 секунд: >обычно скорость подачи определяется как мм/сек точно 68 не мм/сек. в 5мин больше похоже
>Размышлял так: энкодер даёт информацию о конечном положении вала, значит имея шестерни с люфтом, мы получим конечное положение вала в нужном месте. а как быть с инерцией? и при торможении люфт всё равно даст о себе знать только в обратном направлении.
Попробуй для начала просто точно повернуть выходной вал редуктора, хотя бы на 1 шаг. Т.к. кроме люфта, есть ещё переходной процесс, даже если всё работает идеально, с момента сигнала step до реального перемещения происходит какое то время. За это время другие двигатели тоже сместятся, в результате фреза может быть не на том месте, где рассчитывала программа.
R3 forum87/topic15337.html R2 roboforum.ru/forum102/topic13980.html R4 roboforum.ru/post336339.html#p336339 Делать надо хорошо - плохо получится само!
твой код заливал - ещё хуже ведёт себя. назад вообще перестаёт ехать, стоит и шкварчит. раньше зум шёл. Скоростон кареток на шаговых осях 1.14мм/сек.(50мм/44сек)
и я вернул else if (position < target) { digitalWrite(MOTOR_DIR_PIN, LOW); analogWrite(MOTOR_SPEED_PIN, motor_speed); }
назад он тоже должен использовать шим, иначе смысл управления теряется. если использовать digitalWrite(MOTOR_SPEED_PIN, motor_speed); то контроллер включит задний ход на полную мощность, если motor_speed>0.
R3 forum87/topic15337.html R2 roboforum.ru/forum102/topic13980.html R4 roboforum.ru/post336339.html#p336339 Делать надо хорошо - плохо получится само!