Arduino pro mini для управления шаговым двигателем

Как собрать и запрограммировать робота на Arduino(Freeduino, Roboduino, Seeduino ...). Используем Wiring и Processing.

Re: Arduino pro mini для управления шаговым двигателем

Сообщение Revenger » 27 авг 2015, 02:17

Всё получается!
image.jpg

Только на мини нет ноги а7, я на а1 подправил код. :roll:
И частоту поставил максимум 1000, хотя можно и 1500, иначе очень медленно крутит. :)

Первые впечатления: Частота кнопками увеличивается независимо от максимума скетча, но при переключении на резистор снова ограничивается 999 (в моём случае), причем кнопками регулировка на малых оборотах лучше и чище чем резистором.
Если кнопками выставить частоту выше чем на резисторе, то при возврате на резистор частота сбрасывается на него (и справа остаётся лишний символ), что на мой взгляд плохо (вдруг кнопками настроили лучше и случайно нажали на функцию "резистор").
Я чуть поумничал и моргающим сделал не полностью символ, а стрелочку рядом. Но это уже красивости, это просто делать нечего было....
Кнопка Селект пока не фунциклирует? Ресет впрочем тоже.
Ну и потом надо будет еще повозиться и понять где все пины дисплея сзади выходят, а то я пины управления вывел с морды. :oops:

п.с. И еще заметил прикол: пока питание от ТТЛ-конвертора, т.е. прошил и ковыряюсь, то яркость надо накручивать побольше и работает всё чётко, а если питание от БП 12В через адаптор макетной платы (5В), то яркость приходится убавлять существенно и начинают глючить кнопки (путают свои места и фкнкции) и могут вместо символов появиться везде иероглифы хаотичные, вместо нужной латинницы. Попробую от БП компа 5В подать. Может лучше будет.

Добавлено спустя 3 часа 23 минуты 45 секунд:
Проверил. Тоже самое. Глючит что-то, но символы не портятся.
И еще момент: кнопками частота меняется по единице, но изменения в оборотах мотора происходят на слух кратно десятку.
Аватара пользователя
Revenger
 
Сообщения: 1728
Зарегистрирован: 01 ноя 2014, 00:50
Откуда: Ставрополье
ФИО: Александр

Re: Arduino pro mini для управления шаговым двигателем

Сообщение RootAdmin » 27 авг 2015, 11:18

Так... А частота кратно десятку в каком диапазоне частоты меняется? Сейчас протестирую, поправлю если где ошибся. Насчет кнопок - надо сверить резисторы, в разных платах могут различаться номиналы.
Дым, идущий из всех устройств в помещении предвещает появление электрика.
RootAdmin
 
Сообщения: 1725
Зарегистрирован: 07 авг 2010, 21:29
Откуда: КМВ
прог. языки: C
ФИО: Андрей

Re: Arduino pro mini для управления шаговым двигателем

Сообщение Revenger » 27 авг 2015, 12:08

Частота меняется по десятку всё время вроде. Держишь держишь кнопку, цифры бегут, а тональность мотора меняется только когда десяток отсчитается вроде.
Аватара пользователя
Revenger
 
Сообщения: 1728
Зарегистрирован: 01 ноя 2014, 00:50
Откуда: Ставрополье
ФИО: Александр

Re: Arduino pro mini для управления шаговым двигателем

Сообщение RootAdmin » 27 авг 2015, 17:44

Была ошибка в преобразовании типов. Поправил. Сейчас частота точная. :)
Код: Выделить всё
/*
Управление шаговиком (драйвер степ-дир) переменным резистором
теперь с кнопками! :)
А на этот раз - с экраном и резистивными кнопками.
v 0.4 */

/*
Вывод    Назначение
0        UART
1        UART
2       
3       
4       
5        Dir_pin
6        Step_pin     
7        LCD RS
8        LCD RW
9        LCD E
10       LCD DB4
11       LCD DB5
12       LCD DB6
13       LCD DB7
A0       Резистор
A1
A2
A3
A4       
A5       
A6
A7        Кнопки
*/

#include <LiquidCrystal.h> // Подключаем стандартную библиотеку LiquidCrystal
// Инициализируем объект-экран, передаём использованные
// для подключения контакты на Arduino в порядке:
#define lcd_RS_pin 7
#define lcd_RW_pin 8
#define lcd_E_pin 9
#define lcd_DB4_pin 10
#define lcd_DB5_pin 11
#define lcd_DB6_pin 12
#define lcd_DB7_pin 13
//                    RS,         RW,        E,         DB4,           DB5,       DB6,          DB7
LiquidCrystal lcd(lcd_RS_pin, lcd_RW_pin, lcd_E_pin, lcd_DB4_pin, lcd_DB5_pin, lcd_DB6_pin, lcd_DB7_pin);


