UNO SHIELD L297

использование и разработка плат расширения

UNO SHIELD L297

Сообщение uno » 27 фев 2015, 20:46

UNO SHIELD L297

Программа управления шаговым двигателем с регулируемым ускорением с возвращением ротора в начальное положение.
uno stepper home.jpg
uno stepper home.jpg (123.02 КБ) Просмотров: 9415

Код: Выделить всё
/*
 uno_stepper_home_75238 -  управление шаговым двигателем duino uno r3
 */
// вывод 1 занят "RESET"-перезапись и запуск программы
// вывод2=pin0 занят "RxD"-связь с ноутбуком по интерфейсу USB-UART
// вывод3=pin1 занят "TxD"-связь с ноутбуком по интерфейсу USB-UART
// вывод4=pin2 занят "TX"-GSM-модуля или "INT0"-внешнее прерывание выполнения программы
// вывод5=pin3 занят "RX"-GSM-модуля или "INT1"-внешнее прерывание выполнения программы
// вывод6=pin4 свободен под цифровой вход или выход
// вывод 7 занят под VCC=+5v
// вывод 8 занят под GND
// вывод 9 занят  под кварцевый осциллятор-вход
// вывод 10 занят под кварцевый осциллятор-выход
// вывод11=pin5 свободен под ШИМ-выход
// вывод12=pin6 свободен под ШИМ-выход
// вывод13=pin7 занят "Modem Reset"-GSM-модуля
// вывод14=pin8 свободен под цифровой вход или выход
// вывод15=pin9 свободен под ШИМ-выход
// вывод16=pin10 занят   "SS"-связь по интерфейсу SPI с программатором или SD-card
// вывод17=pin11 занят "MOSI"-связь по интерфейсу SPI с программатором или SD-card
// вывод18=pin12 занят "MISO"-связь по интерфейсу SPI с программатором или SD-card
// вывод19=pin13 занят  "SCK"-связь по интерфейсу SPI с программатором или SD-card
// вывод 20 занят под AVCC=+5v
// вывод 21 занят под AREF-внутреннюю или! внешнюю подачу опорного напряжения
// вывод 22 занят под AGND
// вывод23=pin14=pinA0 свободен под аналоговый вход
// вывод24=pin15=pinA1 свободен под аналоговый вход
// вывод25=pin16=pinA2 свободен под аналоговый вход
// вывод26=pin17=pinA3 свободен под аналоговый вход
// вывод27=pin18=pinA4 занят под "SDA"-связь по интерфейсу I2C с внешними устройствами
// вывод28=pin19=pinA5 занят под "SCL"-связь по интерфейсу I2C с внешними устройствами
// итог: свободны pin8, pin4                 два цифровых входа или выхода
// итог: свободны pin5, pin6, pin9           три ШИМ-выхода,                       и уж ,конечно, и цифровых входа или выхода
// итог: свободны pin14, pin15, pin16, pin17 четыре аналоговых входа,              и уж ,конечно, и цифровых входа или выхода
// Используем плату duino uno и шилд с L297.
// На шилде есть 3-штыревой разъём (средний штырь свободен) на кнопку "RESET+"-дублёра кнопки "RESET" на шилде.
// На шилде есть 4-штыревой разъём с выходами "открытый коллектор" относительно +5v для оптически изолированного трёхсигнального интерфейса.
// На шилде есть 10-штыревой разъём сигналов на дисплей от duino и сигналов ABCD от L297 к блоку силовых ключей.
// От 10-штыревого разъёма 6 жил идут к блоку силовых ключей любой мощности с регулировкой тока и собственным питанием.
// От 10-штыревого разъёма 4 жилы идут на дисплей, две из которых питание дисплея 5v и две интерфейс I2C. Активизация строк индикации влечёт уменьшение наибольшей скорости около 10ms/Step на параметр индикации.
// На шилде есть 3-штыревой разъём к датчику температуры DS18B20. Активизация строк контроля температуры влечёт уменьшение наибольшей скорости на 32ms/Step , индикации температуры влечёт уменьшение наибольшей скорости на 11ms/St
// На шилде есть 8-штыревой разъём на элементы ручного управления.
// На шилде есть кроватка под ATMEGA328P для автономного использования шилда.
// В автономном варианте стабилизированные! 5v можно взять от питания блока силовых ключей, с 10-штыревого разъёма.
// Пользовательский интерфейс:
// Перемычка на шилде                                            - в этом варианте устанавливаем перемычку около ATMEGA328
// Кнопка "RESET" или "RESET+"                                   - в этом варианте не используем                           
// Переключатель "СТАРТ/СТОП"                                    - плавно разгоняем или плавно останавливаем двигатель             - цифровой   вход pin8
// Переключатель "НАПРАВЛЕНИЕ"                                   - плавно меняем направление                                       - цифровой   вход pin6
// Переключатель "HALF/FULL"          !выбираем перед движением! - выбираем полушаговый или полношаговый режим напрямую через L297
// Датчик температуры DS18B20 с интерфейсом OneWire              - контролируем температуру в нужной точке                         - цифровой   вход pin4
// Переменный резистор "ПЕРИОД ТАКТА"                            - оптимальное положение подбираем опытным путём                   - аналоговый вход pinA2
// Переменный резистор "УСКОРЕНИЕ"                               - оптимальное положение подбираем опытным путём                   - аналоговый вход pinA1
// Переменный резистор "ШАГИ"                                    - в этом варианте не задаём шаги, а отдаём вход под "HOME"        - аналоговый вход pinA0
// Вход "HOME"                                                   - сигнал начального положения из L297 (открытый коллектор)        - цифровой   вход pin14
// Выход "СТАРТ/СТОП"                                            - высокий уровень соответствует "СТАРТ"                           - цифровой   выход pin9
// Выход "НАПРАВЛЕНИЕ"                                           - автоматически приводит в соответствие с переключателем          - цифровой   выход pin5
// Выход "ТАКТОВАЯ ЧАСТОТА"                                      - счёт по фронту (не по спаду)                                    - цифровой   выход pin17
// Выход "SDA" интерфейса I2C на монитор                         - передаёт информацию                                             - цифровой   выход pin18
// Выход "SCL" интерфейса I2C на монитор                         - синхронизирует передачу информации тактовым сигналом            - цифровой   выход pin19
// Загружаем программу со стандартным трёхсигнальным интерфейсом между duino и драйвером L297: "СТАРТ/СТОП", "НАПРАВЛЕНИЕ", "ТАКТОВАЯ ЧАСТОТА".
// the setup function runs once when you press reset or power the board
// Даём британскими символами названия входным и выходным параметрам программы, эти переменные видны всей программе
#include <OneWire.h> // C:\Program Files\Arduino\libraries\OneWire\examples, keywords.txt 819bite, OneWire.cpp 17602bite, OneWire.h 8963bite
#include <Wire.h> // IDE 1.0.6.  C:\Program Files\Arduino\libraries\Wire\examples, utility, Wire.cpp 7532bite, Wire.h 2507bite
#include <LiquidCrystal_I2C.h>  // C:\Program Files\Arduino\libraries\Arduino-LiquidCrystal-I2C-library-master\examples, keywords.txt 1095bite, LiquidCrystal_I2C.cpp 6964bite, LiquidCrystal_I2C.h 4362bite, README md 523bite
  LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x27 for a 20 chars and 4 line display
  int startin = 8;
  int napravlenin = 6;
//  int stepmode = 4; // в HOME-варианте pin4 отдаём под контроль температуры
  int timetakt = A2;
  int timetaktmax = 1023 ; // с этой длительности такта начнём движение (без учёта задержек программы на индикации), 1023-наибольшее значение
  int timetaktmin = 1 ; // до этой длительности такта сможем разогнать двигатель (без учёта задержек программы на индикации), 0-длительность такта нам не нужна
  int postsenstakt = timetaktmax ;
  int predsenstakt = postsenstakt - 1 ;
  int uskor = A1;
  int postsensuskor = 1023 ;
  int predsensuskor = postsensuskor - 1 ;
    int stepsin = A0; // в HOME-варианте A0 отдаём под вход "HOME"
  int ABCD0101 = 14; // вход "HOME"
  int startout = 9;
  int intstartout = 0;
  int napravlenout = 5;
  int takt = 17; // pin17-выход "ТАКТОВАЯ ЧАСТОТА" 
  int hightakt = timetaktmax ;
  int predtakt = timetaktmax ;
  int tormoz = 0 ;
  int intnapravlenin = 0;
  int intnapravlenout = 0;
  int taktout = 0;
 
  OneWire  ds(4);  // (подтягивающий к +5v resistor 4.7k предусмотрен на шилде), в HOME-варианте pin4 используем для контроля температуры датчиком DS1820 по интерфейсу OneWire
 
