MAL4X Научно-технический форум разработчиков симуляторов и автоматики


Симуляторы перегрузок. DIY электроника. ЭВМ. Компьютерные сети.
Up

X-SIM по - русски. Рекомендации практиков. Модернизации. 6 Ч

Строим реалистичный симулятор перегрузок своими руками. Рекомендации. Советы.

Модераторы: Death_Morozz, null, Ale

Сообщение AlexVr » 20 мар 2012, 12:21

Наконец-то собрал новую платформу на двух асинхрониках с редукторами и частотниками.
Частотниками управляет Н-мост.
Фотки сброшу чуть позже.
Есть одна проблема - обратная связь. Неоднократно обсуждалась. У меня используется 2 магнита и датчики холла, как у null. Добился устойчивого нулевого положения, но при работе (наклоне платформы) она не фиксируется, а раскачивается +- 5 гр. Дело не в люфтах, их нет. Задержки частотника на разгон и реакцию ОС не спасают. Дело в датчиках и магнитах, а также в схеме Таноса нет четкого положения платформы, мост всегда "раскачивается". Выход - энкодер. В идеале энкодер абсолютный, питание 5В, диапазон 180 гр., дискретность 1024, выход линейный аналоговый 0 - 5 В. Но такие стоят космических денег.
Лопатя Инет, наткнулся на http://cxem.net/arduino/arduino8.php
http://linuxcenter.ru/shop/e...ino/arduino_uno/

То что надо - могут использоваться любые инкрементальные энкодеры, при подаче питания на выходе 2,5В. Угловой диапазон регулируется количеством импульсов на 1 оборот (в нашем случае полоборота). Вопрос - можно ли использовать наш Атмег вместо ATmega328p, новый программатор паять не хочется.
В создании hex я не силен. Кто сможет помочь скомпилировать нужный файл прошивки из исходников:
/*
** Rotary Encoder Example
** Use the Sparkfun Rotary Encoder to vary brightness of LED
**
** Sample the encoder at 200Hz using the millis() function
*/

int brightness = 120; // how bright the LED is, start at half brightness
int fadeAmount = 10; // how many points to fade the LED by
unsigned long currentTime;
unsigned long loopTime;
const int pin_A = 12; // pin 12
const int pin_B = 11; // pin 11
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev=0;

void setup() {
// declare pin 9 to be an output:
pinMode(9, OUTPUT);
pinMode(pin_A, INPUT);
pinMode(pin_B, INPUT);
currentTime = millis();
loopTime = currentTime;
}

void loop() {
// get the current elapsed time
currentTime = millis();
if(currentTime >= (loopTime + 5)){
// 5ms since last check of encoder = 200Hz
encoder_A = digitalRead(pin_A); // Read encoder pins
encoder_B = digitalRead(pin_B);
if((!encoder_A) && (encoder_A_prev)){
// A has gone from high to low
if(encoder_B) {
// B is high so clockwise
// increase the brightness, dont go over 255
if(brightness + fadeAmount <= 255) brightness += fadeAmount;
}
else {
// B is low so counter-clockwise
// decrease the brightness, dont go below 0
if(brightness - fadeAmount >= 0) brightness -= fadeAmount;
}

}
encoder_A_prev = encoder_A; // Store value of A for next time

// set the brightness of pin 9:
analogWrite(9, brightness);

loopTime = currentTime; // Updates loopTime
}
// Other processing can be done here

}

русскоязычный вариант

/*
** Энкодер
** Для управлением яркостью LED используется энкодер Sparkfun
*/

int brightness = 120; // яркость LED, начинаем с половины
int fadeAmount = 10; // шаг изменения яркости LED
unsigned long currentTime;
unsigned long loopTime;
const int pin_A = 12; // pin 12
const int pin_B = 11; // pin 11
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev=0;

void setup() {
// declare pin 9 to be an output:
pinMode(9, OUTPUT); // устанавливаем pin 9 как выход
pinMode(pin_A, INPUT);
pinMode(pin_B, INPUT);
currentTime = millis();
loopTime = currentTime;
}

void loop() {
currentTime = millis();
if(currentTime >= (loopTime + 5)){ // проверяем каждые 5мс (200 Гц)
encoder_A = digitalRead(pin_A); // считываем состояние выхода А энкодера
encoder_B = digitalRead(pin_B); // считываем состояние выхода А энкодера
if((!encoder_A) && (encoder_A_prev)){ // если состояние изменилось с положительного к нулю
if(encoder_B) {
// выход В в полож. сост., значит вращение по часовой стрелке
// увеличиваем яркость, не более чем до 255
if(brightness + fadeAmount <= 255) brightness += fadeAmount;
}
else {
// выход В в 0 сост., значит вращение против часовой стрелки
// уменьшаем яркость, но не ниже 0
if(brightness - fadeAmount >= 0) brightness -= fadeAmount;
}

}
encoder_A_prev = encoder_A; // сохраняем значение А для следующего цикла

analogWrite(9, brightness); // устанавливаем яркость на 9 ножку

loopTime = currentTime;
}
}


Из минусов - при использовании данной схемы выключать питание можно только в исходном состоянии платформы - выход бесперебойник. Может я до конца не разобрался эта схема ведь не может запоминать последнее положение энкодера при выключении питания?

Конечно абсурд сопрягать два цифровых устройства по аналоговой связи, но что делать - исходников Таноса ведь нет...

Тема закрыта! Продолжение в теме "X-SIM по - русски. Рекомендации практиков. Модернизации. 6 Часть - 2".
Аватара пользователя
AlexVr
SIMER
 
Сообщения: 449
Зарегистрирован: 05 апр 2010, 20:48
Благодарил (а): 23 раз.
Поблагодарили: 32 раз.
Баллы репутации: 71
Технарь

Пред.

Вернуться в X-SIMULATOR и RU-SIMULATOR & SimTools

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

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

x

#{title}

#{text}