#define Step_pin 6 //вывод Arduino для ноги STEP контроллера
#define Dir_pin 5 //вывод Arduino для ноги DIR контроллера
#define Resistor_pin A0 //вывод Arduino резистора 0-5вольт


//********** Кнопки:
#define btnRIGHT  1 //Определяем кнопки
#define btnUP     2
#define btnDOWN   3
#define btnLEFT   4
#define btnSELECT 5
#define btnNONE   0


#define btnDEFtime   30 //Значение для антидребезга - клавиша удерживаемая столько времени в миллисекундах считается нажатой.
#define btnPAUSEtime   400 //Значение в миллисекундах паузы между повторами
int lcd_key     = btnNONE;  //Для хранения полученного значеник кнопки
byte keyTemp = btnNONE; //Переменная для хранения временного состояния кнопок
byte keyCONTpress; //Переменная взводится после первого срабатывания клавиши и определяет автоповтор
unsigned long BtnTime; //Хранит время начала нажатия кнопок
byte btnCONTpress; //Переменная взводится после первого срабатывания клавиши и определяет автоповтор
byte btnTemp=btnNONE; //Для хранения номера ранее нажатой кнопки
#define ButtonPin A7 //Сюда подключены кнопки
//************


byte ControlMode = 0; //Переменная определяет режим управления. 0 - резистор. 1 - кнопки.

//Переменная для значения таймера
volatile unsigned char FullTimer0;
//Переменная для количества холостых 256циклов таймера
volatile unsigned int FullTimer256;//Переменная для количества холостых 256циклов таймера
volatile unsigned int FullTimer256Count; //внутренный счетчик таймера

//значение минимальной частоты
#define LowFreq 1
//значение МАКСИмальной частоты
#define HighFreq 10000
//Переменная для шага чаcтоты на едниницу изменения АЦП
float FreqStep;
int OutFreq = LowFreq; //Переменная для хранения установленной частоты



//Переменная для текущего значения резистора
int sensorValue = 0;
//Переменная для Старого значения резистора
int OLDsensorValue = 0;

void setup() {               
  // Конфигурим вывод Step_pin как выход
  pinMode(Step_pin,OUTPUT);
  // Конфигурим вывод Dir_pin как выход
  pinMode(Dir_pin,OUTPUT);
  // Конфигурим вывод Dir_pin как вход
  pinMode(Resistor_pin,INPUT);
 
  lcd.begin(16,2); //Инициализируем экран
 
 
  //Установим на выходах 0
  digitalWrite(Step_pin, LOW);
  digitalWrite(Dir_pin, LOW);
 
  // Посчитаем "шаг" изменения частоты на единицу изменения резистора
  FreqStep=(float)(HighFreq-LowFreq)/1024;
 
  //Запускает последовательный порт
  Serial.begin(9600);
 
  //Сообщение о запуске программы
  Serial.println("Program started"); 
  Serial.print("FreqStep="); 
  Serial.println(FreqStep); 
 
  //Запускает таймер и получает загружаемое значение таймера.
  //Параметр - желаемая частота в герцах.
 
   FullTimer0=SetupTimer2(50);
   
  //Установки Таймер2: Делитель частоты /8, режим 0
  //Частота = 16MHz/64 = 125000 герц или
  //Делитель /64 дает нам хороший рабочий диапазон
  //так что сейчас мы просто жестко запрограммируем это.
  TCCR2A = 0;
  TCCR2B = 1<<CS22 | 0<<CS21 | 0<<CS20; //это на 64

   
  //Подключение прерывания по переполнению Timer2
  TIMSK2 = 1<<TOIE2;
   
 
  //Выводит загружаемое значение таймера
  Serial.print("Timer2 Load:");
  Serial.println(FullTimer0,HEX);
 
  lcd.setCursor(0, 0); //устанавливаем курсор
  lcd.print("Stepper control"); //выводим на него  строку
  lcd.setCursor(0, 1); //устанавливаем курсор
  lcd.print("R   B   "); //выводим на него  строку
  lcd.setCursor(0, 1); //устанавливаем курсор
  lcd.cursor(); //Включим курсор
  lcd.blink(); //Пусть мигает
 
  delay(100);
}