void setup() {
//void setup(void) {   
  lcd.begin(); // initialize the LCD
  //lcd.init();// initialize the LCD // для информации
  //lcd.setBacklightPin(BACKLIGHT,NEGATIVE); // init the backlight // для информации
  lcd.clear(); // очистка дисплея
  //lcd.backlight(); // включаем подсветку
  //delay(100); // время подсветки
  //lcd.noBacklight(); // выключаем подсветку
  //delay(100); // время отсутствия подсветки
  lcd.backlight(); // включаем подсветку
 
  lcd.setCursor(0,1); // устанавливаем курсор в следующее нужное место
  lcd.print("USKOR"); // вводим неизменяемую информацию в void setup
  lcd.setCursor(12,1); // устанавливаем курсор в следующее нужное место
  lcd.print("ms/St/St"); // вводим неизменяемую информацию в void setup
  lcd.setCursor(0,2); // устанавливаем курсор в следующее нужное место
  lcd.print("SPEED"); // вводим неизменяемую информацию в void setup
  lcd.setCursor(12,2); // устанавливаем курсор в следующее нужное место
  lcd.print("ms/Step"); // вводим неизменяемую информацию в void setup
  lcd.setCursor(2,3); // устанавливаем курсор в следующее нужное место
  lcd.print("UNO_STEPPER_HOME"); // вводим неизменяемую информацию в void setup
 
  // температурный модуль setup, начало 
  lcd.setCursor(0,0); // устанавливаем курсор на первый символ, в первую(верхнюю) строку
  lcd.print("TEMP"); // вводим неизменяемую информацию в void setup
  lcd.setCursor(12,0); // устанавливаем курсор в следующее нужное место 
  lcd.print("Celsius"); // вводим неизменяемую информацию в void setup
  // температурный модуль setup, окончание
 
  // Объявляем цифровые pin-ВЫХОДЫ и pin-ВХОДЫ, аналоговые pin-ВХОДЫ по-умолчанию
  pinMode(startin, INPUT);
  pinMode(napravlenin, INPUT);
//  pinMode(stepmode, INPUT); // в HOME-варианте pin4 отдаём под контроль температуры
  pinMode(ABCD0101, INPUT);
  pinMode(startout, OUTPUT);
  pinMode(napravlenout, OUTPUT);
  pinMode(takt, OUTPUT);
  Serial.begin(9600);
  Serial.println();
  Serial.println();
}

void loop() {
//void loop(void) {   
  int zikl = millis();
/*
// температурный модуль loop, начало
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;
 
  if ( !ds.search(addr)) {
//  Serial.println("No more addresses.");
//  Serial.println();
  ds.reset_search();
//  delay(250);
    return;
  }
 
//  Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
//    Serial.write(' ');
//    Serial.print(addr[i], HEX);
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
//      Serial.println("CRC is not valid!");
      return;
  }
//  Serial.println();
 
  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
//      Serial.println("  Chip = DS18S20");  // or old DS1820
      type_s = 1;
      break;
    case 0x28:
//      Serial.println("  Chip = DS18B20");
      type_s = 0;
      break;
    case 0x22:
//      Serial.println("  Chip = DS1822");
      type_s = 0;
      break;
    default:
//      Serial.println("Device is not a DS18x20 family device.");
      return;
  }

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);        // start conversion, with parasite power on at the end
 
  //delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.
 
  present = ds.reset();
  ds.select(addr);   
  ds.write(0xBE);         // Read Scratchpad

//  Serial.print("  Data = ");
//  Serial.print(present, HEX);
//  Serial.print(" ");
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
//    Serial.print(data[i], HEX);
//    Serial.print(" ");
  }
//  Serial.print(" CRC=");
//  Serial.print(OneWire::crc8(data, 8), HEX);
//  Serial.println();

  // Convert the data to actual temperature
  // because the result is a 16 bit signed integer, it should
  // be stored to an "int16_t" type, which is always 16 bits
  // even when compiled on a 32 bit processor.
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // "count remain" gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
    //// default is 12 bit resolution, 750 ms conversion time
  }
  celsius = (float)raw / 16.0;
//  fahrenheit = celsius * 1.8 + 32.0;
//  Serial.print("  Temperature = ");
//  Serial.print(celsius);
  int C = (int)celsius;

//  Serial.print(C);
//  Serial.print(" Celsius, ");
 
  lcd.setCursor(6,0); // устанавливаем курсор в следующее нужное место
  lcd.print("    "); // вводим изменяемую информацию в void loop
  lcd.setCursor(6,0); // устанавливаем курсор в следующее нужное место
  lcd.print(C); // 

//  Serial.print(fahrenheit);
//  Serial.println(" Fahrenheit");
// температурный модуль loop, окончание
*/

   int sensABCD0101 = digitalRead(ABCD0101); // возможные значения LOW или HIGH
//  Serial.print(" sensABCD0101=");
//  Serial.print(sensABCD0101);
 
  int sensstartin = digitalRead(startin); // возможные значения LOW или HIGH
  if (sensstartin == LOW  && sensABCD0101 == LOW && hightakt == 1023) {
  digitalWrite(startout, LOW); // на наименьшей скорости выключаем сигнал "СТАРТ"
  intstartout = 0 ;
  }
  if (sensstartin == HIGH) {
  digitalWrite(startout, HIGH); // в любой момент включаем сигнал "СТАРТ"
  intstartout = 1 ; 
  }
//  Serial.print(" intstartout=");
//  Serial.print(intstartout);
     
  int sensnapravlenin = digitalRead(napravlenin); // LOW или HIGH
  if (sensnapravlenin == LOW ) { intnapravlenin = 0 ; }
  else { intnapravlenin = 1 ;}
  if (sensnapravlenin == LOW  && sensABCD0101 == LOW && hightakt == 1023) {
  digitalWrite(napravlenout, LOW); // в начальном положении ротора и на наименьшей скорости приводим ВХОД и ВЫХОД "НАПРАВЛЕНИЯ" в соответствие
  intnapravlenout = 0 ;
  }
  if (sensnapravlenin == HIGH  && sensABCD0101 == LOW && hightakt == 1023) {
  digitalWrite(napravlenout, HIGH);  // в начальном положении ротора и на наименьшей скорости приводим ВХОД и ВЫХОД "НАПРАВЛЕНИЯ" в соответствие
  intnapravlenout = 1 ;
  }
//  Serial.print(" intnapravlenout=");
//  Serial.print(intnapravlenout);
   
  if (intnapravlenin == intnapravlenout ) { tormoz = 0 ; }
  else { tormoz = 1 ; }
 

  int newsenstakt = analogRead(timetakt); // возможные значения от 0 до 1023
//  Serial.print(" newsenstakt=");
//  Serial.print(newsenstakt);
  if (newsenstakt != predsenstakt && newsenstakt != postsenstakt) {
  postsenstakt = newsenstakt ;
  predsenstakt = postsenstakt -1 ;
  } 
  int senstakt = predsenstakt; // ради стабильности последнего знака жертвуем большим значением "ПЕРИОДА ТАКТА"
  senstakt = constrain(senstakt , timetaktmin , timetaktmax); // не даём выйти из нужного нам диапазона
//  Serial.print(" senstakt=");
//  Serial.print(senstakt);
 
//  lcd.setCursor(6,2); // устанавливаем курсор в следующее нужное место
//  lcd.print("    "); // вводим изменяемую информацию в void loop
//  lcd.setCursor(6,2); // устанавливаем курсор в следующее нужное место
//  lcd.print(senstakt+0); // реальный "ПЕРИОД ТАКТА" с учётом задержки программы на выполнение и на индикации (senstakt+zikl),где "zikl"-время цикла программы при прогоне на наименьшем "ПЕРИОДЕ ТАКТА".
 
  int newsensuskor = analogRead(uskor); // возможные значения от 0 до 1023
//  Serial.print(" newsensuskor=");
//  Serial.print(newsensuskor);
  if (newsensuskor != predsensuskor && newsensuskor != postsensuskor) {
  postsensuskor = newsensuskor ;
  predsensuskor = postsensuskor -1 ;
  }
  int sensuskor = predsensuskor; // ради стабильности последнего знака жертвуем большим значением "УСКОРЕНИЯ"
  sensuskor = constrain(sensuskor , 1 , 1023); // не даём выйти из нужного нам диапазона, 0-разгон и 0-торможение нам не нужны
 
//  lcd.setCursor(6,1); // устанавливаем курсор в следующее нужное место
//  lcd.print("    "); // вводим изменяемую информацию в void loop
//  lcd.setCursor(6,1); // устанавливаем курсор в следующее нужное место
//  lcd.print(sensuskor); // вводим изменяемую информацию в void loop
 
  if (senstakt > ( predtakt + sensuskor )) { tormoz = 1 ; } 
  if (sensstartin == LOW || tormoz == 1 ){ hightakt = hightakt + sensuskor ; }
  if (sensstartin == HIGH && tormoz == 0) { hightakt = hightakt - sensuskor ; }
  if (senstakt > hightakt && tormoz == 0) { predtakt = senstakt ; }
  else { predtakt = hightakt ; }
  hightakt = constrain(hightakt , predtakt , timetaktmax); // не даём выйти из нужного нам диапазона
  digitalWrite(takt, LOW); // устанавливаем выход "ТАКТОВАЯ ЧАСТОТА" в LOW, готовя к переходу в HIGH для L297
  delayMicroseconds(100);  //наименьшее 1 или, вообще, микросекунды
  if (intstartout == 1 ) { digitalWrite(takt, HIGH); } // если нет сигнала "СТОП", устанавливаем выход "ТАКТОВАЯ ЧАСТОТА" в HIGH, именно по этому фронту считает  L297
  if (intstartout == 1 ) { taktout = taktout + 1 ; }
//  Serial.print(" taktout=");
//  Serial.print(taktout);
//  Serial.print(" hightakt=");
//  Serial.print(hightakt);
//  Serial.println();
  delay(hightakt) ;
  zikl = millis() - zikl;
//  Serial.print(" zikl=");
  Serial.println(zikl); 
}


Программа управления шаговым двигателем с регулируемым ускорением с выполнением установленного количества шагов.
uno stepper steps.jpg
uno stepper steps.jpg (103.8 КБ) Просмотров: 9410

Код: Выделить всё
/*
  uno_stepper_steps_75238 - управление шаговым двигателем duino uno r3
 */
