как сделать? Ш Д по таймеру
- Войдите на сайт для отправки комментариев
Чт, 22/10/2020 - 15:15
Ребята тут стала такая необходимость сделать устроиство , чтоб ШД работал по таймеру и задавлись обороты кнопками , я не прогер от слова вообще только начал в виду необходимости вникать, но то что ШД и таймер используют для работы (TIMER 0) меня ввело в полный ступор помогните :) пожалуйста
тут стала такая необходимость сделать устроиство
закажи за деньги, коли сам ни в зуп ногой.
вот вот , в них та курвах и вся проблемма, точнее в их отсутствии
А сколько планируешь заработать на этом проекте?
это мой личный проект в смысле для себя(не комерческий) он очень длинный а эта часть конкретный затык в остальном идут к нопки , реле по времени но с этим думаю разберусь както через пень колоду, но думаю осилю
вот вот , в них та курвах и вся проблемма, точнее в их отсутствии
Т.е. отсутствуют и знания, и деньги? Нет ни того, ни другого? Правильно?
Ну тут явно проблема в трате времени на ерунду, когда нужно работать.
ну как то так, но есть желание, и по тихоньку пытаюсь вникать в тему, я понимаю все что можно потрогать руками, гайки сварку и т.д , что не могу потрогать (программа) для меня это тяжело в понимании
можно пожалуйста точное определение слову работать?
Опять веселие намечается, что ли?
а как без этого , обгадить кого нибудь , поплевать, надо ж на ком то свое самолюбие потешить
а как без этого , обгадить кого нибудь , поплевать, надо ж на ком то свое самолюбие потешить
это мы тебе завсегда пожалуйста...
А вот код писать тебе придется самому...
а никто и не говорит что напишите за меня ,тут вопрос как ? в смысле (используется один и тот же таймер для обеих вещей , или я чтото не допонимаю?
используется один и тот же таймер для обеих вещей , или я чтото не допонимаю?
каких "обеих" ?
шаговик как я понял для работы использует (TIMER 0) и реле времени(таймер) использует (TIMER0) или их можно как то перераспределить на разные таймера?
шаговик как я понял для работы использует (TIMER 0)
вы как что-то пишете - сразу указывайте, откуда вы это взяли - быстрее будет
Шаговиком можно управлять с любого таймера, не обязательно нулевого... можно и вообще без таймера.
просто во всех примерах которые я встречал используется таймер исполль зоваться будет STEP DIR сигналы
просто во всех примерах которые я встречал используется таймер исполль зоваться будет STEP DIR сигналы
и везде - таймер0 ? - не верю
а регулировка оборотов осуществляется за счет импульсов (прерываний таймера ) я правильно понимаю?
но судя по настройкам CLSK 0 'это настройки таймера 0 ? надеюсь правильно написал абривиатуру
а регулировка оборотов осуществляется за счет импульсов (прерываний таймера ) я правильно понимаю?
откуда я знаю, как она у вас осуществляется? Я уже написал. что вариантов не один и не два.
неужели трудно набрать в гугле что-нить типа "ардуино и шаговый мотор" ?
Без дополнительных приказов таймер0 не управляет никаким ШД. Он даже не знает, что это такое.
так набирал правда в тындыксе думаю разница не существенна
так и я о чем :))))
"столбы повреждают автомобили только в порядке самообороны" (с)
так набирал правда в тындыксе думаю разница не существенна
ну как сказать... любителей ардуино в мире раз в 100 больше, чем в РФ. Соответственно и результатов в гугле и яндексе
так набирал правда в тындыксе думаю разница не существенна
ну как сказать... любителей ардуино в мире раз в 100 больше, чем в РФ. Соответственно и результатов в гугле и яндексе
ну так тактовая частота , Т.Есть задающая для определения скорости оборотов использует таймер?
попробую с этой стороны зайти , мож найду ответ что и от чего
Если напишете в коде, то будет использовать. А так - этим железкам до фени работа. Абсолютли.
А вот еще проблема: полез в таймеры, когда даже самых основ программирования не умеешь. Опять неправильная расстановка приоритетов.
на сегодняшний день спасибо всем! но вопросов будет еще куча
Опять веселие намечается, что ли?
Готовимся к завтрашней пятнице :-)
вопросов будет еще куча
Приятно слышать.
Оттачиваем сарказм на зафтра.
Ребята тут стала такая необходимость сделать устроиство , чтоб ШД работал по таймеру и задавлись обороты кнопками , я не прогер от слова вообще только начал в виду необходимости вникать, но то что ШД и таймер используют для работы (TIMER 0) меня ввело в полный ступор помогните :) пожалуйста
Та бери дорогой, не стесняйся. ШД, как просил, только обороты я енкодером меняю. Извини шо не кнопками, так получилось...
#include "Encoder.h" #define DRV_DIR_PIN 12 #define DRV_STEP_PIN 9 #define DRV_ENABLE_PIN 10 #define DRV_BUTTON_PIN 7 #define ENCODER_PIN2 11 #define ENCODER_PIN1 8 #define LED_PIN A3 #define LED_PIN_NUM ARDUINO_PIN_NUM(LED_PIN) #define LED_PORT ARDUINO_PORT(LED_PIN) #define ENCODER_INPUT_PORT ARDUINO_PIN(ENCODER_PIN1) #define ENCODER_INPUT_PIN1 ARDUINO_PIN_NUM(ENCODER_PIN1) #define ENCODER_INPUT_PIN2 ARDUINO_PIN_NUM(ENCODER_PIN2) ENCODER2<ENCODER_INPUT_PIN1, ENCODER_INPUT_PIN2> enc(0); #define DRV_DIR_HIGH digitalWrite(DRV_DIR_PIN, HIGH); #define DRV_DIR_LOW digitalWrite(DRV_DIR_PIN, LOW); union COLOR { struct { byte GREEN; byte RED; byte BLUE; }; byte Color24[3]; }; #define RGB(r,g,b) {(g),(r),(b)} extern "C" { void OutFrame(COLOR* buf, word len) { asm volatile ( "push r24 \n\t" "push r25 \n\t" "push r26 \n\t" "push r27 \n\t" "push r28 \n\t" "push r29 \n\t" "movw r28, %[ptr] \n\t" //загрузка Y "movw r26, %[L] \n\t" "add r26,r28 \n\t" "adc r27,r29 \n\t" "cli \n\t" // вывод первого бита "aa: ld r24, Y+ \n\t" //инициализация отправки первого байта "ldi r25, 8 \n\t" "bb: sbi %[PP], %[pin] \n\t" //1 цикл линию в высокий уровень "nop \n\t" "nop \n\t" "sbrs r24, 7 \n\t" //проверка бита и скачек на +2 "cbi %[PP], %[pin] \n\t" //0,375us линию в низкий уровень "lsl r24 \n\t" //1 цикл сдвиг в лево "nop \n\t" "nop \n\t" "cbi %[PP], %[pin] \n\t" //1 цикл 0,5us линию в низкий уровень "nop \n\t" "nop \n\t" "dec r25 \n\t" //1 цикл "brne bb \n\t" // 1 цикл без перехода и 2 с переходом //байт выведен проверяем завершение и переходим к следующему "cpse r28, r26 \n\t" //1 цикл проверка Y на конец массива "rjmp aa \n\t" //2 цикла "cpse r29, r27 \n\t" //1 цикл проверка Y на конец массива "rjmp aa \n\t" //2 цикла "sei \n\t" "pop r29 \n\t" "pop r28 \n\t" "pop r27 \n\t" "pop r26 \n\t" "pop r25 \n\t" "pop r24 \n\t" : :[ptr] "r" (buf) , [L] "r" (len), [PP] "I" (_SFR_IO_ADDR(LED_PORT)), [pin] "I" (LED_PIN_NUM) ); } } ISR(PCINT0_vect) { enc.Interrupt(); } #define ENC_MAX_VAL 117 uint16_t GetDurationPulse(uint8_t N) { return 200+5*N+((uint16_t)(N*N)>>4); } volatile uint16_t SpeedICR; volatile uint16_t pulse_cnt; volatile uint8_t SteperFl; volatile uint8_t fl; volatile uint8_t start_cnt; void SetTimer(uint16_t t) { cli(); for(;TCNT1>t-3;) { sei(); cli(); } SpeedICR=t-1; if((SpeedICR>ICR1) || (SpeedICR>700)) //тормозим или медленно { ICR1 =SpeedICR; // OCR1B=ICR1; fl|=4; } else { fl|=4; } sei(); } void Rotation(bool f) { if(f) { if(!(fl&8)) return; //уже вращаемся cli(); if(SpeedICR<700) //нужен разгон { ICR1=700; //стартуем на такой скорости } fl&=~8; //флаг останова сняли } else fl|=8; fl|=4; //флаг актуализации взвели sei(); } //выполнить заданное количество шагов с заданой скоростью, если требуется то и с разгоном void SetCountPulse(uint16_t p, uint16_t v) { pulse_cnt = p; SetTimer(v); Rotation(true); } ISR(TIMER1_COMPA_vect) { static uint16_t c; c++; if(c==400) { c=0; SteperFl=1; } if(pulse_cnt) { pulse_cnt--; if(!pulse_cnt) //нужное число шагов выполнено, остановка { fl|=4|8; } } if(fl & 4) //обработать флаги { fl &= ~4; //выполняем однократно if(fl & 8) //останов { OCR1B=0; //нет тока start_cnt=0; } else //пуск { start_cnt=5; //кол-во тактов для разгона OCR1B=ICR1; //есть ток разгона } if(fl & 1) //смена направления { DRV_DIR_HIGH; } else { DRV_DIR_LOW; } } if(start_cnt) { start_cnt--; if(!start_cnt) { if(ICR1>SpeedICR) { uint16_t i; if(ICR1-SpeedICR>20) i=10; //ограничение ускорения else i=1; ICR1-=i; OCR1B=ICR1; start_cnt =2; } else OCR1B=ICR1; } } } void setup() { // put your setup code here, to run once: pinMode(DRV_DIR_PIN, OUTPUT); pinMode(DRV_STEP_PIN, OUTPUT); pinMode(DRV_ENABLE_PIN, OUTPUT); pinMode(LED_PIN, OUTPUT); COLOR c; c=RGB(0xff, 0, 0); OutFrame(&c,3); pinMode(ENCODER_PIN1, INPUT_PULLUP); pinMode(ENCODER_PIN2, INPUT_PULLUP); pinMode(DRV_BUTTON_PIN, INPUT_PULLUP); enc.SetMaxValue(ENC_MAX_VAL); enc.Run(); //Режим 10 Phase Correct TCCR1A=1<<COM1A0 | 1<<COM1A1 | 1<<COM1B0 | 1<<COM1B1 | 1<<WGM11; //подключить выход OC1A первого таймера WGM11=1 WGM10=0 WGM13=1 WGM12=0 uint32_t ocr; TCCR1B=3|(1<<WGM13); // 64 4usec ICR1=GetDurationPulse(1); OCR1A=5; OCR1B=200; TIMSK1 |= (1 << OCIE1A); Rotation(false); //стоп Serial.begin(9600); Serial.println("StepPump"); } #define BTN_TIME_CLICK 4 //4*80=60msec #define BTN_TIME_LONG 40 //40*20=800msec #define BTN_TIME_PAUSE 10 //10*20=200msec enum BTN { PRESS, //удерживается нажатой короткое время, 1 раз на нажатие LONG_PRESS, //удерживается нажатой длинное время, 1 раз на нажатие CLICK, //отпущена после нажатия в течении времени больше короткого но меньше длинного, 1 раз на нажатие DONE, //нажата, 1 раз на нажатие UP, //отпущена но не CLICK и не DBLCLICK, 1 раз на нажатие PRESSED, //удерживается нажатой, но не PRESS, не LONG_PRESS и не DBLPRESS, ***** многократно TOP, //не нажата, ***** многократно DBLPRESS, //повторно нажата и удерживается нажатой короткое время, 1 раз на нажатие DBLCLICK, //повторный CLICK, ранее был CLICK с паузой менее заданой, 1 раз на нажатие ONE_CLICK //отпущена и истекла пауза для повторного нажатия, 1 раз на нажатие }; uint8_t GetBtnCmdLow(uint8_t scan = false) { static uint8_t b_old; uint8_t b; if(scan) { b=bit_is_set(ARDUINO_PIN(DRV_BUTTON_PIN), ARDUINO_PIN_NUM(DRV_BUTTON_PIN)); // digitalRead(DRV_BUTTON_PIN); if(b_old!=b) { b_old=b; return b?BTN::UP:BTN::DONE; } } return b_old?BTN::TOP:BTN::PRESSED; } uint8_t GetBtnCmd() { static uint8_t t; static uint8_t btn_press; static uint8_t FlDBL; uint8_t i; uint8_t r; t++; i=t-btn_press; r=GetBtnCmdLow(true); switch(r) { case BTN::UP: //отпускание if((i<BTN_TIME_LONG) && (i>=BTN_TIME_CLICK)) { btn_press=t; r=FlDBL?BTN::DBLCLICK:BTN::CLICK; FlDBL=!FlDBL; } break; case BTN::DONE: btn_press=t; break; //обнаружено нажатие case BTN::TOP: // не нажата if(i>BTN_TIME_PAUSE) { if(FlDBL) r=BTN::ONE_CLICK; FlDBL=false; } break; case BTN::PRESSED: //удерживается нажата if(i==BTN_TIME_CLICK) return FlDBL?BTN::DBLPRESS:BTN::PRESS; if(i==BTN_TIME_LONG) return BTN::LONG_PRESS; break; } return r ; } void loop() { uint8_t n; static uint8_t n_old; uint16_t p; static uint8_t takt; static uint8_t mode; uint8_t t=millis(); n=enc.Get(); if(n!=n_old) { n_old=n; if(GetBtnCmdLow()==BTN::PRESSED) //вращение при нажатой { if(mode==0) { mode=1; Rotation(false); //стоп enc.SetMaxValue(14); enc.SetValue(7); n=8; } } else { p=GetDurationPulse(ENC_MAX_VAL+1-n); // Serial.println(p); SetTimer(p); } } if(uint8_t(t-takt)>=20) { takt+=20; COLOR c; if(mode==1) { long int L; if(n>7) n=n-8; //0-6 L=0; if(!(n&1)) L|=0xff; if(!(n&2)) L|=0xff00; if(!(n&4)) L|=0xff0000; OutFrame((COLOR*)&L,3); if(GetBtnCmd()==BTN::TOP /*UP 18.04.2020*/) { mode=0; enc.SetMaxValue(ENC_MAX_VAL); enc.SetValue(0); n_old=0; if(n!=7) { SetTimer(200+n*150); } fl&=~2; } return; } if(SteperFl) { c = RGB(0,ENC_MAX_VAL+1-n,fl & 2?0:n); SteperFl=0; } else c = RGB(fl & 1?0x10:0, 0, fl & 2?0:0x10); OutFrame(&c,3); n=GetBtnCmd(); switch (n) { case BTN::DONE: Rotation(false); //стоп break; case BTN::LONG_PRESS: fl^=1;//реверс fl&=~2; fl|=4; break; case BTN::ONE_CLICK: fl^=2; //старт-стоп Rotation(fl&2); break; case BTN::DBLCLICK: SetCountPulse(1000, 700); break; } } if(Serial.available()) { if(Serial.read()==' ') SetCountPulse(200, 700); } }в 280 строке константа не та, подсовываешь непроверенный код )))
не проверенный так проверим :) ну хотя бы по коду попробую разобраться что на что влияет ,
не проверенный так проверим :) ну хотя бы по коду попробую разобраться что на что влияет ,
то-есть, даже с арифметикой не в ладах
так я его еще не читал, дома буду читать, ща на работе ,дома интернета нет, а с арифметикой порядок :)
так я его еще не читал, дома буду читать, ща на работе ,дома интернета нет, а с арифметикой порядок :)
это наврядли, глянь, строка 280 не смутила?
смутить то смутила но еще не разобрался в чем непорядок, в самой сумме или в множителе а как следствие сумме , Т,Е либо 320 либо нолик потеряли и должно быть 3200 думаю электронный макет даст определенность этого вопроса , а в остальном нужно будет дома внимательно просмотреть , мож еще где то бяка сидит
а говорил с арифметикой у тебя зашибись ))) _
#define BTN_TIME_CLICK 4 //4*80=60msec4х80=320 и что не правильно посчитал?
4х80=320 и что не правильно посчитал?
а там что написано?
ну так сразу же я и написал что с суммой не порядок
в 280 строке константа не та, подсовываешь непроверенный код )))
Код рабочий. Прям с насоса. Мои коменты - шо хочу, то пишу. Можешь себе в коментах написать что ты думаеш о моих коментах)))
ПС. это же надо как пристально изучал, аж в 280-й строке в коментах опиську найти )))) При том отсутствие либки на энкодер никого не смутило ;)
в 280 строке константа не та, подсовываешь непроверенный код )))
Код рабочий. Прям с насоса. Мои коменты - шо хочу, то пишу. Можешь себе в коментах написать что ты думаеш о моих коментах)))
ПС. это же надо как пристально изучал, аж в 280-й строке в коментах опиську найти )))) При том отсутствие либки на энкодер никого не смутило ;)
Логик, это особенности психики, код ваабще не изучал, мельком глянул, максимум одну секунду и, нисколько не сомневаюсь, что он рабочий...ТС... просто потролю маленько, это жеж он говорит, что с математикой хорошо...если число 60 правильное, то должно было быть 3, а не 4, а если с четвёркой работает. значит там должно быть 80 )))
PS это просто визуальная память на цифры, я жеж говорю, в юности матрицу булевых уравнений >20 на >20 решал в уме секунд за 20-30...
Та ладно, оправдываться! Я денег не беру за изучение ;)
Та ладно, оправдываться! Я денег не беру за изучение ;)
да не, я более 100 строк не одолеваю ...
PS написал тут на досуге аж на 900 строк, теперь поправить...по вновь открывшимся обстоятельствам ...надо кого-то просить, не удерживаю в голове, что от чего и как зависит )))