void loop() {
  lcd_key=read_LCD_buttons(); //прочитаем нажатую кнопку
  if (lcd_key) //Нажата какая-то кнопка
  {
      Serial.print("Button=");
      Serial.println(lcd_key,DEC);
    if (btnRIGHT==lcd_key) //нажата кнопка ВПРАВО
    {
      lcd.setCursor(4, 1);
      ControlMode = 1;
    }
    if (btnLEFT==lcd_key) //нажата кнопка ВЛЕВО   
    {
      lcd.setCursor(0, 1);
      ControlMode = 0;
    }
  }


   if (ControlMode) //Если режим "кнопки"
     {
       if (btnUP==lcd_key) //Если нажата кнопка "Больше"
         {OutFreq+=1;}
       if (btnDOWN==lcd_key) //Если нажата кнопка "Меньше"
         {OutFreq-=1;} 
       if (lcd_key) //Если вообще что-то нажато
       {
         SetupTimer2(OutFreq);
         lcd.setCursor(0, 0);
         lcd.print("           ");
         lcd.setCursor(0, 0);
         lcd.print(FullTimer0);
         lcd.setCursor(6, 0);
         lcd.print(FullTimer256);

         
         lcd.setCursor(5, 1);
         lcd.print("   "); //чистим вывод
         lcd.setCursor(5, 1);
         lcd.print(OutFreq); //выводим Частоту
         lcd.setCursor(4, 1);
       }
     }
   else //Если режим резистор (светодиод выключен)
     {
        //Тут будем читать занчение
        sensorValue=analogRead(Resistor_pin); 
        //Сравним значение со старым, если отличается - пересчитаем установку таймера
        if (sensorValue!= OLDsensorValue)
          {  //Serial.println("ReCall"); //debug
           OLDsensorValue=sensorValue;
           OutFreq = LowFreq+FreqStep*sensorValue; //Вычислим новое значение частоты
           lcd.setCursor(1, 1);
           lcd.print("   "); //Чистим вывод
           lcd.setCursor(1, 1);
           lcd.print(OutFreq); //выводим Частоту
           lcd.setCursor(0, 1);
           SetupTimer2(OutFreq);
          }
     }

   
    /*
      Serial.print("sensor=");
      Serial.println(sensorValue,DEC);
      Serial.print("FullTimerCount");
      Serial.println(FullTimerCount);
      Serial.print("FullTimer");
      Serial.println(FullTimer,DEC);
     
      Serial.print("timer=");
      Serial.println(FullTimer0,DEC);
     
      Serial.print("ButtPressed=");
      Serial.println(ButtPressed,DEC);
      Serial.print("OutFreq=");
      Serial.println(OutFreq,DEC);
       Serial.println("***");
          Serial.println("");

    */
    delay (1);
}



//Timer2 указатель вектора прерывания по переполнению
//Собственно говоря частота будет в два раза ниже.
ISR(TIMER2_OVF_vect)
{
  if (FullTimer256Count>1)
  {FullTimer256Count--;}
  else
  {if (FullTimer256Count==1) //предпоследний цикл
      {
       TCNT2+=FullTimer0;
       FullTimer256Count=0;
      }
   {if (FullTimer256Count==0) // Срабатывание
        {
         FullTimer256Count=FullTimer256;
         //Переключение IO-вывода в другое состояние.
         digitalWrite(Step_pin,!digitalRead(Step_pin));
        //Перезагрузка таймера и коррекция по задержке
        if (FullTimer256)
            {TCNT2=1;} //Если холостые циклы есть  - максимальное значение
        else
            {TCNT2+=FullTimer0;}
        }

    }
  }
}


#define TIMER_CLOCK_FREQ 250000.0
//15625 for /1024
//2MHz for /8 prescale from 16MHz

  //Установка Таймера2.
//Конфигурирует 8-битный Таймер2 ATMega168 для выработки прерывания
//с заданной частотой.
//Возвращает начальное значение таймера, которое должно быть загружено в TCNT2
//внутри вашей процедуры ISR.
//Смотри пример использования ниже.
unsigned char SetupTimer2(float timeoutFrequency){
  //Подсчет начального значения таймера
  //Слегка усложним, добавив холостые просчеты
  long ticks = TIMER_CLOCK_FREQ/timeoutFrequency; // тиков счетчика для получения заданной частоты
  FullTimer256=ticks/256; //Вычисляем количество ПОЛНЫХ 256 циклов таймера
  ticks-=FullTimer256*256;
  FullTimer0=(byte)(257.0-(ticks+0.5));  //Вычисляем количество доплнительных тиков таймера
  //257 на самом деле должно быть 256, но я получил лучшие результаты с 257.

  //загружает таймер для первого цикла
  if (FullTimer256)
    {TCNT2=1;} //Если холостые циклы есть  - максимальное значение
  else
      {TCNT2=FullTimer0;}
}



