Ох уж эти прерывания

KOMAPbI4
KOMAPbI4 аватар
Offline
Зарегистрирован: 22.03.2016
[code]
#define STEP  7
#define DIR   6
#define En_5V 9 
double   s = 12;
 
void setup() {
  pinMode(STEP, OUTPUT);
  pinMode(DIR, OUTPUT);
  pinMode(En_5V,OUTPUT);
}
 
void MotorBegin(double Step,boolean dirMotor) 
{
  s = s -0.01;
  if (s < 5) s = 5; 
  
  digitalWrite(DIR, dirMotor);   
  for (float i = 0; i < Step; i++)
  {
     digitalWrite(STEP, HIGH);
     delayMicroseconds(s*(s*1.58));
     digitalWrite(STEP, LOW);
     delayMicroseconds(s*(s*2));
     digitalWrite(En_5V, HIGH);
  }   
}
void loop()
{
  MotorBegin(s,0);
}
 
[/code]
 
Собственно на LCD нужнужно вывести значение переменной 's' сильно не пинайте начанающий я 
jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а где тут прерывания?

KOMAPbI4
KOMAPbI4 аватар
Offline
Зарегистрирован: 22.03.2016

jeka_tm пишет:

а где тут прерывания?

так вот и надо кудато их (прерывания) впихнуть , а у меня с этим пока ни чего не получается

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

опиши что ты хочешь получить. я не очень понял. только подробно

KOMAPbI4
KOMAPbI4 аватар
Offline
Зарегистрирован: 22.03.2016

ок 

На LCD нужно выводить значения переменной s, и что б при этом двигатель не тормозил . Так сказать запаралелить процесс управления двигателем и процесс вывода значения переменной на LCD , а на данный момент (насколько я понимаю) процесс работает последовательно и из за этого наступают сбои в работе шагового двигателя 

axill
Offline
Зарегистрирован: 05.09.2011

в данном случае я бы сделал обработчик прерывания по таймеру, например timer2 и туда вставил код управления шаговиком, тогдк шаговик будет работать с четко заданными интервалами времени

в LCD в loop() как обычно

Logik
Offline
Зарегистрирован: 05.08.2014

В коде плохо все. От double   s = 12; до вставки в сообщение, все плохо. Начните заново. Вы пишите про сбои при выводе на экран, а в коде вывода нет. И экрана тоже нет. Это вобще как? 

KOMAPbI4
KOMAPbI4 аватар
Offline
Зарегистрирован: 22.03.2016

                             //Запуск Шагового двигателя под драйвером ST330 c шагом в 1/2
#define STEP  7   //Шаг
#define DIR   6    //Направление
#define En_5V 9 //Инициализация  ST330
double   s = 12;

 #include <Wire.h> 
 #include <LiquidCrystal_I2C.h>
 LiquidCrystal_I2C lcd(0x27,16,2);

 //Инициализация пинов и LCD
void setup() {
  pinMode(STEP, OUTPUT);
  pinMode(DIR, OUTPUT);
  pinMode(En_5V,OUTPUT);

  lcd.clear();                           
  lcd.init();                            
  lcd.backlight();

}
// Ускорение скорость и направление
void MotorBegin(double Step,boolean dirMotor) 
{
  s = s -0.01;
  if (s < 5) s = 5; 
  
  digitalWrite(DIR, dirMotor);   
  for (float i = 0; i < Step; i++)
  {
     digitalWrite(STEP, HIGH);
     delayMicroseconds(s*(s*1.58));
     digitalWrite(STEP, LOW);
     delayMicroseconds(s*(s*2));
     digitalWrite(En_5V, HIGH);
  }   
}

//Тело
void loop()
{
  MotorBegin(s,0);
  lcd.setCursor(0, 0);
  lcd.print(s);
}
/*
На LCD нужно выводить значения переменной s, и что б при этом двигатель не тормозил . Так сказать запаралелитьпроцесс управления двигателем и процесс вывода значения переменной на LCD , а на данный момент (насколько я понимаю) процесс работает последовательно и из за этого наступают сбои в работе шагового двигателя
                                    Если закоментить// lcd.setCursor(0, 0);
                                                     //lcd.print(s);
- то все работает прекрасно */

 

 

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

Во-первых, digitalWrite(En_5V, HIGH); необходимо унести в setup(), насколько я понимаю. И digitalWrite(DIR, dirMotor);, похоже, тоже - Вы же не меняеете напрвление нигде.

