
Не знаю, сейчас верно или нет, но без ЕН+ мотор крутится медленно против часовой стрелки. Тихо, почти не слышно звук. Светодиод на драйвере моргает примерно 2-3 раза в сек.
Это победа?
![]() |
roboforum.ruТехнический форум по робототехнике. |
|
RootAdmin писал(а):Да!
Допишу скетч (плавный старт и управление) и будем пробовать.
/*
Управление шаговиком (драйвер степ-дир) переменным резистором */
#define Step_pin 6 //вывод Arduino для ноги STEP контроллера
#define Dir_pin 5 //вывод Arduino для ноги DIR контроллера
#define Resistor_pin A0 //вывод Arduino для ноги DIR контроллера
//Переменная для значения таймера
unsigned char timerLoadValue;
//значение минимальной частоты
#define LowFreq 20
//значение МАКСИмальной частоты
#define HighFreq 300
//Переменная для шага ча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);
//Выводит загружаемое значение таймера
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.println(sensorValue,DEC);
// Serial.println(timerLoadValue,DEC);
//delay (100);
}
//Timer2 указатель вектора прерывания по переполнению
//Собственно говоря частота будет в два раза ниже.
ISR(TIMER2_OVF_vect) {
//Переключение IO-вывода в другое состояние.
digitalWrite(Step_pin,!digitalRead(Step_pin));
//Перезагрузка таймера и коррекция по задержке
TCNT2+=timerLoadValue;
}
#define TIMER_CLOCK_FREQ 15625.0
//15625 for /1024
//2MHz for /8 prescale from 16MHz
//Установка Таймера2.
//Конфигурирует 8-битный Таймер2 ATMega168 для выработки прерывания
//с заданной частотой.
//Возвращает начальное значение таймера, которое должно быть загружено в TCNT2
//внутри вашей процедуры ISR.
//Смотри пример использования ниже.
unsigned char SetupTimer2(float timeoutFrequency){
unsigned char result; //Начальное значение таймера.
//Подсчет начального значения таймера
result=(int)((257.0-(TIMER_CLOCK_FREQ/timeoutFrequency))+0.5);
//257 на самом деле должно быть 256, но я получил лучшие результаты с 257.
//Установки Таймер2: Делитель частоты /8, режим 0
//Частота = 16MHz/1024 = 15625 герц или 64 мкс
//Делитель /1024 дает нам хороший рабочий диапазон
//так что сейчас мы просто жестко запрограммируем это.
TCCR2A = 0;
//TCCR2B = 0<<CS22 | 1<<CS21 | 0<<CS20; //это на 8
TCCR2B = 7;
//Подключение прерывания по переполнению Timer2
TIMSK2 = 1<<TOIE2;
//загружает таймер для первого цикла
TCNT2=result;
return(result);
}
Вернуться в Arduino и другие Xduino
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0