// *****************************
//Чтение кнопок с антидребезгом
// read the buttons
int read_LCD_buttons()
{
int adc_key_in = analogRead(ButtonPin);      // Получаем напряжение с АЦП
byte btnTempTemp = btnNONE; //Переменная для хранения свежесчитанного внутри функции
//digitalWrite (LED_pin,0); //debug
//lcd.setCursor(5, 0); //debug
//lcd.print(adc_key_in); //debug
//delay (400); //debug
//Тут используем millis() для отслеживания нажатия кнопки
// Запоминиаем в переменной BtnTime ВРЕМЯ НАЧАЛА нажатия
// Запоминаем в переменной btnTemp нажатия
// Дефиним время антидребезга #define

if (adc_key_in > 950) //Ничего не нажато
  {
   //BtnTime=0; //Скидываем время нажатия
   btnCONTpress=0;
   return btnNONE; // We make ths the 1st option for speed reasons since it will be the most likely result
  }
else //что-то нажато
   {
      if (adc_key_in < 790) { btnTempTemp=btnSELECT; } //Определяем в переменную ТЕКУЩУЮ нажатую кнопку.
      if (adc_key_in < 555) { btnTempTemp=btnLEFT; }
      if (adc_key_in < 380) { btnTempTemp=btnDOWN; }
      if (adc_key_in < 195) { btnTempTemp=btnUP; }
      if (adc_key_in < 50)  { btnTempTemp=btnRIGHT; }

     //А тут проверим, совпадает ли с btnTemp (была ли нажата ранее)
/*     lcd.setCursor(0, 0); //debug
     lcd.print(btnTempTemp); //debug
     lcd.setCursor(2, 0); //debug
     lcd.print(btnTemp); //debug
     lcd.setCursor(1, 1); //debug
     lcd.print(millis()); //debug
     lcd.setCursor(12, 1); //debug
     digitalWrite (LED_pin,1); //debug
     delay (100);
     lcd.print("    "); //debug
     lcd.setCursor(12, 1); //debug
     lcd.print(adc_key_in); //debug
*/
     if (btnTempTemp==btnTemp) //Кнопка уже БЫЛА нажата
     {
        if (btnCONTpress) //Повторные установки клавиши
          {
            if ((millis()-BtnTime) > btnPAUSEtime)
            {
              BtnTime=millis(); // Ставим стартово время для автоповтора
              return btnTemp;
            }
          } 
        else //Первая установка клавиши
           {
              if ((millis()-BtnTime) > btnDEFtime)
              {
                btnCONTpress=1;
                BtnTime=millis(); // Ставим стартово время для автоповтора
                return btnTemp;
              }
           }
       
     }
     else //Раньше было другое состояние
     {
//       digitalWrite (LED_pin,1); //debug
//       delay (100);
       btnCONTpress=0;
       BtnTime=millis(); //Устанавливаем ТЕКУЩЕЕ время в переменную BtnTime
       btnTemp=btnTempTemp; //устанавливаем кнопку во временную переменную.
     }
   }
return btnNONE;   // Если ничего не сработало, то ничего не возвращаем
}
//***********************************
Дым, идущий из всех устройств в помещении предвещает появление электрика.
RootAdmin
 
Сообщения: 1725
Зарегистрирован: 07 авг 2010, 21:29
Откуда: КМВ
прог. языки: C
ФИО: Андрей

Re: Arduino pro mini для управления шаговым двигателем

Сообщение Revenger » 27 авг 2015, 21:26