// вывод 1 занят "RESET"-перезапись и запуск программы
// вывод2=pin0 занят "RxD"-связь с ноутбуком по интерфейсу USB-UART
// вывод3=pin1 занят "TxD"-связь с ноутбуком по интерфейсу USB-UART
// вывод4=pin2 занят "TX"-GSM-модуля или "INT0"-внешнее прерывание выполнения программы
// вывод5=pin3 занят "RX"-GSM-модуля или "INT1"-внешнее прерывание выполнения программы
// вывод6=pin4 свободен под цифровой вход или выход
// вывод 7 занят под VCC=+5v
// вывод 8 занят под GND
// вывод 9 занят  под кварцевый осциллятор-вход
// вывод 10 занят под кварцевый осциллятор-выход
// вывод11=pin5 свободен под ШИМ-выход
// вывод12=pin6 свободен под ШИМ-выход
// вывод13=pin7 занят "Modem Reset"-GSM-модуля
// вывод14=pin8 свободен под цифровой вход или выход
// вывод15=pin9 свободен под ШИМ-выход
// вывод16=pin10 занят   "SS"-связь по интерфейсу SPI с программатором или SD-card
// вывод17=pin11 занят "MOSI"-связь по интерфейсу SPI с программатором или SD-card
// вывод18=pin12 занят "MISO"-связь по интерфейсу SPI с программатором или SD-card
// вывод19=pin13 занят  "SCK"-связь по интерфейсу SPI с программатором или SD-card
// вывод 20 занят под AVCC=+5v
// вывод 21 занят под AREF-внутреннюю или! внешнюю подачу опорного напряжения
// вывод 22 занят под AGND
// вывод23=pin14=pinA0 свободен под аналоговый вход
// вывод24=pin15=pinA1 свободен под аналоговый вход
// вывод25=pin16=pinA2 свободен под аналоговый вход
// вывод26=pin17=pinA3 свободен под аналоговый вход
// вывод27=pin18=pinA4 занят под "SDA"-связь по интерфейсу I2C с внешними устройствами
// вывод28=pin19=pinA5 занят под "SCL"-связь по интерфейсу I2C с внешними устройствами
// итог: свободен pin8, pin4                 два цифровых входа или выхода
// итог: свободны pin5, pin6, pin9           три ШИМ-выхода,                       и уж ,конечно, и цифровых входа или выхода
// итог: свободны pin14, pin15, pin16, pin17 четыре аналоговых входа,              и уж ,конечно, и цифровых входа или выхода
// Используем плату duino uno и шилд с L297.
// На шилде есть 3-штыревой разъём (средний штырь свободен) на кнопку "RESET+"-дублёра кнопки "RESET" на шилде.
// На шилде есть 4-штыревой разъём с выходами "открытый коллектор" относительно +5v для оптически изолированного трёхсигнального интерфейса.
// На шилде есть 10-штыревой разъём сигналов на дисплей от duino и сигналов ABCD от L297 к блоку силовых ключей.
// От 10-штыревого разъёма 6 жил идут к блоку силовых ключей любой мощности с регулировкой тока и собственным питанием.
// От 10-штыревого разъёма 4 жилы идут на дисплей, две из которых питание дисплея 5v и две интерфейс I2C. Активизация строк индикации влечёт уменьшение наибольшей скорости около 10ms/Step на параметр индикации.
// На шилде есть 3-штыревой разъём к датчику температуры DS18B20. Активизация строк контроля температуры влечёт уменьшение наибольшей скорости на 32ms/Step , индикации температуры влечёт уменьшение наибольшей скорости на 11ms/St
// На шилде есть 8-штыревой разъём на элементы ручного управления.
// На шилде есть кроватка под ATMEGA328P для автономного использования шилда.
// В автономном варианте стабилизированные! 5v можно взять от питания блока силовых ключей, с 10-штыревого разъёма.
// Пользовательский интерфейс:
// Перемычка на шилде                                            - в этом варианте устанавливаем перемычку около 8-штыревого разъёма
// Кнопка "RESET" или "RESET+"                                   - запускаем цикл                           
// Переключатель "СТАРТ/СТОП"         !постоянно включен!        - в этом варианте используем как "СТОП АВАРИЙНЫЙ"                 - цифровой   вход pin8
// Переключатель "НАПРАВЛЕНИЕ"        !выбираем перед движением! - устанавливаем направление перед движением!                      - цифровой   вход pin6
// Переключатель "HALF/FULL"          !выбираем перед движением! - выбираем полушаговый или полношаговый режим напрямую через L297 - цифровой   вход pin4
// Датчик температуры DS18B20 с интерфейсом OneWire              - в этом варианте не используем, отдаём вход под "HALF/FULL"      - цифровой   вход pin4
// Переменный резистор "ПЕРИОД ТАКТА"                            - оптимальное положение подбираем опытным путём                   - аналоговый вход pinA2
// Переменный резистор "УСКОРЕНИЕ"                               - оптимальное положение подбираем опытным путём                   - аналоговый вход pinA1
// Переменный резистор "ШАГИ"                                    - в этом варианте задаём "ШАГИ"                                   - аналоговый вход pinA0
// Вход "HOME"                                                   - в этом варианте не используем, отдаём вход под "ШАГИ"           - цифровой   вход pin14
// Выход "СТАРТ/СТОП"                                            - высокий уровень соответствует "СТАРТ"                           - цифровой   выход pin9
// Выход "НАПРАВЛЕНИЕ"                                           - автоматически приводит в соответствие с переключателем          - цифровой   выход pin5
// Выход "ТАКТОВАЯ ЧАСТОТА"                                      - счёт по фронту (не по спаду)                                    - цифровой   выход pin17
// Выход "SDA" интерфейса I2C на монитор                         - передаёт информацию                                             - цифровой   выход pin18
// Выход "SCL" интерфейса I2C на монитор                         - синхронизирует передачу информации тактовым сигналом            - цифровой   выход pin19
// Загружаем программу со стандартным трёхсигнальным интерфейсом между duino и драйвером L297: "СТАРТ/СТОП", "НАПРАВЛЕНИЕ", "ТАКТОВАЯ ЧАСТОТА".
// the setup function runs once when you press reset or power the board
// Даём британскими символами названия входным и выходным параметрам программы, эти переменные видны всей программе
//#include <OneWire.h> // C:\Program Files\Arduino\libraries\OneWire\examples, keywords.txt 819bite, OneWire.cpp 17602bite, OneWire.h 8963bite
#include <Wire.h> // IDE 1.0.6.  C:\Program Files\Arduino\libraries\Wire\examples, utility, Wire.cpp 7532bite, Wire.h 2507bite
#include <LiquidCrystal_I2C.h>  // C:\Program Files\Arduino\libraries\Arduino-LiquidCrystal-I2C-library-master\examples, keywords.txt 1095bite, LiquidCrystal_I2C.cpp 6964bite, LiquidCrystal_I2C.h 4362bite, README md 523bite
  LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x27 for a 20 chars and 4 line display
  int startin = 8;
  int napravlenin = 6;
  int stepmode = 4;
 
  int timetakt = A2; // вход "ПЕРИОД ТАКТА"
  int timetaktmax = 1023 ; // с этой длительности такта начнём движение (без учёта задержек программы на индикации), 1023-наибольшее значение
  int timetaktmin = 1 ; // до этой длительности такта сможем разогнать двигатель (без учёта задержек программы на индикации), 0-длительность такта нам не нужна
  int postsenstakt = timetaktmax ;
  int predsenstakt = postsenstakt - 1 ;
 
  int uskor = A1; // вход "УСКОРЕНИЕ"
  int postsensuskor = 1023 ;
  int predsensuskor = postsensuskor - 1 ;
 
  int stepsin = A0; // вход "ШАГИ"
  int postsensstepsin = 1023 ;
  int predsensstepsin = postsensstepsin - 1 ;
 
  int stepsout = 1 ;
//  int ABCD0101 = 14; // в этом варианте отдаём вход под "ШАГИ"
  int startout = 9;
  int intstartout = 1 ; // при запуске однократно разрешаем выход "СТАРТ"
  int napravlenout = 5;
  int takt = 17;
  int hightakt = timetaktmax ;
  int predtakt = timetaktmax ;
 
 
  int tormoz = 0 ;
  int sensnapravlenin = digitalRead(napravlenin); // LOW или HIGH
//  int intnapravlenout = 0 ;
//  int intnapravlenout = 0;
  int stepstakt = 0  ;
  int taktout = 0 ;
 
//  OneWire  ds(4);  // (подтягивающий к +5v resistor 4.7k предусмотрен на шилде), в HOME-варианте pin4 используем для контроля температуры датчиком DS1820 по интерфейсу OneWire
 
