/*
Управление шаговиком (драйвер степ-дир) переменным резистором */
#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
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9