Блин блинский. ... Интернет отключили, не смог попробовать. С телефона код и не скопирую без айтюнса этого долб.... (( ну подожду инет, как попробую отпишусь. Спасибо!
Аватара пользователя
Revenger
 
Сообщения: 1728
Зарегистрирован: 01 ноя 2014, 00:50
Откуда: Ставрополье
ФИО: Александр

Re: Arduino pro mini для управления шаговым двигателем

Сообщение RootAdmin » 28 авг 2015, 00:44

Ok. Да, сколько зубьев на шестерне? Проглядел страницы, не нашёл. Оборотов 5 в минуту?
ЗЫ айфон - зло. ;)
Дым, идущий из всех устройств в помещении предвещает появление электрика.
RootAdmin
 
Сообщения: 1725
Зарегистрирован: 07 авг 2010, 21:29
Откуда: КМВ
прог. языки: C
ФИО: Андрей

Re: Arduino pro mini для управления шаговым двигателем

Сообщение Revenger » 28 авг 2015, 01:18

Не то слово - зло (( Однако сейчас через него вышел, как через роутер. Мне так и не подключили интет гады Ростелеком...
Зубьев не помню, не смогу уже посмотреть... уматываю в столицы на выходные :sorry:
Примерно 40-60 оборотов, не меньше (если на максимуме). Ну не 5 точно.

Попробовал скетч. Реакция на кнопки чуть хуже стала. Не по 10 а по 20-40 теперь. Причем чем выше частота изначально, тем больше интервал изменения кнопками.

п.с. ну и чуть подправил код, чтобы отображалось корректно на дисплее (а то долго думал, что за слово сверху после нуля "trol" )) Тренируюсь. Кстати напомню, на ардуино мини про нет ноги А7.

Код: Выделить всё
/*
Управление шаговиком (драйвер степ-дир) переменным резистором
теперь с кнопками! :)
А на этот раз - с экраном и резистивными кнопками.
v 0.4 */

/*
Вывод    Назначение
0        UART
1        UART
2       
3       
4       
5        Dir_pin
6        Step_pin     
7        LCD RS
8        LCD RW
9        LCD E
10       LCD DB4
11       LCD DB5
12       LCD DB6
13       LCD DB7
A0       Резистор
A1        Кнопки
A2
A3
A4       
A5       
A6
A7
*/

#include <LiquidCrystal.h> // Подключаем стандартную библиотеку LiquidCrystal
// Инициализируем объект-экран, передаём использованные
// для подключения контакты на Arduino в порядке:
#define lcd_RS_pin 7
#define lcd_RW_pin 8
#define lcd_E_pin 9
#define lcd_DB4_pin 10
#define lcd_DB5_pin 11
#define lcd_DB6_pin 12
#define lcd_DB7_pin 13
//                    RS,         RW,        E,         DB4,           DB5,       DB6,          DB7
LiquidCrystal lcd(lcd_RS_pin, lcd_RW_pin, lcd_E_pin, lcd_DB4_pin, lcd_DB5_pin, lcd_DB6_pin, lcd_DB7_pin);


#define Step_pin 6 //вывод Arduino для ноги STEP контроллера
#define Dir_pin 5 //вывод Arduino для ноги DIR контроллера
#define Resistor_pin A0 //вывод Arduino резистора 0-5вольт


//********** Кнопки:
#define btnRIGHT  1 //Определяем кнопки
#define btnUP     2
#define btnDOWN   3
#define btnLEFT   4
#define btnSELECT 5
#define btnNONE   0


#define btnDEFtime   30 //Значение для антидребезга - клавиша удерживаемая столько времени в миллисекундах считается нажатой.
#define btnPAUSEtime   400 //Значение в миллисекундах паузы между повторами
int lcd_key     = btnNONE;  //Для хранения полученного значеник кнопки
byte keyTemp = btnNONE; //Переменная для хранения временного состояния кнопок
byte keyCONTpress; //Переменная взводится после первого срабатывания клавиши и определяет автоповтор
unsigned long BtnTime; //Хранит время начала нажатия кнопок
byte btnCONTpress; //Переменная взводится после первого срабатывания клавиши и определяет автоповтор
byte btnTemp=btnNONE; //Для хранения номера ранее нажатой кнопки
#define ButtonPin A1 //Сюда подключены кнопки
//************


byte ControlMode = 0; //Переменная определяет режим управления. 0 - резистор. 1 - кнопки.

//Переменная для значения таймера
volatile unsigned char FullTimer0;
//Переменная для количества холостых 256циклов таймера
volatile unsigned int FullTimer256;//Переменная для количества холостых 256циклов таймера
volatile unsigned int FullTimer256Count; //внутренный счетчик таймера

//значение минимальной частоты
#define LowFreq 1
//значение МАКСИмальной частоты
#define HighFreq 10000
//Переменная для шага чаcтоты на едниницу изменения АЦП
float FreqStep;
int OutFreq = LowFreq; //Переменная для хранения установленной частоты



//Переменная для текущего значения резистора
int sensorValue = 0;
//Переменная для Старого значения резистора
int OLDsensorValue = 0;

void setup() {               
  // Конфигурим вывод Step_pin как выход
  pinMode(Step_pin,OUTPUT);
  // Конфигурим вывод Dir_pin как выход
  pinMode(Dir_pin,OUTPUT);
  // Конфигурим вывод Dir_pin как вход
  pinMode(Resistor_pin,INPUT);
 
  lcd.begin(16,2); //Инициализируем экран
 
 
  //Установим на выходах 0
  digitalWrite(Step_pin, LOW);
  digitalWrite(Dir_pin, LOW);
 
  // Посчитаем "шаг" изменения частоты на единицу изменения резистора
  FreqStep=(float)(HighFreq-LowFreq)/1024;
 
  //Запускает последовательный порт
  Serial.begin(9600);
 
  //Сообщение о запуске программы
  Serial.println("Program started"); 
  Serial.print("FreqStep="); 
  Serial.println(FreqStep); 
 
  //Запускает таймер и получает загружаемое значение таймера.
  //Параметр - желаемая частота в герцах.
 
   FullTimer0=SetupTimer2(50);
   
  //Установки Таймер2: Делитель частоты /8, режим 0
  //Частота = 16MHz/64 = 125000 герц или
  //Делитель /64 дает нам хороший рабочий диапазон
  //так что сейчас мы просто жестко запрограммируем это.
  TCCR2A = 0;
  TCCR2B = 1<<CS22 | 0<<CS21 | 0<<CS20; //это на 64

   
  //Подключение прерывания по переполнению Timer2
  TIMSK2 = 1<<TOIE2;
   
 
  //Выводит загружаемое значение таймера
  Serial.print("Timer2 Load:");
  Serial.println(FullTimer0,HEX);
 
  lcd.setCursor(0, 0); //устанавливаем курсор
  lcd.print("Stepper control"); //выводим на него  строку
  lcd.setCursor(0, 1); //устанавливаем курсор
  lcd.print("R     B     "); //выводим на него  строку
  lcd.setCursor(0, 1); //устанавливаем курсор
  lcd.cursor(); //Включим курсор
  lcd.blink(); //Пусть мигает
 
  delay(100);
}

void loop() {
  lcd_key=read_LCD_buttons(); //прочитаем нажатую кнопку
  if (lcd_key) //Нажата какая-то кнопка
  {
      Serial.print("Button=");
      Serial.println(lcd_key,DEC);
    if (btnRIGHT==lcd_key) //нажата кнопка ВПРАВО
    {
      lcd.setCursor(6, 1);
      ControlMode = 1;
    }
    if (btnLEFT==lcd_key) //нажата кнопка ВЛЕВО   
    {
      lcd.setCursor(0, 1);
      ControlMode = 0;
    }
  }


   if (ControlMode) //Если режим "кнопки"
     {
       if (btnUP==lcd_key) //Если нажата кнопка "Больше"
         {OutFreq+=1;}
       if (btnDOWN==lcd_key) //Если нажата кнопка "Меньше"
         {OutFreq-=1;} 
       if (lcd_key) //Если вообще что-то нажато
       {
         SetupTimer2(OutFreq);
         lcd.setCursor(0, 0);
         lcd.print("                ");
         lcd.setCursor(0, 0);
         lcd.print(FullTimer0);
         lcd.setCursor(6, 0);
         lcd.print(FullTimer256);

         
         lcd.setCursor(7, 1);
         lcd.print("     "); //чистим вывод
         lcd.setCursor(7, 1);
         lcd.print(OutFreq); //выводим Частоту
         lcd.setCursor(6, 1);
       }
     }
   else //Если режим резистор (светодиод выключен)
     {
        //Тут будем читать занчение
        sensorValue=analogRead(Resistor_pin); 
        //Сравним значение со старым, если отличается - пересчитаем установку таймера
        if (sensorValue!= OLDsensorValue)
          {  //Serial.println("ReCall"); //debug
           OLDsensorValue=sensorValue;
           OutFreq = LowFreq+FreqStep*sensorValue; //Вычислим новое значение частоты
           lcd.setCursor(1, 1);
           lcd.print("     "); //Чистим вывод
           lcd.setCursor(1, 1);
           lcd.print(OutFreq); //выводим Частоту
           lcd.setCursor(0, 1);
           SetupTimer2(OutFreq);
          }
     }

   
    /*
      Serial.print("sensor=");
      Serial.println(sensorValue,DEC);
      Serial.print("FullTimerCount");
      Serial.println(FullTimerCount);
      Serial.print("FullTimer");
      Serial.println(FullTimer,DEC);
     
      Serial.print("timer=");
      Serial.println(FullTimer0,DEC);
     
      Serial.print("ButtPressed=");
      Serial.println(ButtPressed,DEC);
      Serial.print("OutFreq=");
      Serial.println(OutFreq,DEC);
       Serial.println("***");
          Serial.println("");

    */
    delay (1);
}



//Timer2 указатель вектора прерывания по переполнению
//Собственно говоря частота будет в два раза ниже.
ISR(TIMER2_OVF_vect)
{
  if (FullTimer256Count>1)
  {FullTimer256Count--;}
  else
  {if (FullTimer256Count==1) //предпоследний цикл
      {
       TCNT2+=FullTimer0;
       FullTimer256Count=0;
      }
   {if (FullTimer256Count==0) // Срабатывание
        {
         FullTimer256Count=FullTimer256;
         //Переключение IO-вывода в другое состояние.
         digitalWrite(Step_pin,!digitalRead(Step_pin));
        //Перезагрузка таймера и коррекция по задержке
        if (FullTimer256)
            {TCNT2=1;} //Если холостые циклы есть  - максимальное значение
        else
            {TCNT2+=FullTimer0;}
        }

    }
  }
}


#define TIMER_CLOCK_FREQ 250000.0
//15625 for /1024
//2MHz for /8 prescale from 16MHz

  //Установка Таймера2.
//Конфигурирует 8-битный Таймер2 ATMega168 для выработки прерывания
//с заданной частотой.
//Возвращает начальное значение таймера, которое должно быть загружено в TCNT2
//внутри вашей процедуры ISR.
//Смотри пример использования ниже.
unsigned char SetupTimer2(float timeoutFrequency){
  //Подсчет начального значения таймера
  //Слегка усложним, добавив холостые просчеты
  long ticks = TIMER_CLOCK_FREQ/timeoutFrequency; // тиков счетчика для получения заданной частоты
  FullTimer256=ticks/256; //Вычисляем количество ПОЛНЫХ 256 циклов таймера
  ticks-=FullTimer256*256;
  FullTimer0=(byte)(257.0-(ticks+0.5));  //Вычисляем количество доплнительных тиков таймера
  //257 на самом деле должно быть 256, но я получил лучшие результаты с 257.

  //загружает таймер для первого цикла
  if (FullTimer256)
    {TCNT2=1;} //Если холостые циклы есть  - максимальное значение
  else
      {TCNT2=FullTimer0;}
}



// *****************************
//Чтение кнопок с антидребезгом
// read the buttons
int read_LCD_buttons()
{
int adc_key_in = analogRead(ButtonPin);      // Получаем напряжение с АЦП
byte btnTempTemp = btnNONE; //Переменная для хранения свежесчитанного внутри функции
//digitalWrite (LED_pin,0); //debug
//lcd.setCursor(5, 0); //debug
//lcd.print(adc_key_in); //debug
//delay (400); //debug
//Тут используем millis() для отслеживания нажатия кнопки
// Запоминиаем в переменной BtnTime ВРЕМЯ НАЧАЛА нажатия
// Запоминаем в переменной btnTemp нажатия
// Дефиним время антидребезга #define

if (adc_key_in > 950) //Ничего не нажато
  {
   //BtnTime=0; //Скидываем время нажатия
   btnCONTpress=0;
   return btnNONE; // We make ths the 1st option for speed reasons since it will be the most likely result
  }
else //что-то нажато
   {
      if (adc_key_in < 790) { btnTempTemp=btnSELECT; } //Определяем в переменную ТЕКУЩУЮ нажатую кнопку.
      if (adc_key_in < 555) { btnTempTemp=btnLEFT; }
      if (adc_key_in < 380) { btnTempTemp=btnDOWN; }
      if (adc_key_in < 195) { btnTempTemp=btnUP; }
      if (adc_key_in < 50)  { btnTempTemp=btnRIGHT; }

     //А тут проверим, совпадает ли с btnTemp (была ли нажата ранее)
/*     lcd.setCursor(0, 0); //debug
     lcd.print(btnTempTemp); //debug
     lcd.setCursor(2, 0); //debug
     lcd.print(btnTemp); //debug
     lcd.setCursor(1, 1); //debug
     lcd.print(millis()); //debug
     lcd.setCursor(12, 1); //debug
     digitalWrite (LED_pin,1); //debug
     delay (100);
     lcd.print("    "); //debug
     lcd.setCursor(12, 1); //debug
     lcd.print(adc_key_in); //debug
*/
     if (btnTempTemp==btnTemp) //Кнопка уже БЫЛА нажата
     {
        if (btnCONTpress) //Повторные установки клавиши
          {
            if ((millis()-BtnTime) > btnPAUSEtime)
            {
              BtnTime=millis(); // Ставим стартово время для автоповтора
              return btnTemp;
            }
          } 
        else //Первая установка клавиши
           {
              if ((millis()-BtnTime) > btnDEFtime)
              {
                btnCONTpress=1;
                BtnTime=millis(); // Ставим стартово время для автоповтора
                return btnTemp;
              }
           }
       
     }
     else //Раньше было другое состояние
     {
//       digitalWrite (LED_pin,1); //debug
//       delay (100);
       btnCONTpress=0;
       BtnTime=millis(); //Устанавливаем ТЕКУЩЕЕ время в переменную BtnTime
       btnTemp=btnTempTemp; //устанавливаем кнопку во временную переменную.
     }
   }
return btnNONE;   // Если ничего не сработало, то ничего не возвращаем
}
//***********************************
Аватара пользователя
Revenger
 
Сообщения: 1728
Зарегистрирован: 01 ноя 2014, 00:50
Откуда: Ставрополье
ФИО: Александр

Re: Arduino pro mini для управления шаговым двигателем

Сообщение RootAdmin » 28 авг 2015, 01:34

Отлично. Сегодня протестирую снова. Может где ещё недоглядел. А реакция на кнопки - надо резисторы померить. Потом напишу какие.
Дым, идущий из всех устройств в помещении предвещает появление электрика.
RootAdmin
 
Сообщения: 1725
Зарегистрирован: 07 авг 2010, 21:29
Откуда: КМВ
прог. языки: C
ФИО: Андрей

Re: Arduino pro mini для управления шаговым двигателем

Сообщение Revenger » 28 авг 2015, 01:40

Хорошо. Просто от УСБ нормально работает (кнопки и дисплей), а от БП нет... Ну не буду же я всё время с компом ходить ))
Аватара пользователя
Revenger
 