void setup() {
//void setup(void) {   
  lcd.begin(); // initialize the LCD
  //lcd.init();// initialize the LCD // для информации
  //lcd.setBacklightPin(BACKLIGHT,NEGATIVE); // init the backlight // для информации
  lcd.clear(); // очистка дисплея
  //lcd.backlight(); // включаем подсветку
  //delay(100); // время подсветки
  //lcd.noBacklight(); // выключаем подсветку
  //delay(100); // время отсутствия подсветки
  lcd.backlight(); // включаем подсветку
 
  lcd.setCursor(1,0); // устанавливаем курсор в нужное место
  lcd.print("UNO_STEPPER_STEPS"); // вводим неизменяемую информацию в void setup

  lcd.setCursor(0,1); // устанавливаем курсор в следующее нужное место
  lcd.print("USKOR"); // вводим неизменяемую информацию в void setup
  lcd.setCursor(12,1); // устанавливаем курсор в следующее нужное место
  lcd.print("ms/St/St"); // вводим неизменяемую информацию в void setup
  lcd.setCursor(0,2); // устанавливаем курсор в следующее нужное место
  lcd.print("SPEED"); // вводим неизменяемую информацию в void setup
  lcd.setCursor(12,2); // устанавливаем курсор в следующее нужное место
  lcd.print("ms/Step"); // вводим неизменяемую информацию в void setup
  lcd.setCursor(5,3); // устанавливаем курсор в следующее нужное место
  lcd.print("STEPS"); // вводим неизменяемую информацию в void setup

    // температурный модуль setup, начало 
//  lcd.setCursor(0,0); // устанавливаем курсор на первый символ, в первую(верхнюю) строку
//  lcd.print("TEMP"); // вводим неизменяемую информацию в void setup
//  lcd.setCursor(12,0); // устанавливаем курсор в следующее нужное место 
//  lcd.print("Celsius"); // вводим неизменяемую информацию в void setup
  // температурный модуль setup, окончание
   
  // Объявляем цифровые pin-ВЫХОДЫ и pin-ВХОДЫ, аналоговые pin-ВХОДЫ по-умолчанию
  pinMode(startin, INPUT);
  pinMode(napravlenin, INPUT);
  pinMode(stepmode, INPUT);
  pinMode(startout, OUTPUT);
  pinMode(napravlenout, OUTPUT);
  pinMode(takt, OUTPUT);
  Serial.begin(9600);
  Serial.println();
  Serial.println();
}
void loop() {
//void loop(void) {   
  int zikl = millis();
 
/*
// температурный модуль loop, начало
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;
 
  if ( !ds.search(addr)) {
//  Serial.println("No more addresses.");
//  Serial.println();
  ds.reset_search();
//  delay(250);
    return;
  }
 
//  Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
//    Serial.write(' ');
//    Serial.print(addr[i], HEX);
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
//      Serial.println("CRC is not valid!");
      return;
  }
//  Serial.println();
 
  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
//      Serial.println("  Chip = DS18S20");  // or old DS1820
      type_s = 1;
      break;
    case 0x28:
//      Serial.println("  Chip = DS18B20");
      type_s = 0;
      break;
    case 0x22:
//      Serial.println("  Chip = DS1822");
      type_s = 0;
      break;
    default:
//      Serial.println("Device is not a DS18x20 family device.");
      return;
  }

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);        // start conversion, with parasite power on at the end
 
  //delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.
 
  present = ds.reset();
  ds.select(addr);   
  ds.write(0xBE);         // Read Scratchpad

//  Serial.print("  Data = ");
//  Serial.print(present, HEX);
//  Serial.print(" ");
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
//    Serial.print(data[i], HEX);
//    Serial.print(" ");
  }
//  Serial.print(" CRC=");
//  Serial.print(OneWire::crc8(data, 8), HEX);
//  Serial.println();

  // Convert the data to actual temperature
  // because the result is a 16 bit signed integer, it should
  // be stored to an "int16_t" type, which is always 16 bits
  // even when compiled on a 32 bit processor.
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // "count remain" gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
    //// default is 12 bit resolution, 750 ms conversion time
  }
  celsius = (float)raw / 16.0;
//  fahrenheit = celsius * 1.8 + 32.0;
//  Serial.print("  Temperature = ");
//  Serial.print(celsius);
  int C = (int)celsius;

//  Serial.print(C);
//  Serial.print(" Celsius, ");
 
  lcd.setCursor(6,0); // устанавливаем курсор в следующее нужное место
  lcd.print("    "); // вводим изменяемую информацию в void loop
  lcd.setCursor(6,0); // устанавливаем курсор в следующее нужное место
  lcd.print(C); // 

//  Serial.print(fahrenheit);
//  Serial.println(" Fahrenheit");
// температурный модуль loop, окончание
*/ 
 
  if (intstartout == 1) { digitalWrite(startout, HIGH); } // при запуске цикла включаем сигнал "СТАРТ"
  int sensstartin = digitalRead(startin); // возможные значения LOW или HIGH
  if (sensstartin == LOW ) {
  digitalWrite(startout, LOW); // в любой момент выключаем сигнал "СТАРТ"
  intstartout = 0 ;
  }
//  Serial.print(" sensstartin=");
//  Serial.print(sensstartin);
//  Serial.print(" intstartout=");
//  Serial.print(intstartout);

//  if (intstartout == 0) {
//  lcd.setCursor(16,3); // устанавливаем курсор в нужное место
//  lcd.print("    "); // вводим изменяемую информацию в void loop, здесь очищаем нужные ячейки
//  lcd.setCursor(16,3); // устанавливаем курсор в следующее нужное место
//  lcd.print("STOP"); // вводим изменяемую информацию в void loop
//  }
 
  int sensstepmode = digitalRead(stepmode); // возможные значения LOW или HIGH
  int k = 4+4*sensstepmode ;
//  Serial.print(" k=");
//  Serial.print(k); 
 
  if (sensnapravlenin == LOW) { digitalWrite(napravlenout, LOW); }
  else {
  digitalWrite(napravlenout, HIGH);
  }

  int newsensstepsin = analogRead(stepsin); // возможные значения от 0 до 1023
//  Serial.print(" newsensstepsin=");
//  Serial.print(newsensstepsin);
  if (newsensstepsin != predsensstepsin && newsensstepsin != postsensstepsin) {
  postsensstepsin = newsensstepsin ;
  predsensstepsin = postsensstepsin -1 ;
  } 
  int senssteps = predsensstepsin; // возможные значения от 0 до 1023
  senssteps = constrain(senssteps , 1 , 1023); // ноль шагов нам не нужно
//  Serial.print(" senssteps=");
//  Serial.print(senssteps);

//  lcd.setCursor(0,3); // устанавливаем курсор в нужное место
//  lcd.print("    "); // вводим изменяемую информацию в void loop, здесь очищаем нужные ячейки
//  lcd.setCursor(0,3); // устанавливаем курсор в следующее нужное место
//  lcd.print(senssteps); // вводим изменяемую информацию в void loop
   
  int newsensuskor = analogRead(uskor); // возможные значения от 0 до 1023
//  Serial.print(" newsensuskor=");
//  Serial.print(newsensuskor);
  if (newsensuskor != predsensuskor && newsensuskor != postsensuskor) {
  postsensuskor = newsensuskor ;
  predsensuskor = postsensuskor -1 ;
  }
  int sensuskor = predsensuskor; // возможные значения от 0 до 1023
  sensuskor = constrain(sensuskor , 1 , 1023); // не даём выйти из нужного нам диапазона, 0-разгон и 0-торможение нам не нужны
//  Serial.print(" sensuskor=");
//  Serial.print(sensuskor);

//  lcd.setCursor(6,1); // устанавливаем курсор в нужное место
//  lcd.print("    "); // вводим изменяемую информацию в void loop, здесь очищаем нужные ячейки
//  lcd.setCursor(6,1); // устанавливаем курсор в нужное место
//  lcd.print(sensuskor); // вводим изменяемую информацию в void loop
 
  int newsenstakt = analogRead(timetakt); // возможные значения от 0 до 1023. Программа на резкое убавление скорости реагирует мгновенно ( не замедляет плавно).
//  Serial.print(" newsenstakt=");
//  Serial.print(newsenstakt);
  if (newsenstakt != predsenstakt && newsenstakt != postsenstakt) {
  postsenstakt = newsenstakt ;
  predsenstakt = postsenstakt -1 ;
  } 
  int senstakt = predsenstakt; // ради стабильности последнего знака жертвуем большим значением длительности такта
  senstakt = constrain(senstakt , timetaktmin , timetaktmax); // не даём выйти из нужного нам диапазона
//  Serial.print(" senstakt=");
//  Serial.print(senstakt);

//  lcd.setCursor(6,2); // устанавливаем курсор в следующее нужное место
//  lcd.print("    "); // вводим изменяемую информацию в void loop
//  lcd.setCursor(6,2); // устанавливаем курсор в следующее нужное место
//  lcd.print(senstakt+0); // реальный "ПЕРИОД ТАКТА" с учётом задержки программы на выполнение и на индикации (senstakt+zikl),где "zikl"-время цикла программы при прогоне на наименьшем "ПЕРИОДЕ ТАКТА".
 
  int tormoztakts = (timetaktmax - senstakt) / sensuskor ; //вычисляем количество тактов торможения
//  Serial.print(" tormoztakts=");
//  Serial.print(tormoztakts);
 
  int tormozsteps = tormoztakts / k ; // вычисляем количество шагов торможения
//  Serial.print(" tormozsteps=");
//  Serial.print(tormozsteps);
 
  if (tormozsteps >= (senssteps - stepsout)) { tormoz = 1 ; } // для медленного торможения за несколько шагов
  else { tormoz = 0 ; } // на случай неожиданного резкого увеличения общего количества шагов
  if (taktout >= (senssteps*k - tormoztakts + 1) ) { tormoz = 1 ; } // для быстрого торможения в пределах шага
//  Serial.print(" tormoz=");
//  Serial.print(tormoz);
  if (tormoz == 1 ){ hightakt = hightakt + sensuskor ; } // при торможении увеличиваем время такта
  if (tormoz == 0) { hightakt = hightakt - sensuskor ; }
  hightakt = constrain(hightakt , senstakt , timetaktmax); // не даём выйти из нужного нам диапазона
  digitalWrite(takt, LOW); // устанавливаем выход "ТАКТОВАЯ ЧАСТОТА" в LOW, готовя к переходу в HIGH для L297
  delayMicroseconds(100) ;  //наименьшее 1ms или, вообще, микросекунды
  if (intstartout == 1 ) {
  digitalWrite(takt, HIGH); // если нет сигнала "СТОП", устанавливаем выход "ТАКТОВАЯ ЧАСТОТА" в HIGH, именно по этому фронту считает  L297
  taktout =taktout +1 ; // если нет сигнала "СТОП", засчитываем такт цикла
  stepstakt = stepstakt +1 ; // если нет сигнала "СТОП", засчитываем такт шага 
  }
//  Serial.print(" taktout=");
//  Serial.print(taktout); 
//  Serial.print(" hightakt=");
//  Serial.print(hightakt);
 
//  Serial.print(" stepstakt=");
//  Serial.print(stepstakt);
  if (intstartout == 1 && stepstakt >= k)  { stepstakt = 0 ; } // если нет сигнала "СТОП" и тактов набралось на шаг, обнуляем счётчик тактов шага
 
 
  if (stepsout >= senssteps && stepstakt == 0) {
  digitalWrite(startout, LOW); // после прохождении целого количества установленных шагов выключаем сигнал "СТАРТ"
  intstartout = 0 ;
  }
//  Serial.print(" stepsout=");
//  Serial.print(stepsout);

//  lcd.setCursor(11,3); // устанавливаем курсор в нужное место
//  lcd.print("    "); // вводим изменяемую информацию в void loop, здесь очищаем нужные ячейки
//  lcd.setCursor(11,3); // устанавливаем курсор в нужное место
//  lcd.print(stepsout); // вводим изменяемую информацию в void loop

  if (intstartout == 1 && stepstakt == 0)  {stepsout = stepsout + 1 ; } // если нет сигнала "СТОП" и тактов набралось на шаг, увеличиваем счётчик шагов на единицу
 
  delay(hightakt) ;
 
//  Serial.print(" intstartout=");
//  Serial.println(intstartout);
 
  zikl = millis() - zikl;
//  Serial.print(" zikl=");
  Serial.println(zikl);
}
uno
 
