


 Не хочу надоедать, но... может подскажете, могу я сам поменять какой-то параметр в прошивке, чтобы "растянуть" зону действия переменного резистора в регулировке оборотов?
 Не хочу надоедать, но... может подскажете, могу я сам поменять какой-то параметр в прошивке, чтобы "растянуть" зону действия переменного резистора в регулировке оборотов?

/*
Управление шаговиком (драйвер степ-дир) переменным резистором */
#define Step_pin 6 //вывод Arduino для ноги STEP контроллера
#define Dir_pin 5 //вывод Arduino для ноги DIR контроллера
#define Resistor_pin A0 //вывод Arduino резистора 0-5вольт
//Переменная для значения таймера
unsigned char timerLoadValue;
//Переменная дляколичества холостых циклов таймера
volatile unsigned char FullTimerCount;
volatile unsigned char FullTimer;
//значение минимальной частоты
#define LowFreq 20
//значение МАКСИмальной частоты
#define HighFreq 12000
//Переменная для шага чаcтоты на едниницу изменения АЦП
 float FreqStep;
//Переменная для текущего значения резистора
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);
//Установим на выходах 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);  
//Запускает таймер и получает загружаемое значение таймера.
//Параметр - желаемая частота в герцах.
 timerLoadValue=SetupTimer2(50);
 
//Установки Таймер2: Делитель частоты /8, режим 0
//Частота = 16MHz/256 = 62500 герц или
//Делитель /256 дает нам хороший рабочий диапазон
//так что сейчас мы просто жестко запрограммируем это.
TCCR2A = 0;
//TCCR2B = 1<<CS22 | 0<<CS21 | 0<<CS20; //это на 256
TCCR2B = 4;
 
//Подключение прерывания по переполнению Timer2
TIMSK2 = 1<<TOIE2;
 
//Выводит загружаемое значение таймера
Serial.print("Timer2 Load:");
Serial.println(timerLoadValue,HEX);
}
void loop() {
//Тут будем читать занчение 
sensorValue=analogRead(Resistor_pin);  
//Сравним значение со старым, если отличается - пересчитаем установку таймера
if (sensorValue!= OLDsensorValue)
  {  //Serial.println("ReCall");
    OLDsensorValue=sensorValue;
   timerLoadValue = SetupTimer2(LowFreq+FreqStep*sensorValue);
  }
/*
  Serial.print("sensor=");
  Serial.println(sensorValue,DEC);
  Serial.print("FullTimerCount");
  Serial.println(FullTimerCount);
  Serial.print("timer=");
  Serial.println(timerLoadValue,DEC);
   Serial.println("***");
      Serial.println("");
delay (1000);
*/
delay (10);
}
//Timer2 указатель вектора прерывания по переполнению
//Собственно говоря частота будет в два раза ниже.
ISR(TIMER2_OVF_vect) 
{
  if (FullTimerCount>1)
  {FullTimerCount--;}
  else
  {if (FullTimerCount==1)
      {TCNT2+=timerLoadValue;
       FullTimerCount=0;
      }
    {if (FullTimerCount==0)
        {
         FullTimerCount=FullTimer;
         //Переключение IO-вывода в другое состояние.
         digitalWrite(Step_pin,!digitalRead(Step_pin));
        //Перезагрузка таймера и коррекция по задержке
        if (FullTimerCount)
            {TCNT2=1;} //Если холостые циклы есть  - максимальное значение
        else
            {TCNT2+=timerLoadValue;}
        }
     }
   }
}
#define TIMER_CLOCK_FREQ 62500.0 
//15625 for /1024
//2MHz for /8 prescale from 16MHz
  //Установка Таймера2.
//Конфигурирует 8-битный Таймер2 ATMega168 для выработки прерывания
//с заданной частотой.
//Возвращает начальное значение таймера, которое должно быть загружено в TCNT2
//внутри вашей процедуры ISR.
//Смотри пример использования ниже.
unsigned char SetupTimer2(float timeoutFrequency){
unsigned char result; //Начальное значение таймера.
 
//Подсчет начального значения таймера
//Слегка усложним, добавив холостые просчеты
int ticks = TIMER_CLOCK_FREQ/timeoutFrequency;
FullTimer=ticks/256;
result=(int)(257.0-(ticks-(256*FullTimer)+0.5));
//257 на самом деле должно быть 256, но я получил лучшие результаты с 257.
 
 
//загружает таймер для первого цикла
if (FullTimer)
  {TCNT2=1;} //Если холостые циклы есть  - максимальное значение
else
    {TCNT2=result;}
return(result);
}
 ) и проведу тестдрайв.
 ) и проведу тестдрайв.





После выбора порта следует обязательно выбрать Сервис/Плата/Arduino Mini. К сожалению, здесь не все так просто. В зависимости от версии bootloader-а у вас может не получится записать программу в контроллер. Если после компиляции будет выдаваться ошибка типа
stk500_getsync(): not in sync: resp=0x00
, то скорее всего скорость COM порта среды разработки не совпадает с этим же параметром, заданным в bootloader. Чтобы это исправить, рекомендуется:
Выбрать Сервис/Плата/Arduino Nano. Обычно это помогает, но если не сработало, то см. следующий пункт.
В папке среды разработки находим файл "\hardware\arduino\avr\boards.txt". В этом файле находим секцию «mini.name=Arduino Mini» и далее параметр «menu.cpu.mini.atmega328.upload.speed=57600». Вот здесь пробуем менять значение 57600 (у вас может быть другое) на другие. Все возможные значения скоростей можно узнать в мониторе: меню Сервис/Монитор порта и здесь выбор в правом нижнем углу. Перед проверкой нужно перегружать среду разработки.

Вернуться в Arduino и другие Xduino
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0