Ищите тему, тут уже полно описаний как сделать управление по таймеру: надо ногами "двигателя" управлять из прерывания таймера. У уберите вещественные значения, перейдите на целочисленный с коэффициентом 1024, например. Вещественные числа авркам считать напряжно, а кратные степени двойки - на ура.

Клапауций 322
Offline
Зарегистрирован: 31.12.2015
KOMAPbI4
KOMAPbI4 аватар
Offline
Зарегистрирован: 22.03.2016

Ухожу в прерывания с головой ))

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

Не нужно прерываться. Любая многозадачность это быстрое переключене между задачами. Дело в том что у Вас экран печатается в каждом цикле, это очень много, ведь частота то 16 МГц. Нужно определиться как часто нам нужно обновлять эту s. ну допустим раз в секунду. тогда пишем

                        //Запуск Шагового двигателя под драйвером ST330 c шагом в 1/2
#define STEP  7   //Шаг
#define DIR   6    //Направление
#define En_5V 9 //Инициализация  ST330
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
float   s = 12.00; //вместо double (это одно и тоже)
unsigned long update_time=millis(); //переменная времени последнего обнавления экрана
const unsigned long update_period=1000; // частота обновления в миллисекундах
//Инициализация пинов и LCD
void setup() {
  pinMode(STEP, OUTPUT);
  pinMode(DIR, OUTPUT);
  pinMode(En_5V,OUTPUT);
  lcd.clear();                           
  lcd.init();                            
  lcd.backlight();
}
// Ускорение скорость и направление
void MotorBegin(float Step,boolean dirMotor) 
{
  s = s -0.01;
  if (s < 5) s = 5; 
  digitalWrite(DIR, dirMotor);   
  for (float i = 0; i < Step; i++)
  {
     digitalWrite(STEP, HIGH);
     delayMicroseconds(s*(s*1.58));
     digitalWrite(STEP, LOW);
     delayMicroseconds(s*(s*2));
     digitalWrite(En_5V, HIGH);
  }   
}

//Тело
void loop()
{
  MotorBegin(s,0);
  if(millis()-update_time>update_period)// запускаем печать на лсд раз в период
{
  update_time=millis();
  lcd.setCursor(0, 0);
  lcd.print(s);
}
}

 

KOMAPbI4
KOMAPbI4 аватар
Offline
Зарегистрирован: 22.03.2016

Очень вам конечно благодарен, но вся затея  в том , что б отследить значение переменной "s" в момент когда двигатель входит в резонанс ...

Logik
Offline
Зарегистрирован: 05.08.2014

Ну не нужны они вам, уж просто поверте, чтоб много не писать. Вы в них поразбирайтесь, они хорошие ;) но конкретно эта штука без них лучше получится.

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

уменьшите значение time_period до 100, пусть будет 10 кадров в секунду.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

KOMAPbI4 пишет:

Ухожу в прерывания с головой ))

Это важно, что с головой. Если нигде её по дороге не збудешь, то всё получится.

KOMAPbI4
KOMAPbI4 аватар
Offline
Зарегистрирован: 22.03.2016

Всех благодарю за пинки . Вчера умерла ардуинка заказал новую жду . Еще где то у меня валяется STM32 DISCOVERY но пока недорос до нее

Logik
Offline
Зарегистрирован: 05.08.2014

KOMAPbI4 пишет:

Всех благодарю за пинки . Вчера умерла ардуинка заказал новую жду . 

RIP.

А может в реанимацию? диодик там перепаять..

KOMAPbI4 пишет:

 Еще где то у меня валяется STM32 DISCOVERY но пока недорос до нее

Можна блинком помигать попробывать. Там не так все просто как с AVR. К тому моменту как получится - глядиш новая приедет ;))) А опыт организации компиляции и загрузки в STM не лишний.

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

Mr.Privet пишет:

Не нужно прерываться. Любая многозадачность это быстрое переключене между задачами. 

Вы сильно заблуждаетесь, если говорить о теории многозадачности. А для АВРок совершенно верно - карусель с таймслотами. :)

KOMAPbI4
KOMAPbI4 аватар
Offline
Зарегистрирован: 22.03.2016

Logik]</p> <p>[quote=KOMAPbI4 пишет:

Всех благодарю за пинки . Вчера умерла ардуинка заказал новую жду . 

RIP.

А может в реанимацию? диодик там перепаять..

KOMAPbI4 пишет:

 

Диодик ? Так не реагирует даже на кнопку "резет" думаю сдох контроллер