Сообщения: 5
Зарегистрирован: 27 фев 2015, 20:34

Сообщение uno » 05 июн 2016, 15:00

Вариант управления шаговым двигателем с выполнением заданного количества шагов.
Код: Выделить всё
/*
  uno_75245_stepper_steps_light - UNO-управление шаговым двигателем.
До включения переключателя "СТАРТ" задаём "ШАГИ", "УСКОРЕНИЕ", "СКОРОСТЬ".
После включения "СТАРТ" ничего изменить не можем, или ждём прохождения цикла шагов и выключаем "СТАРТ" или прерываем цикл, выключая "СТАРТ".
*/
// вывод 1             занят "RESET"-перезапись и запуск программы
// вывод2=pin0         занят "RxD"-связь с ноутбуком по интерфейсу USB-UART
// вывод3=pin1         занят "TxD"-связь с ноутбуком по интерфейсу USB-UART
// вывод4=pin2         занят "TX"-GSM-модуля или "INT0"-внешнее прерывание выполнения программы                               
// вывод5=pin3         занят "RX"-GSM-модуля или "INT1"-внешнее прерывание выполнения программы                               
// вывод6=pin4         свободен под цифровой вход или выход
// вывод 7             занят под VCC=+5v
// вывод 8             занят под GND
// вывод 9             занят  под кварцевый осциллятор-вход
// вывод 10            занят под кварцевый осциллятор-выход
// вывод11=pin5        свободен под ШИМ-выход
// вывод12=pin6        свободен под ШИМ-выход
// вывод13=pin7        занят "Modem Reset"-GSM-модуля                                                                         
// вывод14=pin8        свободен под цифровой вход или выход
// вывод15=pin9        свободен под ШИМ-выход
// вывод16=pin10       занят   "SS"-связь по интерфейсу SPI с программатором или SD-card
// вывод17=pin11       занят "MOSI"-связь по интерфейсу SPI с программатором или SD-card
// вывод18=pin12       занят "MISO"-связь по интерфейсу SPI с программатором или SD-card
// вывод19=pin13       занят  "SCK"-связь по интерфейсу SPI с программатором или SD-card
// вывод 20            занят под AVCC=+5v
// вывод 21            занят под AREF-внутреннюю или! внешнюю подачу опорного напряжения
// вывод 22            занят под AGND
// вывод23=pin14=pinA0 свободен под аналоговый вход
// вывод24=pin15=pinA1 свободен под аналоговый вход
// вывод25=pin16=pinA2 свободен под аналоговый вход
// вывод26=pin17=pinA3 свободен под аналоговый вход
// вывод27=pin18=pinA4 занят под "SDA"-связь по интерфейсу I2C с внешними устройствами                                       
// вывод28=pin19=pinA5 занят под "SCL"-связь по интерфейсу I2C с внешними устройствами                                     

// итог: свободен pin8, pin4                 два цифровых входа или выхода
// итог: свободны pin5, pin6, pin9           три ШИМ-выхода,                       и уж ,конечно, и цифровых входа или выхода
// итог: свободны pin14, pin15, pin16, pin17 четыре аналоговых входа,              и уж ,конечно, и цифровых входа или выхода

// Используем плату UNO и шилд ПАСТОДАВ.
//// На шилде есть 2-штыревой разъём на кнопку "RESET+"-выносного дублёра кнопки "RESET" на шилде.
// На шилде есть 4-штыревой разъём с выходами "открытый коллектор" относительно +5v для оптически изолированного трёхсигнального интерфейса.
// На шилде есть 10-штыревой разъём с выходами на дисплей (задействованы всего 4 жилы).
// От 10-штыревого разъёма 4 жилы идут на дисплей, две из которых питание дисплея 5v и две интерфейс I2C. Активизация строк индикации влечёт уменьшение наибольшей скорости около 10ms/Takt на параметр индикации.
// На шилде есть 8-штыревой разъём на элементы ручного управления.

// Соединяем шилд ПАСТОДАВ с дисплеем через 10-штыревой разъём на шилде и 4-штыревой на дисплее, элементами ручного управления через 8-штыревой разъём, драйвером шагового двигателя через 4-штыревой разъём.
// Соединяем плату UNO и шилд ПАСТОДАВ.
// Соединяем плату UNO и ноутбук USB-кабелем.
// Кнопкой "RESET" или "RESET+" перезапускаем программу.                           
 
//// Вход "GSMrx"                                                    - считываем сигнал "GSMrx" от выхода TXD шилда GSM-M590             - цифровой   выход pin2
//// Выход "GSMtx"                                                   - выводим сигнал "GSMtx" на вход RXD шилда GSM-M590                 - цифровой   вход  pin3
//// Переключатель ""                                                - задаём полушаговый или полношаговый режим                         - цифровой   вход pin4
// Выход "НАПРАВЛЕНИЕ"                                             - автоматически приводит в соответствие с заданным                  - цифровой   выход pin5
// Переключатель "НАПРАВЛЕНИЕ"                                     - устанавливаем направление                                         - цифровой   вход pin6
//// Вход "GSMreset"                                                 - выводим сигнал "GSMreset"                                         - цифровой   выход pin7
// Переключатели "СТАРТ/СТОП"                                      - "СТАРТ/СТОП ОБЩИЙ"+"СТАРТ/СТОП ОПЕРАЦИОННЫЙ"                      - цифровой   вход pin8
// Выход "СТАРТ/СТОП"                                              - высокий уровень соответствует "СТАРТ"                             - цифровой   выход pin9
//// Выход "SS"          - считываем сигнал "SS"                                                                                                           - цифровой   выход pin10
//// Выход "MOSI"        - считываем сигнал "MOSI"                                                                                                         - цифровой   выход pin11
//// Вход "MISO"         - выводим сигнал "MISO"                                                                                                           - цифровой   выход pin12
//// Выход "SCK"         - считываем сигнал "SCK"                                                                                                          - цифровой   выход pin13
// Переменный резистор "STEPMODE-ШАГИ"                             - задаём "STEPMODE-ШАГИ"(кратные 16...8...4...2...1 тактам)         - аналоговый вход pinA0
//// Переменный резистор "УСКОРЕНИЕ"                                 - задаём "УСКОРЕНИЕ", оптимальное подбираем опытным путём           - аналоговый вход pinA1
// Переменный резистор "ПЕРИОД ТАКТА"                              - задаём "ПЕРИОД ТАКТА", оптимальный подбираем опытным путём        - аналоговый вход pinA2
// Выход "ТАКТОВАЯ ЧАСТОТА"                                        - выводим тактовый импульс                                          - цифровой   выход pin17
// Выход "SDA" интерфейса I2C на монитор                           - передаёт информацию                                               - цифровой   выход pin18
// Выход "SCL" интерфейса I2C на монитор                           - синхронизирует передачу информации тактовым сигналом              - цифровой   выход pin19

// Загружаем программу со стандартным трёхсигнальным интерфейсом между UNO и драйвером шагового двигателя: "СТАРТ/СТОП", "НАПРАВЛЕНИЕ", "ТАКТОВАЯ ЧАСТОТА".
// the setup function runs once when you press reset or power the board
#include <Wire.h> // IDE 1.0.6.  C:\Program Files\Arduino\libraries\Wire\examples, utility, Wire.cpp 7532byte, Wire.h 2507byte
#include <LiquidCrystal_I2C.h>  // C:\Program Files\Arduino\libraries\Arduino-LiquidCrystal-I2C-library-master\examples, keywords.txt 1095byte, LiquidCrystal_I2C.cpp 6964byte, LiquidCrystal_I2C.h 4362byte, README md 523byte
  LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x27 for a 20 chars and 4 line display
  int startin = 8; // вход "СТАРТ/СТОП"
  int sensstartin = 0 ; 
  int startout = 9;

  int napravlenin = 6; // вход "НАПРАВЛЕНИЕ"
  int sensnapravlenin = digitalRead(napravlenin); // LOW или HIGH
  int napravlenout = 5;

  int sensstepmode = 1; // задаём с ноутбука равным, установленному на драйвере, возможные значения 1...16
  int k = 4*sensstepmode ;
   
  int uskor = A1; // вход "УСКОРЕНИЕ"
  int sensuskor = 1023 ; // в данной программе задаём с ноутбука

  int timetakt = A2; // вход "ПЕРИОД ТАКТА"
  int timetaktmax = 1000 ; // задаём с ноутбука, с этой длительности такта начнём движение (без учёта задержек программы на индикации), 1023-наибольшее значение
  int timetaktmin = 100 ;   // задаём с ноутбука, до этой длительности такта сможем разогнать двигатель, этот параметр не позволяет мощному двигателю сломать хрупкий насос
  int senstimetakt = 1023 ;
  int dintimetakt = timetaktmax ;

  int stepsin = A0; // вход "STEPMODE-ШАГИ"
  int senssteps = 1 ;
  int senstakt = 0 ;
 
  int takt = 17;

  int intstartout = 1 ; // подготавливаем условие включения двигателя по количеству Stepmode-шагов 
  int tormoz = 0 ;
  int stepstakt = 0  ;
  int stepsout = 0;
  int taktout = 0 ;
  int n = 0 ;
 