Сообщения: 1728
Зарегистрирован: 01 ноя 2014, 00:50
Откуда: Ставрополье
ФИО: Александр

Re: Arduino pro mini для управления шаговым двигателем

Сообщение RootAdmin » 28 авг 2015, 11:45

Так значит - с резисторами все в полнейшем порядке. А БП - сколько вольт? Куда подключен? ИМХО (да наверняка!) просадка, которая сбивает АЦП.
Дым, идущий из всех устройств в помещении предвещает появление электрика.
RootAdmin
 
Сообщения: 1725
Зарегистрирован: 07 авг 2010, 21:29
Откуда: КМВ
прог. языки: C
ФИО: Андрей

Re: Arduino pro mini для управления шаговым двигателем

Сообщение Revenger » 29 авг 2015, 21:13

Привет.
БП от модема, на 12В 1А. На выходе адаптора макетки мультиметр показывает 4,9В. А вот питание от УСБ (на ноге ВСС ардуино)показывает менее 4В, дисплей тусклый довольно таки.
Аватара пользователя
Revenger
 
Сообщения: 1728
Зарегистрирован: 01 ноя 2014, 00:50
Откуда: Ставрополье
ФИО: Александр

Re: Arduino pro mini для управления шаговым двигателем

Сообщение RootAdmin » 30 авг 2015, 00:06

