некоторые моменты я проверил .
Что бы вернуть джойстик … вернул и некоторые параметры .
#define checkBtnPeriod 1
поставил 1 так квк джойстик на 4 и выше очень медленно крутил мотор
1 мсек . это часто но на точность никак не влияет.
убрал костыль …
“”"
delay(2000);
asm volatile(“jmp 0x00”);
“”"
что бы посмотреть что поменялось .
вроде как поменялось . тес ты с прогоном джойстика и без него сделал раз 50
вроде как теперь с первого раза проход например в 16000 шагов двигателя при 12000 мм мин возвращает мотор на ту же позицию
не теряя сотки
такое было со второго и последующих прогонов . а первый раз он мог потерять и десятку . и даже пару мм . поэтому я и поставил легкий ресет .
джойстик вроде без нареканий работает . но есть условия .
я должен джойстиком довести каретку до концевика и когда она отедет от него в ноль могу запускать прогон туда сюда при этом условии ничего не теряется с первого и последующих раз прогонов .
если я не доведу до концевика . результат бывает разный по патерям .
еще условие . если я руками подведу каретку в любое место и отправлю прогон .то тоже будет потеря мм
далее
я забыл проверить без этого параметра
ISR_NOBLOCK*/
позже проверю
вы спрашивали про потери на энкодере . 16000 шагов _1500 тиков и обратно также 16000_0 возврат и сотые мм возвращаются в своё первоначальное состояния
с точностью нормально
дребезга нет
буду думать как руками двигать или джойстиком не доезжая концевика . ведь в принтере и такая задача может быть когда с середины нужно начать печать.
далее я доделаю позже этот код на цифре ведь он уже готов . осталось проверить на пинах 3 сетки 2-3 ведь я проверял позавчера на 1 сетки а там у меня и мой код не заработал .
хотя на аналоговых вполне меня устраивает только уже не приделаешь потэнцеометр дря регулировки оборотов . в коде нужно прописывать .
далее сделал код на цифровых пинах 2-3
работает хорошо .
точность такая же высокая без пропусков
вопросы с джойстиком и концевиком решил
костыль в виде ресета стоит . без него не получается с первого раза прогнать прогон туда сюда .
попробую ваш код применить у себя
меня и ресет устраивает но бывает он раз из десяти не срабатывает.
еще у меня были проблемы с дребезгом но вроде решил их
и иногда после прогонов начинаешь управлять джойстиком а мотор странные звуки издает как будто в резонансе . вроде тоже решил но не уверен - нужны еще тесты
Вот такой простой код получился .
#define enc_A 2
#define enc_B 3
#define STEP_PIN 4
#define DIR_PIN 7
#define ENABLE_PIN 8
#define limitPin 9
#define button1 6
#define button2 5
volatile long temp, motor_position, enc;
int T = 1;
int A = 0;
void setup (){
Serial.begin (115200);
pinMode(enc_A, INPUT_PULLUP);
pinMode(enc_B, INPUT_PULLUP);
pinMode(STEP_PIN, OUTPUT);
pinMode(DIR_PIN, OUTPUT);
pinMode(ENABLE_PIN , OUTPUT);
pinMode(4, INPUT_PULLUP);
pinMode(5, INPUT_PULLUP);
pinMode(6, INPUT_PULLUP);
pinMode(9, INPUT_PULLUP);
attachInterrupt(0, encPinA, CHANGE);
enc = 0;
}
void encPinA() {
if( enc != temp ){
Serial.println (enc);
temp = enc;
}
if (digitalRead(enc_A) == digitalRead(enc_B))
{if (enc < 0; enc--);
(digitalWrite(DIR_PIN , 1), Step());
} else
{(enc++, digitalWrite(DIR_PIN , 0), Step());}
}
void Step() {
digitalWrite(ENABLE_PIN , LOW);
digitalWrite(STEP_PIN , HIGH);
delayMicroseconds(T);
digitalWrite(STEP_PIN , LOW);
motor_position++;
enc = 0;
}
void loop() {
if (!digitalRead(5)) {delay(5);
digitalWrite(8, LOW);}
if (!digitalRead(6)) {delay(5);
digitalWrite(8, HIGH);}
A = analogRead(A4);
if (A > 520) {
digitalWrite(8, LOW);
T = map(A, 520, 1123, 500, 0);
(digitalWrite(DIR_PIN , 1), Step());
}
if (A < 480) {
digitalWrite(8, LOW);
T = map(A, 480, 0, 500, 0);
(digitalWrite(DIR_PIN , 0), Step());
}
if (A > 480 && A < 520) {
(digitalWrite(DIR_PIN , 0), digitalWrite(STEP_PIN, 0));
}
if (!digitalRead(9)) {
digitalWrite(ENABLE_PIN , HIGH);
delay(150);
digitalWrite(ENABLE_PIN , LOW);
digitalWrite(DIR_PIN , LOW);
for (int i = 0; i < 200; i++) {
digitalWrite(STEP_PIN , HIGH);
delayMicroseconds(1000);
digitalWrite(STEP_PIN , LOW);
}
if (!digitalRead(9))
delay(100);
asm volatile("jmp 0x00");
}
}