void setup() {
  Serial.begin(9600);
  Serial.println();
  Serial.println();
  pinMode(startout, OUTPUT);
  pinMode(napravlenout, OUTPUT);
  pinMode(takt, OUTPUT);
  digitalWrite(startout, HIGH);
 
  lcd.begin(); // initialize the LCD
  lcd.clear(); // очистка дисплея
  lcd.backlight(); // включаем подсветку 
  lcd.setCursor(0,0);                // устанавливаем курсор в нужное место
  lcd.print("UnoStepperStepsLight"); // выводим неизменяемую информацию в void setup
  lcd.setCursor(0,1);      // устанавливаем курсор в нужное место
  lcd.print("USKOR");      // выводим неизменяемую информацию в void setup
  lcd.setCursor(12,1);     // устанавливаем курсор в нужное место
  lcd.print("ms/Tt/Tt");   // выводим неизменяемую информацию в void setup
  lcd.setCursor(0,2);   // устанавливаем курсор в нужное место
  lcd.print("SPEED");   // выводим неизменяемую информацию в void setup
  lcd.setCursor(12,2);  // устанавливаем курсор в нужное место
  lcd.print("ms/Takt"); // выводим неизменяемую информацию в void setup
  lcd.setCursor(3,3); // устанавливаем курсор в  нужное место
  lcd.print("STEPS"); // выводим неизменяемую информацию в void setup
  lcd.setCursor(9,3); // устанавливаем курсор в нужное место
  lcd.print("MODE");  // выводим неизменяемую информацию в void setup
  lcd.setCursor(13,3);     // устанавливаем курсор в нужное место
  lcd.print(sensstepmode); // выводим информацию

  lcd.setCursor(6,1);   // устанавливаем курсор в нужное место
  lcd.print(sensuskor); // выводим информацию
 
  if (sensnapravlenin == LOW) { digitalWrite(napravlenout, LOW); }
  else {
  digitalWrite(napravlenout, HIGH);
  }   
}
void loop() { 

 while(! digitalRead(startin)==0);
  delay(200); // задержка на дребезг контакта
  sensstartin = digitalRead(startin); // проверяем снятие сигнала "STOP" внутри цикла  "while", иначе из цикла не выйти

 while (sensstartin == 0 || intstartout == 0) { // while(пока) механическая коммутация даёт "СТОП" устанавливаем параметры будущего цикла: "НАПРАВЛЕНИЕ", "ПЕРИОД ТАКТА", "STEPMODE-ШАГИ"
  digitalWrite(startout, HIGH); // при фиксации сигнала "СТОП" включаем выход "СТАРТ", именно при высоком уровне отключаются силовые ключи, например, в драйвере A4988, DM2282
  intstartout = 1 ; // подготавливаем условие включения двигателя по количеству Stepmode-шагов

  senstimetakt = analogRead(timetakt);
  senstimetakt = constrain(senstimetakt , timetaktmin , timetaktmax); // не даём выйти из нужного нам диапазона
  lcd.setCursor(6,2);        // устанавливаем курсор в нужное место
  lcd.print("    ");         // вводим изменяемую информацию в void loop, здесь очищаем нужные ячейки
  lcd.setCursor(6,2);        // устанавливаем курсор в нужное место
  lcd.print(senstimetakt+0); // реальный "ПЕРИОД ТАКТА" с учётом задержки программы на выполнение и на индикацию (senstakt+zikl),где "zikl"-время цикла программы при прогоне на наименьшем "ПЕРИОДЕ ТАКТА".

  senssteps = analogRead(stepsin); // возможные значения от 0 до 1023
  senssteps = senssteps/10; // нам достаточно 100 Stepmode-шагов
  senssteps = constrain(senssteps , 1 , 100); // ноль Stepmode-шагов нам не нужно
  lcd.setCursor(0,3);   // устанавливаем курсор в нужное место
  lcd.print("   ");     // вводим изменяемую информацию в void loop, здесь очищаем нужные ячейки
  lcd.setCursor(0,3);   // устанавливаем курсор в нужное место
  lcd.print(senssteps); // вводим изменяемую информацию в void loop
  senstakt = senssteps*k ; // вычисляем количество тактов

  sensstartin = digitalRead(startin); // проверяем снятие сигнала "STOP" внутри цикла  "while", иначе из цикла не выйти
//  Serial.println();
 }

  delay(200); // задержка на механическую фиксацию наполняемой ёмкости   
  n=n+1;
  lcd.setCursor(16,3); // устанавливаем курсор в нужное место
  lcd.print("    ");   // вводим изменяемую информацию в void loop, здесь очищаем нужные ячейки
  lcd.setCursor(16,3); // устанавливаем курсор в нужное место
  lcd.print(n);        // реальный "ПЕРИОД ТАКТА" с учётом задержки программы на выполнение и на индикацию (senstakt+zikl),где "zikl"-время цикла программы при прогоне на наименьшем "ПЕРИОДЕ ТАКТА".
 while (sensstartin == 1 && intstartout == 1) { // while(пока) и вся коммутация даёт "СТАРТ" и не пройдено установленного количества Stepmode-шагов
//  zikl = millis();
 
  digitalWrite(startout, LOW);
         
  long longtime = long(timetaktmax) -long((senstakt - taktout))*long(sensuskor) ;

  if (dintimetakt < longtime) { tormoz = 1 ; } // условие начала торможения
  if (tormoz == 1 ){ dintimetakt = dintimetakt + sensuskor ; } // при торможении увеличиваем время такта
  if (tormoz == 0) { dintimetakt = dintimetakt - sensuskor ; } // при разгоне уменьшаем время такта до предельного
  dintimetakt = constrain(dintimetakt , senstimetakt , timetaktmax); // не даём выйти из нужного нам диапазона
  digitalWrite(takt, HIGH); // устанавливаем выход "ТАКТОВАЯ ЧАСТОТА" в HIGH, по этому фронту считает, например, драйвер L297
  delay(1) ; // наименьшее 1ms или, вообще, микросекунды delayMicroseconds(100);
  digitalWrite(takt, LOW); // устанавливаем выход "ТАКТОВАЯ ЧАСТОТА" в LOW, по этому фронту считает, например, драйвер DM2282
  delay(dintimetakt) ;
  taktout =taktout +1 ; // засчитываем такт
   
  sensstartin = digitalRead(startin); // проверяем появление сигнала "СТОП" внутри цикла  "while"
  if (taktout >= senstakt || sensstartin == 0) { // если пройдено рассчётное количество тактов или коммутация даёт "СТОП", подготавливаем выход из цикла
  digitalWrite(startout, HIGH);
  taktout = 0 ;
  dintimetakt = timetaktmax ;
  tormoz = 0 ;
  intstartout = 0 ; 
  }
//  zikl = millis() - zikl;
//  Serial.print(" zikl=");
//  Serial.print(zikl);
//  Serial.print(" STEPS=");
//  Serial.println();
 }

// независимый блок движения на участке, начало.
  int Steps2=0;// ввести с ноутбука количество тактов
  int TimeTakt2=100;// ввести с ноутбука время такта
  int TaktOut2=0;//начальная установка(обнуление счётчика тактов)
 while(TaktOut2 < Steps2 && sensstartin == 1 ) { // while(пока) и вся коммутация даёт "СТАРТ" и не пройдено установленного количества тактов
  digitalWrite(startout, LOW);
  digitalWrite(takt, HIGH); // устанавливаем выход "ТАКТОВАЯ ЧАСТОТА" в HIGH, по этому фронту считает, например, драйвер L297
  delay(1) ;   // наименьшее 1ms или, вообще, микросекунды delayMicroseconds(100);
  digitalWrite(takt, LOW); // устанавливаем выход "ТАКТОВАЯ ЧАСТОТА" в LOW, по этому фронту считает, например, драйвер DM2282
  delay(TimeTakt2) ;
  TaktOut2 =TaktOut2 +1 ; // засчитываем такт
  sensstartin = digitalRead(startin); // проверяем снятие сигнала "STOP" внутри цикла  "while", иначе из цикла не выйти
  if (TaktOut2 >= Steps2 || sensstartin==0) {digitalWrite(startout, HIGH);} // если пройдено заданное количество тактов или коммутация даёт "СТОП", подготавливаем выход из цикла 
 }
// независимый блок движения на участке, конец.

}
Вложения
20160523829 UNO-4988-4xD45H11-4xD44H11-OK130 119k.jpg
20160523829 UNO-4988-4xD45H11-4xD44H11-OK130 119k.jpg (116.93 КБ) Просмотров: 8467
uno
 