На ардуинке свой стабилихаор есть? Надо подать на его вход 12 вольт. Не знаю, что за стад на макетке, может шумит. Так основной рабочий диапазон - 1000-1500 гц?
ОК.
Дым, идущий из всех устройств в помещении предвещает появление электрика.
RootAdmin
 
Сообщения: 1725
Зарегистрирован: 07 авг 2010, 21:29
Откуда: КМВ
прог. языки: C
ФИО: Андрей

Re: Arduino pro mini для управления шаговым двигателем

Сообщение Revenger » 31 авг 2015, 17:37

Такс. Привет. Я на месте, могу продолжить эксперименты ))
Я не в курсе, есть ли там стабилизатор. Точно знаю, что когда случайно подал 12В вместо 5, то сгорела и ардуина и ТТЛ адаптор (был подсоединён). В теме отписывался ))

По частоте: лучше от 20 до 1500.
Аватара пользователя
Revenger
 
Сообщения: 1728
Зарегистрирован: 01 ноя 2014, 00:50
Откуда: Ставрополье
ФИО: Александр

Re: Arduino pro mini для управления шаговым двигателем

Сообщение RootAdmin » 31 авг 2015, 18:55

Так надо 12 вольт подавать на Vin ногу. Не на VCC. Сейчас посмотрел на свои pro ардуины - на всех есть. И ноги A6 A7 есть на некоторых.
Дым, идущий из всех устройств в помещении предвещает появление электрика.
RootAdmin
 
