самое главное: плавный коэф работает именно плавно и дробно?
2. Не проскакивает энкодер-ШД связка?
Будет, если с делеями написан. Можно через millis(), смотреть надо.
Небольшие задержки допустимы временные, по-идее шагами потом догонит.
Для верности можно сделать здесь цикл, выход по замыканию кнопки, без антидребезга. А потом уже какое-то управление, “снаружи”.
Так, например:
void MoveLoop()
{
//в идеале запрет прерываний тут добавить..
enc = motorPos =0; // сбросим в начале движения
//разрешение прерываний добавить..
while(digitalRead(button2)) // пока не нажали эту кнопку, следим-крутим:
{
// Мотор следит за энкодером:
int16_t deltaPos = enc-((int16_t) motorPos * Kmotor);
if(deltaPos>= 1) Step(1); // надо делать шаг +
if(deltaPos<= -1) Step(0); // надо делать шаг -
}
}
void loop() {
if(!digitaRead(KeyStart))
MoveLoop();// по какой-то кнопке запускаем слежение
//здесь можно отключить сам привод, чтобы не грелся
//... здесь добавляем что там ещё надо
}
все работает вроде плавно дробно но еще тесты проведу.
энкодер-ШД связка не проскакивает , я не заметил хотя наблюдал за этим .
подготовил к тестам на печать .
вот там и подобрать Коэф, разглядывая с лупой печать: наплывает или пробел между строками.
даже на профессиональных KIP-3000(5000,7000) на большой длине есть разбег
здесь он интересен только в пределах строки, насколько я понял.
…пока не забыл: надо прикинуть, хватит ли на весь лист счетчика импульсов мотора в int16_t, это 2\15 степени, это 32000грубо.
Поменять на int32_t для верности можно если что. Прикинул: это 40 оборотов энкодера, как-то маловат запас на-глаз.
посмотрим на счетчик .
не могу пока запустить
if(!digitalRead(KeyStart)) // кнопку вписать ?
кнопка button1 подключает двигатели
чтобы пока принтер крутит энкодером , чистит головку итд стол не двигался .
принтер пошел в печать я нажимаю button1 и двигатель подключился .
кнопка button2 она в этом нигде не участвует
пока ни какой реакции что то не так
//Энкодер на пинах 2, 3. Используется внутренняя подтяжка.
// volatile int enc, motor_position;
int16_t enc, motorPos;
float Kmotor = 0.297; //ПОДБИРАЕМ СООТНОШЕНИЕ МОТОР/ЭНКОДЕР
#include <avr/wdt.h> // Библиотека часть компилятора avr-gcc
#define ENABLE_PIN 8
#define limitPin1 9
#define limitPin 10
#define button2 5
#define button1 6
void setup(){
Serial.begin(115200);
pinMode(2,INPUT_PULLUP);
pinMode(3,INPUT_PULLUP);
pinMode(ENABLE_PIN , OUTPUT);
pinMode(5, INPUT_PULLUP);
pinMode(9, INPUT_PULLUP);
pinMode(10, INPUT_PULLUP);
pinMode(6, INPUT_PULLUP);
digitalWrite(ENABLE_PIN, 0); //пока включим драйвер на постоянку, чтобы не было пропусков
PCIFR=PCIF2; PCICR=1<<PCIE2; //разрешить прерывание
PCMSK2=1<<PCINT18 | 1<<PCINT19; //выбрать вход на котором сработает прерывание
}
// uint32_t timer = 0;
// void(* resetFunc) (void) = 0;
const int STEP_PIN = 4;
const int DIR_PIN = 7;
// const int R360 = 200; //шагов на полный оборот
// int T = 10;
// int A = 0;
ISR(PCINT2_vect){
static char EncPrev=0; //предыдущее состояние энкодера
static char EncPrevPrev=0; //пред-предыдущее состояние энкодера
char EncCur = 0;
if(!(PIND & (1 << PD2))){EncCur = 1;} //опрос фазы 1 энкодера
if(!(PIND & (1 << PD3))){ EncCur |= 2;} //опрос фазы 2 энкодера
if(EncCur != EncPrev) //если состояние изменилось,
{ if(EncPrev == 3 && //если предыдущее состояние 3
EncCur != EncPrevPrev ) //и текущее и пред-предыдущее не равны,
{
if(EncCur == 2)
enc++;
else
enc--;
}
EncPrevPrev = EncPrev; //сохранение пред-предыдущего состояния
EncPrev = EncCur; //сохранение предыдущего состояния
}
}
void Step(bool Dir) //шаг в + или -
{
if(Dir) {digitalWrite(DIR_PIN,0); motorPos++; } else {digitalWrite(DIR_PIN,1); motorPos--; } //направление шага
//делаем шаг:
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(1);
digitalWrite(STEP_PIN, LOW);
}
void MoveLoop()
{
//в идеале запрет прерываний тут добавить..
enc = motorPos =0; // сбросим в начале движения
//разрешение прерываний добавить..
while(digitalRead(button1)) // пока не нажали эту кнопку, следим-крутим:
{
// Мотор следит за энкодером:
int16_t deltaPos = enc-((int16_t) motorPos * Kmotor);
if(deltaPos>= 1) Step(1); // надо делать шаг +
if(deltaPos<= -1) Step(0); // надо делать шаг -
}
}
void loop() {
if(!digitalRead(button1))
MoveLoop();// по какой-то кнопке запускаем слежение
//здесь можно отключить сам привод, чтобы не грелся
//... здесь добавляем что там ещё надо
}
Да, свои кнопки вписать конечно. Они у тебя при нажатии в 0 уходят? я на это писал.
Одна - старт, другая - стоп слежения.
Лучше для начала прежний скетч использовать, который точно работает - проверить реальную печать, подобрать Коэф.
А потом уже мелкие добавки, кнопки и тп.
здесь надо button2 поставить, ей останавливать.
(иначе только стартанули сразу отключаем, тк кнопка та же)
Добавил к твоему скетчу вкл-откл привода и кнопки разные на Старт и Стоп:
//Энкодер на пинах 2, 3. Используется внутренняя подтяжка.
// volatile int enc, motor_position;
int16_t enc, motorPos;
float Kmotor = 0.297; //ПОДБИРАЕМ СООТНОШЕНИЕ МОТОР/ЭНКОДЕР
#include <avr/wdt.h> // Библиотека часть компилятора avr-gcc
#define ENABLE_PIN 8
#define limitPin1 9
#define limitPin 10
#define button2 5
#define button1 6
void setup(){
Serial.begin(115200);
pinMode(2,INPUT_PULLUP);
pinMode(3,INPUT_PULLUP);
pinMode(ENABLE_PIN , OUTPUT);
pinMode(5, INPUT_PULLUP);
pinMode(9, INPUT_PULLUP);
pinMode(10, INPUT_PULLUP);
pinMode(6, INPUT_PULLUP);
digitalWrite(ENABLE_PIN, 0); //пока включим драйвер на постоянку, чтобы не было пропусков
PCIFR=PCIF2; PCICR=1<<PCIE2; //разрешить прерывание
PCMSK2=1<<PCINT18 | 1<<PCINT19; //выбрать вход на котором сработает прерывание
}
// uint32_t timer = 0;
// void(* resetFunc) (void) = 0;
const int STEP_PIN = 4;
const int DIR_PIN = 7;
// const int R360 = 200; //шагов на полный оборот
// int T = 10;
// int A = 0;
ISR(PCINT2_vect){
static char EncPrev=0; //предыдущее состояние энкодера
static char EncPrevPrev=0; //пред-предыдущее состояние энкодера
char EncCur = 0;
if(!(PIND & (1 << PD2))){EncCur = 1;} //опрос фазы 1 энкодера
if(!(PIND & (1 << PD3))){ EncCur |= 2;} //опрос фазы 2 энкодера
if(EncCur != EncPrev) //если состояние изменилось,
{ if(EncPrev == 3 && //если предыдущее состояние 3
EncCur != EncPrevPrev ) //и текущее и пред-предыдущее не равны,
{
if(EncCur == 2)
enc++;
else
enc--;
}
EncPrevPrev = EncPrev; //сохранение пред-предыдущего состояния
EncPrev = EncCur; //сохранение предыдущего состояния
}
}
void Step(bool Dir) //шаг в + или -
{
if(Dir) {digitalWrite(DIR_PIN,0); motorPos++; } else {digitalWrite(DIR_PIN,1); motorPos--; } //направление шага
//делаем шаг:
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(1);
digitalWrite(STEP_PIN, LOW);
}
void MoveLoop()
{
//в идеале запрет прерываний тут добавить..
enc = motorPos =0; // сбросим в начале движения
//разрешение прерываний добавить..
digitalWrite(ENABLE_PIN, 0); // включим драйвер на постоянку, чтобы не было пропусков
while(digitalRead(button2)) // пока не нажали эту кнопку, следим-крутим:
{
// Мотор следит за энкодером:
int16_t deltaPos = enc-((int16_t) motorPos * Kmotor);
if(deltaPos>= 1) Step(1); // надо делать шаг +
if(deltaPos<= -1) Step(0); // надо делать шаг -
}
digitalWrite(ENABLE_PIN, 1); // отключим драйвер
}
void loop() {
if(!digitalRead(button1))
MoveLoop();// по какой-то кнопке запускаем слежение
//... здесь добавляем что там ещё надо
}
принтер повел себя как родной как в обычном режиме , ему не сказали что стол поставили ,бумагу назад вперед с бешаной скоростью , стол назад вперед .
без кнопки опасно .
потом приступил к печати но черный закончился .
и напечал цветной тест
правильно супер
сейчас черный заправлю и подолжу тест .
кнопку на мотор нужно что бы в холостую без стола подготавливался. супер
спасибо .
останавливать не надо он сам останавливается .
как у принтера выкидывает напечатанный лист а тут стол вперед выкидывает . правда с бешенной скоростью как и лист
сейчас прикручу кнопки и буду коэфициент ловить
вообще ни какой реакции энкодер мотор не крутит
Делай пока что работает, мелочевку потом.
enc = motorPos =0; // сбросим в начале движения
без этого вроде все заработало . я ее пока закоментировал
а без enc = motorPos =0
кипишь.
попробую встроить
встроить можно но тогда мотор как бешенный если я двигал джостиком
летит на прежнию позицию которую запомнил .
поразбираюсь
Поздравляю. Как говорится: искусство не пропьёшь))
float Kmotor = 0.294; лучше всего и в размер совпадает, 293 пока не буду пробовать пока не распечатаю
A4.
Печатал на первом скече от того я стресс получил
Здесь печатаю так.
Печать началась, вклбчаю если успеваю ардуино, иначе стресс.
Всем спасибо огромнейшее , одна голова хорошо но форум лучше .
там много работы впереди и кнопки и сброс позиции и концевик датчик бумаги
еслибы на двух концах не стояли лимиты то стол бы вылетел .
надо что то думать .