Сообщения: 5
Зарегистрирован: 27 фев 2015, 20:34

Re: UNO SHIELD L297

Сообщение uno » 30 июн 2016, 18:33

Вариант управления шаговым двигателем от начального положения до заданного количества шагов с возвратом в начальное положение.
Код: Выделить всё
/* uno_75245_stepper_steps_light_swing - UNO-управление шаговым двигателем "Качели".
  До включения переключателя "СТАРТ" задаём "ШАГИ", "СКОРОСТЬ". После включения "СТАРТ" ничего изменить не можем, или ждём прохождения цикла шагов и выключаем "СТАРТ" или прерываем цикл, выключая "СТАРТ".
*/
// вывод 1             занят "RESET"-перезапись и запуск программы
// вывод2=pin0         занят "RxD"-связь с ноутбуком по интерфейсу USB-UART
// вывод3=pin1         занят "TxD"-связь с ноутбуком по интерфейсу USB-UART
// вывод4=pin2         занят "TX"-GSM-модуля или "INT0"-внешнее прерывание выполнения программы                               
// вывод5=pin3         занят "RX"-GSM-модуля или "INT1"-внешнее прерывание выполнения программы                               
// вывод6=pin4         свободен под цифровой вход или выход
// вывод 7             занят под VCC=+5v
// вывод 8             занят под GND
// вывод 9             занят  под кварцевый осциллятор-вход
// вывод 10            занят под кварцевый осциллятор-выход
// вывод11=pin5        свободен под ШИМ-выход
// вывод12=pin6        свободен под ШИМ-выход
// вывод13=pin7        занят "Modem Reset"-GSM-модуля                                                                         
// вывод14=pin8        свободен под цифровой вход или выход
// вывод15=pin9        свободен под ШИМ-выход
// вывод16=pin10       занят   "SS"-связь по интерфейсу SPI с программатором или SD-card
// вывод17=pin11       занят "MOSI"-связь по интерфейсу SPI с программатором или SD-card
// вывод18=pin12       занят "MISO"-связь по интерфейсу SPI с программатором или SD-card
// вывод19=pin13       занят  "SCK"-связь по интерфейсу SPI с программатором или SD-card
// вывод 20            занят под AVCC=+5v
// вывод 21            занят под AREF-внутреннюю или! внешнюю подачу опорного напряжения
// вывод 22            занят под AGND
// вывод23=pin14=pinA0 свободен под аналоговый вход
// вывод24=pin15=pinA1 свободен под аналоговый вход
// вывод25=pin16=pinA2 свободен под аналоговый вход
// вывод26=pin17=pinA3 свободен под аналоговый вход
// вывод27=pin18=pinA4 занят под "SDA"-связь по интерфейсу I2C с внешними устройствами                                       
// вывод28=pin19=pinA5 занят под "SCL"-связь по интерфейсу I2C с внешними устройствами                                     

// итог: свободен pin8, pin4                 два цифровых входа или выхода
// итог: свободны pin5, pin6, pin9           три ШИМ-выхода,                       и уж ,конечно, и цифровых входа или выхода
// итог: свободны pin14, pin15, pin16, pin17 четыре аналоговых входа,              и уж ,конечно, и цифровых входа или выхода

// Используем плату UNO и шилд ПАСТОДАВ.
//// На шилде есть 2-штыревой разъём на кнопку "RESET+"-выносного дублёра кнопки "RESET" на шилде.
// На шилде есть 4-штыревой разъём с выходами "открытый коллектор" относительно +5v для оптически изолированного трёхсигнального интерфейса.
// На шилде есть 10-штыревой разъём с выходами на дисплей (задействованы всего 4 жилы).
// От 10-штыревого разъёма 4 жилы идут на дисплей, две из которых питание дисплея 5v и две интерфейс I2C. Активизация строк индикации влечёт уменьшение наибольшей скорости около 10ms/Takt на параметр индикации.
// На шилде есть 8-штыревой разъём на элементы ручного управления.

// Соединяем шилд ПАСТОДАВ с дисплеем через 10-штыревой разъём на шилде и 4-штыревой на дисплее, элементами ручного управления через 8-штыревой разъём, драйвером шагового двигателя через 4-штыревой разъём.
// Соединяем плату UNO и шилд ПАСТОДАВ.
// Соединяем плату UNO и ноутбук USB-кабелем.
// Кнопкой "RESET" или "RESET+" перезапускаем программу.                           
 
//// Вход "GSMrx"                                                    - считываем сигнал "GSMrx" от выхода TXD шилда GSM-M590             - цифровой   выход pin2
//// Выход "GSMtx"                                                   - выводим сигнал "GSMtx" на вход RXD шилда GSM-M590                 - цифровой   вход  pin3
//// Переключатель ""                                                - задаём полушаговый или полношаговый режим                         - цифровой   вход pin4
// Выход "НАПРАВЛЕНИЕ"                                             - автоматически приводит в соответствие с заданным                  - цифровой   выход pin5
// Переключатель "НАПРАВЛЕНИЕ", фиксирующий начальное положение    - устанавливаем направление от начального положения                 - цифровой   вход pin6
//// Вход "GSMreset"                                                 - выводим сигнал "GSMreset"                                         - цифровой   выход pin7
// Переключатели "СТАРТ/СТОП"                                      - "СТАРТ/СТОП ОБЩИЙ"+"СТАРТ/СТОП ОПЕРАЦИОННЫЙ"                      - цифровой   вход pin8
// Выход "СТАРТ/СТОП"                                              - высокий уровень соответствует "СТАРТ"                             - цифровой   выход pin9
//// Выход "SS"          - считываем сигнал "SS"                                                                                                           - цифровой   выход pin10
//// Выход "MOSI"        - считываем сигнал "MOSI"                                                                                                         - цифровой   выход pin11
//// Вход "MISO"         - выводим сигнал "MISO"                                                                                                           - цифровой   выход pin12
//// Выход "SCK"         - считываем сигнал "SCK"                                                                                                          - цифровой   выход pin13
// Переменный резистор "STEPMODE-ШАГИ"                             - задаём "STEPMODE-ШАГИ"(кратные 16...8...4...2...1 тактам)         - аналоговый вход pinA0
//// Переменный резистор "УСКОРЕНИЕ"                                 - задаём "УСКОРЕНИЕ", оптимальное подбираем опытным путём           - аналоговый вход pinA1
// Переменный резистор "ПЕРИОД ТАКТА"                              - задаём "ПЕРИОД ТАКТА", оптимальный подбираем опытным путём        - аналоговый вход pinA2
// Выход "ТАКТОВАЯ ЧАСТОТА"                                        - выводим тактовый импульс                                          - цифровой   выход pin17
// Выход "SDA" интерфейса I2C на монитор                           - передаёт информацию                                               - цифровой   выход pin18
// Выход "SCL" интерфейса I2C на монитор                           - синхронизирует передачу информации тактовым сигналом              - цифровой   выход pin19

// Загружаем программу со стандартным трёхсигнальным интерфейсом между UNO и драйвером шагового двигателя: "СТАРТ/СТОП", "НАПРАВЛЕНИЕ", "ТАКТОВАЯ ЧАСТОТА".
// the setup function runs once when you press reset or power the board
#include <Wire.h> // IDE 1.0.6.  C:\Program Files\Arduino\libraries\Wire\examples, utility, Wire.cpp 7532byte, Wire.h 2507byte
#include <LiquidCrystal_I2C.h>  // C:\Program Files\Arduino\libraries\Arduino-LiquidCrystal-I2C-library-master\examples, keywords.txt 1095byte, LiquidCrystal_I2C.cpp 6964byte, LiquidCrystal_I2C.h 4362byte, README md 523byte
  LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x27 for a 20 chars and 4 line display
  int startin = 8; // вход "СТАРТ/СТОП"
  int sensstartin = 0 ; 
  int startout = 9;

  int napravlenin = 6; // вход "НАПРАВЛЕНИЕ"
  int napravlenout = 5; // выход "НАПРАВЛЕНИЕ"

  int sensstepmode = 1; // задаём с ноутбука равным, установленному на драйвере, возможные значения 1...16
  int k = 4*sensstepmode ;
   
  int uskor = A1; // вход "УСКОРЕНИЕ"
  int sensuskor = 1023 ; // задаём с ноутбука в данной программе

  int timetakt = A2; // вход "ПЕРИОД ТАКТА"
  int timetaktmax = 100 ; // задаём с ноутбука, с этой длительности такта начнём движение (без учёта задержек программы на индикации), 1023-наибольшее значение
  int timetaktmin = 10 ;  // задаём с ноутбука, до этой длительности такта сможем разогнать двигатель, этот параметр не позволяет мощному двигателю сломать хрупкий насос
  int senstimetakt = 1023 ;
  int dintimetakt = timetaktmax ;

  int stepsin = A0; // вход "STEPMODE-ШАГИ"
  int senssteps = 1 ;
  int senstakt = 0 ;
 
  int takt = 17;

  int intstartout = 1 ; // подготавливаем условие включения двигателя по количеству Stepmode-шагов 
  int tormoz = 0 ;
  int stepstakt = 0  ;
  int stepsout = 0;
  int taktout = 0 ;
  int n = 0 ;
 