Сообщения: 1725
Зарегистрирован: 07 авг 2010, 21:29
Откуда: КМВ
прог. языки: C
ФИО: Андрей

Re: Arduino pro mini для управления шаговым двигателем

Сообщение Revenger » 31 авг 2015, 23:32

У моей нет вин. Нечто подобное, вроде бы, с торца, клемма raw (вроде читал, что с торца рав это как раз вход на её стабилизатор)
Но я попробую запитать от БК компа, как раньше и отпишусь.

Добавлено спустя 3 минуты 39 секунд:
Попробовал БП компа 5В. Тоже сбой и кнопки путаются. 12В боюсь подключать. Больше ардуин нету ((

Добавлено спустя 58 минут 15 секунд:
Поправочка: от БП компа работает, когда отключил ТТЛ-адаптор и проверил... пин RAW не реагирует на подачу на него 12В. Не удержался и проверил. ))

Добавлено спустя 3 часа 8 минут 27 секунд:
Ну и крайнее дополнение: и с БП от макетки работает. сам нехороший человек... не внимательный.. на одну часть 5В шло, а на другую (на макетке) 3,3В.
Вот. Но частота очень долго не меняется пока нажата кнопка. Так регулировать вряд ли получится. Проще резистором.
Аватара пользователя
Revenger
 
Сообщения: 1728
Зарегистрирован: 01 ноя 2014, 00:50
Откуда: Ставрополье
ФИО: Александр

Пред.След.

Вернуться в Arduino и другие Xduino

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

Сейчас этот форум просматривают: Bing [Bot] и гости: 0

cron