void setup() {
  Serial.begin(9600);
  Serial.println();
  Serial.println();
  pinMode(startout, OUTPUT);
  pinMode(napravlenout, OUTPUT);
  pinMode(takt, OUTPUT);
  digitalWrite(startout, HIGH);
 
  lcd.begin(); // initialize the LCD
  lcd.clear(); // очистка дисплея
  lcd.backlight(); // включаем подсветку 
  lcd.setCursor(0,0);                // устанавливаем курсор в нужное место
  lcd.print("UnoStepperStepsLight"); // выводим неизменяемую информацию в void setup
  lcd.setCursor(0,1);      // устанавливаем курсор в нужное место
  lcd.print("USKOR");      // выводим неизменяемую информацию в void setup
  lcd.setCursor(12,1);     // устанавливаем курсор в нужное место
  lcd.print("ms/Tt/Tt");   // выводим неизменяемую информацию в void setup
  lcd.setCursor(0,2);   // устанавливаем курсор в нужное место
  lcd.print("SPEED");   // выводим неизменяемую информацию в void setup
  lcd.setCursor(12,2);  // устанавливаем курсор в нужное место
  lcd.print("ms/Takt"); // выводим неизменяемую информацию в void setup
  lcd.setCursor(3,3); // устанавливаем курсор в  нужное место
  lcd.print("STEPS"); // выводим неизменяемую информацию в void setup
  lcd.setCursor(9,3); // устанавливаем курсор в нужное место
  lcd.print("MODE");  // выводим неизменяемую информацию в void setup
  lcd.setCursor(13,3);     // устанавливаем курсор в нужное место
  lcd.print(sensstepmode); // выводим информацию

  lcd.setCursor(6,1);   // устанавливаем курсор в нужное место
  lcd.print(sensuskor); // выводим информацию
 
}
void loop() { 

 while(! digitalRead(startin)==0);
  delay(200); // задержка на дребезг контакта
  sensstartin = digitalRead(startin); // дополнительно проверяем снятие сигнала "STOP" после задержки на дребезг контакта

 while (sensstartin == 0) { // while(пока) механическая коммутация даёт "СТОП" устанавливаем параметры будущего цикла: "ПЕРИОД ТАКТА", "STEPMODE-ШАГИ"
  digitalWrite(startout, HIGH); // при фиксации сигнала "СТОП" включаем выход "СТАРТ", именно при высоком уровне отключаются силовые ключи, например, в драйвере A4988, DM2282
  taktout = 0 ; // обнуляем счётчик тактов
  senstimetakt = analogRead(timetakt);
  senstimetakt = senstimetakt/10; // нам достаточно 100 ms/takt
  senstimetakt = constrain(senstimetakt , timetaktmin , timetaktmax); // не даём выйти из нужного нам диапазона
  lcd.setCursor(6,2);        // устанавливаем курсор в нужное место
  lcd.print("    ");         // вводим изменяемую информацию в void loop, здесь очищаем нужные ячейки
  lcd.setCursor(6,2);        // устанавливаем курсор в нужное место
  lcd.print(senstimetakt+0); // реальный "ПЕРИОД ТАКТА" с учётом задержки программы на выполнение и на индикацию (senstakt+zikl),где "zikl"-время цикла программы при прогоне на наименьшем "ПЕРИОДЕ ТАКТА".

  senssteps = analogRead(stepsin); // возможные значения от 0 до 1023
  senssteps = senssteps/100; // нам достаточно 10 Stepmode-шагов
  senssteps = constrain(senssteps , 1 , 9); // задаём с ноутбука, ноль Stepmode-шагов нам не нужно, не даём выйти из нужного нам диапазона
  lcd.setCursor(0,3);   // устанавливаем курсор в нужное место
  lcd.print("   ");     // вводим изменяемую информацию в void loop, здесь очищаем нужные ячейки
  lcd.setCursor(0,3);   // устанавливаем курсор в нужное место
  lcd.print(senssteps); // вводим изменяемую информацию в void loop
  senstakt = senssteps*k ; // вычисляем количество тактов
  senstakt = constrain(senstakt , 4 , 36); // задаём с ноутбука, ноль senstakt нам не нужно, не даём выйти из нужного нам диапазона, здесь, чтобы не доводить до удара рычага об ограничитель

  sensstartin = digitalRead(startin); // проверяем снятие сигнала "STOP" внутри цикла  "while", иначе из цикла не выйти
 }

  n=n+1;
  lcd.setCursor(16,3); // устанавливаем курсор в нужное место
  lcd.print("    ");   // вводим изменяемую информацию в void loop, здесь очищаем нужные ячейки
  lcd.setCursor(16,3); // устанавливаем курсор в нужное место
  lcd.print(n);        // выводим количество запусков двигателя, то есть потенциально возможное значение количества наполненных ёмкостей
  int sensnapravlenin = digitalRead(napravlenin);
  if (sensnapravlenin == 0) { digitalWrite(napravlenout, LOW); }
  if (sensnapravlenin == 1) { digitalWrite(napravlenout, HIGH); }
 while (sensstartin == 1 && sensnapravlenin == 1 && taktout < senstakt) { // while(пока) и вся коммутация даёт "СТАРТ", и двигатель в начальном положении, и не пройдено установленного количества тактов
  digitalWrite(startout, LOW);
         
  long longtime = long(timetaktmax) -long((senstakt - taktout))*long(sensuskor) ;
  if (dintimetakt < longtime) { tormoz = 1 ; } // условие начала торможения
  if (tormoz == 1 ){ dintimetakt = dintimetakt + sensuskor ; } // при торможении увеличиваем время такта
  if (tormoz == 0) { dintimetakt = dintimetakt - sensuskor ; } // при разгоне уменьшаем время такта до предельного
  dintimetakt = constrain(dintimetakt , senstimetakt , timetaktmax); // не даём выйти из нужного нам диапазона
  digitalWrite(takt, HIGH); // устанавливаем выход "ТАКТОВАЯ ЧАСТОТА" в HIGH, по этому фронту считает, например, драйвер L297
  delay(1) ; // наименьшее 1ms или, вообще, микросекунды delayMicroseconds(100);
  digitalWrite(takt, LOW); // устанавливаем выход "ТАКТОВАЯ ЧАСТОТА" в LOW, по этому фронту считает, например, драйвер DM2282
  delay(dintimetakt) ;
  taktout =taktout +1 ; // засчитываем такт
   
  sensstartin = digitalRead(startin); // проверяем появление сигнала "СТОП" внутри цикла  "while"
  if (taktout >= senstakt || sensstartin == 0) { // если пройдено рассчётное количество тактов или коммутация даёт "СТОП", подготавливаем выход из цикла
  digitalWrite(startout, HIGH);
//  taktout = 0 ;
  dintimetakt = timetaktmax ;
  tormoz = 0 ;
  }
 }

  sensnapravlenin = digitalRead(napravlenin);
  if (sensnapravlenin == 0) { digitalWrite(napravlenout, LOW); }
  if (sensnapravlenin == 1) { digitalWrite(napravlenout, HIGH); }
 while (sensstartin == 1 && sensnapravlenin == 0) { // while(пока) и вся коммутация даёт "СТАРТ" и двигатель не в начальном положении возвращаем двигатель в начальное положение
  digitalWrite(startout, LOW);
  digitalWrite(takt, HIGH); // устанавливаем выход "ТАКТОВАЯ ЧАСТОТА" в HIGH, по этому фронту считает, например, драйвер L297
  delay(1) ; // наименьшее 1ms или, вообще, микросекунды delayMicroseconds(100);
  digitalWrite(takt, LOW); // устанавливаем выход "ТАКТОВАЯ ЧАСТОТА" в LOW, по этому фронту считает, например, драйвер DM2282
  delay(20) ; // задаём с ноутбука время такта при возвращении двигателя в начальное положение
  sensnapravlenin = digitalRead(napravlenin); // проверяем, не вернулся-ли двигатель в начальное положение
  sensstartin = digitalRead(startin); // проверяем появление сигнала "СТОП" внутри цикла  "while"
  if (sensnapravlenin == 1 || sensstartin == 0) { // если двигатель вернулся в начальное положение или коммутация даёт "СТОП", подготавливаем выход из цикла
  digitalWrite(startout, HIGH);
  }
 }

/*
// независимый блок движения на участке, начало.
  delay(100);// для настройки
  int Takts2=0;// ввести с ноутбука количество тактов
  int TimeTakt2=20;// ввести с ноутбука время такта
  int TaktOut2=0;//начальная установка(обнуление счётчика тактов)
 while(TaktOut2 < Takts2) { // while(пока) не пройдено установленного количества тактов
  digitalWrite(startout, LOW);
  digitalWrite(napravlenout, LOW); // ввести с ноутбука LOW или HIGH
  digitalWrite(takt, HIGH); // устанавливаем выход "ТАКТОВАЯ ЧАСТОТА" в HIGH, по этому фронту считает, например, драйвер L297
  delay(1);   // наименьшее 1ms или, вообще, микросекунды delayMicroseconds(100);
  digitalWrite(takt, LOW); // устанавливаем выход "ТАКТОВАЯ ЧАСТОТА" в LOW, по этому фронту считает, например, драйвер DM2282
  delay(TimeTakt2);
  TaktOut2=TaktOut2+1; // засчитываем такт
//  sensstartin = digitalRead(startin); // проверяем снятие сигнала "STOP" внутри цикла  "while", иначе из цикла не выйти
  if (TaktOut2 >= Takts2) {digitalWrite(startout, HIGH);} // если пройдено заданное количество тактов или коммутация даёт "СТОП", подготавливаем выход из цикла 
 }
// независимый блок движения на участке, конец.
*/

}
Вложения
20160622850 пастодав установка 97k.jpg
20160622850 пастодав установка 97k.jpg (95.5 КБ) Просмотров: 8236
20160629856 пастодозатор 94k.jpg
20160629856 пастодозатор 94k.jpg (103.36 КБ) Просмотров: 8281
uno
 
Сообщения: 5
Зарегистрирован: 27 фев 2015, 20:34


Вернуться в Шилды (Shields)

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

cron
© 2009-2016 |  О проекте