Ребят. Помогите. Готов оплатить

Devil40rus
Offline
Зарегистрирован: 27.03.2014

1)Включился, считал из EEPROM положения конденсаторов и частоту сигнала, номер антенны(1)

2)Получили сигнал "старт тюнер":

1.определяем частоту

2.номер антенны

3.ищем в памяти

4.ставим если нашли из памяти

4.1.проверяем, если плохо, то дальше.

5.Ищем минимум КСВ

6.Записываем в память частоту, положения, номер антенны

Не могу дописать

  // Подключаем библиотеку дисплея:
#include <LiquidCrystal.h>
  // Подключаем библиотеку шагового двигателя:
#include <AccelStepper.h>
// Создает класс шагового двигателя и объявляет какими ножками:
AccelStepper stepper(AccelStepper::FULL4WIRE, 8, 9, 10, 11);
AccelStepper stepper2(AccelStepper::FULL4WIRE, 2, 3, 4, 5);
  // Подключаем EEPROM - запоминать лучшее положение:
#include <EEPROM.h>
  // Подключаем математические функции:
#include "math.h" 
  // Объявляем переменные и приводим их в порядок:
float f = 0;
float SWRpad = 0;
float SWRotr = 0;
float SWR = 0;
  // Прописываем пины индикатора:
LiquidCrystal lcd(10, 11, 12, 13, 14, 15);

void setup ()
{
analogReference(DEFAULT); // Стандартное опорное напряжение 5 В.
lcd.begin(16, 2); // Задаем размерность экрана, 2 строки по 16 символов.
  // Установление скорости оборотов двигателя в оборотах в минуту (RPM).
stepper.setMaxSpeed(300.0);
stepper.setAcceleration(100.0);
stepper.moveTo(1000000);
    
stepper2.setMaxSpeed(300.0);
stepper2.setAcceleration(100.0);
stepper2.moveTo(1000000); 
  // Указываем скорость работы с портом:
Serial.begin(9600);
}
void loop ()
{
value = EEPROM.read(a);
f = analogRead(A0); // Читаем частоту сигнала.
SWRpad = analogRead(A2);  // Читаем напряжение падающей волны.
SWRotr = analogRead(A1);  // Читаем напряжение отраженной волны.
  // Расчет и вывод КСВ:
SWR = (SWRpad + SWRotr)/(SWRpad - SWRotr);
  // Определяем номер шага и значение SWR - сравниваем, что запомнили вначале, если новое значение лучше, то запоминаем новое и номер шага.
  // После полного оборота выбираем лучшее.
lcd.setCursor(0, 0);
lcd.print("SWR");
if (SWR < 1.3) {
lcd.setCursor(4, 0);
lcd.print("<1.3");  
}
else if (SWR > 3) {
// Read new position
int f = analogRead(A0);
stepper.moveTo(f);
stepper.setSpeed(100);
stepper.runSpeedToPosition();
if (SWR < 1.3) {
lcd.setCursor(4, 0);
lcd.print(SWR) {

delay(1000);


  // Задержка и очистка экрана:
delay (100);
lcd.clear(); 
}

 

Devil40rus
Offline
Зарегистрирован: 27.03.2014

2 мотора

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

вам не кажется странным что вы собираетесь измерять частоту выше тактовой ардуины?

ставьте делитель обязательно перед ардуиной

мотора вроде 2 объявлено, а нарисовано 3. если я конечно правильно понял что это моторы. если это антенны где моторы?

или моторы на антеннах (читайте последний пункт)

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

тестируете подавая напряжения с потерциометров, а в реальных услових такие напряжения будут? просто если сигнал будет любой всегда  слабый не есть гуд. ацп всего 10бит + шум

по аналоговым входам лучше бы фильтр поставить

и самое главное. если хотите чтобы вам помогли рисуйте хоть аккуратнее. хоть в пайнте. а то выглядит что вам еще больше пофигу чем всем остальным

 

Devil40rus
Offline
Зарегистрирован: 27.03.2014

Помогите разобратся с кодом, я могу заплатить

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

до этого хоть какая-то картинка была, теперь вообще нет

а вообще задание неполное

1. из какого принципа выбирается антенна?

2. двигатели управляют антеннами или чем то другим? может подстраивают фильтры или регулируют мощность 

3. крутить нужно обе антенны одновременно или по другому принципу?

4. что ищем и что вставляем из памяти?

просто подойдите к заданию серьезнее и вам тогда смогут помочь. никто же не знает что у вас собрано и как именно должно работать

+ не понял, а как вы частоту через analogRead измеряете? у вас стоит преобразователь частота-напряжение или на варикапе измеряете?

 

Devil40rus
Offline
Зарегистрирован: 27.03.2014

1) Определяем частоту

2) Измеряем КСВ - если ксв > 1.3, то отображаем и записываем в память частоту, положения. Если ксв < 3, то крутим шаговые двигатели с конденсаторами до тех пор, пока не найдем минимум ксв. Нашли, отображаем, записываем в память(Определяем номер шага и значение SWR - сравниваем, что запомнили вначале, если новое значение лучше, то запоминаем новое и номер шага. После полного оборота выбираем лучшее.)

Devil40rus
Offline
Зарегистрирован: 27.03.2014

Devil40rus
Offline
Зарегистрирован: 27.03.2014

Давайте я вам объясню, у вас есть skype?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

да напишите просто

опеределяем частоту что значит? измеряем или из памяти считываем? предполагаю что измеряем

я не говорил что буду это делать. да и задание неполное. зачем выбирать антенну? каким образом измеряется частота?

я задал несколько вопросов. вы не ответили на все

p.s. а картинку так и не переделали. что же вы так ленитесь

Devil40rus
Offline
Зарегистрирован: 27.03.2014

Подскажите, как после полного шага, и найденного минимума ксв, запомнить позицию двигателя

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

тут лучше мне кажется делать ручное управление двигателем, а не через библиотеку (хотя может библиотека считает сколько шагов сделала, нужно с мотреть в код, но врядли).

сделать переменную типа long (или меньше. смотря сколько шагов требуется для полного поворота конденсатора) и с каждым шагом управления шаговым двигателем прибавлять к переменной 1, если в обратную сторону отнимать 1. это и будет текущее положение шаговика. только каждый раз в начале нужно калибровать. выставлять в нулевое положение мотор с конденсатором (от которого начинается движение) и обнулить переменную

только если вы конденсаторами управляете частотой, не проще измерить частоту и ее записывать. это если нужна частота при минимуме ксв

с другой стороны если вам нужна емкость конденсатора определить при минимуме ксв, тут другое дело и нужно конечно знать положение двигателя

а если и частоту и емкость, то делать и то и другое

Devil40rus
Offline
Зарегистрирован: 27.03.2014

Да, библиотека должна считывать сколько шагов, да, конденсаторами управляю частотой, а как ее записать? Помогите с кодом

// Подключаем библиотеку дисплея:
#include <LiquidCrystal.h>
// Подключаем библиотеку шагового двигателя:
  // Подключаем библиотеку шагового двигателя:
#include <Stepper.h>
  // Количество шагов на оборот:
#define STEPS 48
  // Создает класс шагового двигателя и объявляет какими ножками:
Stepper stepper(STEPS, 8, 9, 10, 11);
  // Второй мотор
Stepper stepper2(STEPS, 2, 3, 4, 5);
  // Подключаем EEPROM - запоминать лучшее положение:
#include <EEPROM.h>
  // Подключаем математические функции:
#include "math.h" 
  // Объявляем переменные и приводим их в порядок:
float SWRpad = 0;
float SWRotr = 0;
float SWR = 0;
  // Прописываем пины индикатора:
LiquidCrystal lcd(10, 11, 12, 13, 14, 15);
  // Текущие положение:
int cPos=0;

void setup ()
{
analogReference(DEFAULT); // Стандартное опорное напряжение 5 В.
lcd.begin(16, 2); // Задаем размерность экрана, 2 строки по 16 символов.
  // Установление скорости оборотов двигателя в оборотах в минуту (RPM).
stepper.setSpeed(30);
stepper2.setSpeed(30);
}
  // Указываем скорость работы с портом:
  Serial.begin(9600);
}
void loop ()
{
byte value = EEPROM.read(a);
SWRpad = analogRead(A2);  // Читаем напряжение падающей волны.
SWRotr = analogRead(A1);  // Читаем напряжение отраженной волны.
  // Расчет и вывод КСВ:
SWR = (SWRpad + SWRotr)/(SWRpad - SWRotr);
  // Определяем номер шага и значение SWR - сравниваем, что запомнили вначале, если новое значение лучше, то запоминаем новое и номер шага.
  // После полного оборота выбираем лучшее.
lcd.setCursor(0, 0);
lcd.print("SWR");
if (SWR < 1.3) {
lcd.setCursor(4, 0);
lcd.print("<1.3");
  // Задержка и очистка экрана:
delay (100);
lcd.clear();   
  } 
else if (SWR > 3) {
  // Один полный шаг.
stepper.step(1);
stepper2.step(1);

delay(1000); // Задержка определяется временем на шаг двигателя.
  // Один полный круг назад:
stepper.step(1);
stepper2.step1);
delay(1000);
  // Задержка и очистка экрана:
delay (100);
lcd.clear(); 

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

скажите вам нужна частота или емкость конденсаторов при минимуме ксв?

если частота ее надо либо измерить, либо расчитать из емкости зная характеристику генератора. первый путь точнее и проще. 

как вы измеряете частоту? спрашиваю снова

прежде чем помочь с кодом опишите как должно работать, нужно получить и как вы предполагаете что должно происходить? только подробно

блин я не телепат

Devil40rus
Offline
Зарегистрирован: 27.03.2014

Будет подключен частотомер, SWR meter ( SWRrefl = analogRead(A2); SWRinc = analogRead(A1);)

1) Считываем из ЭПЗУ частоту, положения двигателей.

2) Опредеяем частоту. Ищем в памяти. Ставим, если нашли, если нет, то дальше.

3) Определяем номер шага и значение SWR - сравниваем, что запомнили вначале, если новое значение лучше, то запоминаем новое и номер шага. После полного оборота выбираем лучшее. Выводим на дисплей. Записываем в память.

 

Devil40rus
Offline
Зарегистрирован: 27.03.2014

StartTxCw; // вкл.передачу

f=get+frec;

SWRrefl = analogRead(A2); 

SWRinc = analogRead(A1);)

SWR = // Формула.

if SWR<1.3 - STOP;

posxx=GetPos(f);

swrxx=GetSWR(f);

Getpos(int f) - по 6 значений на диапозоне

if ((f > 180) & ( f < 200))

f = 180;

case 160: pos = EEPROM:read()

break;

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

1. ардуина как из частотомера возьмет текущее значение частоты?

2. зачем считывать частоту и положение двигателей из памяти?

3. определили частоту. что ищем в памяти и зачем? что ставим если нашли? что значит ставим? записываем значение в память?

что вам нужно в итоге получить????

минимальное ксв и частоту при этом? для этого проверяете ксв во всем диапазоне и находите минимальное ксв и соответстующую частоту и записываете в память. так или не так?

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

Devil40rus
Offline
Зарегистрирован: 27.03.2014

нужно получить минимальный КСВ

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а частота неважна? насколько помню ксв минимально только в каком то узком диапазоне частот. и нужно знать ксв и частоту. а точнее минимальное ксв, и начало и конец диапазона частот при уровне 0,7 ксв (по памяти пишу, не помню точно. давненько это было)

а на остальные вопросы кто отвечать будет? вы не отвечаете - я ничего не пишу

Devil40rus
Offline
Зарегистрирован: 27.03.2014

1) Текущее значение частоты - RF - сигнал.

2) Нет, считывать не надо.

3) Определили частоту, и находим ксв.

Помогите пожалуйста

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ну уже ближе к реальности. 

1. что сигнал это понятно. но вы же измеряете частотомером. ардуина с частотомером связь имеет? данные может считать?

или арудина только минимальное ксв находит, но не знает на какой частоте это было, поэтому вам нужно знать положение мотора чтобы перегнать мотор в эту точку, где было минимальное ксв,  и по прибору вручную записать частоту. так или нет?

2. зачем выбирать антенну так и не ответили? у вас несколько измерительных установок, а плата ардуина одна на всех?

и что значит выбрать антенну? ардуина будет чем то управлять что будет переключать антенны?

Devil40rus
Offline
Зарегистрирован: 27.03.2014

Да, все правильно. Ардуино только минимально ксв находит.

Несколько,  а плата ардуина одна. Переключать не будет.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а вот изначально вы это могли написать? прочтите первое сообщение. разве догадаешься?

итак.  тут нужна информация по вашим двигателям и конденсаторам. сколько оборотов у конденсатора от начала и до конца. сколько шагов на оборот у шаговика

+ и тип двигателя униполярный или биполярный (биполярный 4 вывода, униполярный 5 и выше)

Devil40rus
Offline
Зарегистрирован: 27.03.2014

Извините:(

У конденсатора 180
Количество шагов на оборот шаговика 48.

биполярный

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

и того получается при 180градусах 24 шага полевика.

судя по картинке частота меняется от 1,8 до 30мгц

полоса 28,2мгц, шаг при этом шаговике 1,175мгц. вам не кажется что шаг крупный? или у вас еще редуктор стоит?

и еще непонятно зачем 2 шаговика? получается 2 конденсатора. зачем? тонкая и грубая настройка?

Devil40rus
Offline
Зарегистрирован: 27.03.2014

Будет подключено три мотора. Три конденсатора

Devil40rus
Offline
Зарегистрирован: 27.03.2014

Devil40rus пишет:

Будет подключено три мотора. Три конденсатора. Даа:(

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

зачем три? прицип объясняйте

Devil40rus
Offline
Зарегистрирован: 27.03.2014

Извините, грубая настройка. 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

все грубая настройка? на один генератор 3 конденсатора? кто что регулирует? или они все просто в паралель?

Devil40rus
Offline
Зарегистрирован: 27.03.2014

Прошу прощения, да, все в параллель

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

отлично. значит можно тонко регулировать

получается 24*24*24=13824 шага

28,2мгц/3824 шага=20,4кгц перестройка. это уже приемлимая точноть

а у вас ног арудуины под все хватит? 12 ног под шаговик, 6 под дисплей, 2 под измерения

итого 20 ног. в уно например как раз 20. ничего не забыл? а то больше ног нет. придется расширитель прицеплять

Devil40rus
Offline
Зарегистрирован: 27.03.2014

Да, хватит. Все правильно.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а драйверы для шаговых двигателей купили?

установка с шаговыми двигателями собрана или еще нет? если да то к каким пинам подключено для всех 3 двигателей (в вашем коде только 2)

можно конечно управлять по 2 проводам на мотор. но я лично не проверял, поэтому по 4 чтобы наверняка. а там можно и по 2 попробовать

Devil40rus
Offline
Зарегистрирован: 27.03.2014

Да, драйверы есть. Еще не собрана. Давайте по 4 проводам, а там посмотрим.

Stepper stepper(STEPS, 2, 3, 4, 5);
Stepper stepper2(STEPS, 6, 7, 8, 9);
Stepper stepper3(STEPS, 10, 11, 12, 13);
jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

дисплей и измерительные осталось написать куда и можно писать код

Devil40rus
Offline
Зарегистрирован: 27.03.2014

Дисплей и измерительные - напишите любые пины. Я там разберусь

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

хорошо. только наверно не сегодня. до завтра подождет?

Devil40rus
Offline
Зарегистрирован: 27.03.2014

Да, конечно. А во сколько примерно зайдете?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

я тут с 9 часов по москве. иногда раньше

Devil40rus
Offline
Зарегистрирован: 27.03.2014

Хорошо, я тогда с 9 вас буду ждать

Devil40rus
Offline
Зарегистрирован: 27.03.2014

Здраствуйте, вы про меня не забыли?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

попробуйте для начала запустить моторы

вот код

#include <Stepper.h>
#define STEPS 100


Stepper motor1(STEPS, 2, 3, 4, 5);
Stepper motor2(STEPS, 6, 7, 8, 9);
Stepper motor3(STEPS, 10, 11, 12, 13);

void setup()
{
  motor1.setSpeed(200);
}

void loop()
{
  motor1.step(480);
  motor2.step(480);
  motor3.step(480);
  
}

код фактически из примера. тут нужно просто проверить ваши подключения.

ваша задача в следующем: посмотреть на ваши конденсаторы. в какую сторону надо крутить для увеличения частоты.

например по часовой стрелке. теперь нужно чтобы моторы все крутились по часовой стрелке

если какой то мотор крутится не в ту сторону либо номера пинов для этого!!! мотора поменять в коде местами

например

Stepper motor1(STEPS, 2, 3, 4, 5);

не в тут сторону
значит надо менять местами. например первые 2

Stepper motor1(STEPS, 3, 2, 4, 5);

или не менять код а поменять местами провода подключения. выберите сами что удобнее

но это при условии что вы подключаете таким образом

http://arduino.cc/en/Reference/StepperBipolarCircuit

последняя картика. выводы которые между собой звонятся свить первыми, вторые звонящиеся 3 и 4 соответственно

 

Devil40rus
Offline
Зарегистрирован: 27.03.2014

Извините, не могу проверить в данный момент. Конденсаторы крутить по часовой стрелке. Я выберу, что удобнее

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Здравствуйте. хорошо пропустим этот момент, но это нужно обязательно сделать

следующий вопрос: вы не проверяли емкость конденсатора линейно увеличивается при повороте или нет? или вы не знаете?

проверить просто. разбить на несколько участков .например 5

и замерить в этих точках частоту генератора и дать мне эти данные. любой 1 конденсатор крутить, остальные не трогать

было бы проще если шаговики уже были подключены к конденсаторам

Devil40rus
Offline
Зарегистрирован: 27.03.2014

Прошу прощения, устройства нет рядом. Но емкость конденсатора увеличивается при повороте.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ну если будет возможность узнайте. можно будет добавить одну функцию

Devil40rus
Offline
Зарегистрирован: 27.03.2014

Да, хорошо

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

да и еще возвращает конденсаторы в положение с минимальным ксв

без железа мы тут глюки не отловим

да и еще. под дисплей осталось 4 пина всего. или использовать пины 0 и 1 (но могут возникнуть проблемы с программированием)

или дисплей подключать через i2c расширитель pcf8574 (что наиболее оптимально)

#include <Stepper.h>
#define STEPS 48
#define sped 200
#define PAD A0
#define OTR A1


float SWR;
float SWR_old;
float SWR_min;
int SWRpad;
int SWRotr;
boolean zapusk = 0;

byte step [2][3]; //первая строка текущее положение
                  //вторая строка положение с минимальным ксв
                  //мотор1, мотор2, мотор3

Stepper motor1(STEPS, 2, 3, 4, 5);
Stepper motor2(STEPS, 6, 7, 8, 9);
Stepper motor3(STEPS, 10, 11, 12, 13);

void setup()
{
  Serial.begin(9600);
  motor1.setSpeed(sped);
  motor1.setSpeed(sped);
  motor1.setSpeed(sped);
  zapusk = 1;
}

void loop()
{
  progon();
  Serial.print ("min KSV  ");
  Serial.println (SWR_min);
  perehod();
}


void progon(){
  if (zapusk == 1){
    for (byte i=0;i<25;i++){
      if (i>0)  motor1.step(1);                              //если не нулевое положение повернуть на 1 шаг
      step [0][0] = i;                                       //запоминаем значение 1 мотора
      for (byte y=0;y<25;y++){
        if (y>0)  motor2.step(1);                            //если не нулевое положение повернуть на 1 шаг
        step [0][1] = y;                                     //запоминаем значение 2 мотора
        for (byte k=0;k<25;k++){
          if (i>0)  motor3.step(1);                          //если не нулевое положение повернуть на 1 шаг
          step [0][2] = k;                                   //запоминаем значение 2 мотора
          SWRpad = analogRead(PAD);                          //измеряем
          SWRpad = analogRead(OTR);
          if (i==0 && y==0 && k==0) {                        //если в самом начале старому значению присваиваем
            SWR_old = (SWRpad + SWRotr)/(SWRpad - SWRotr);   //текущее
            SWR_min = SWR_old;                               //минимальное ксв равно этому значению
            //т.к. других данных еще нет
          }
          else SWR_old = SWR;
          SWR = (SWRpad + SWRotr)/(SWRpad - SWRotr);
          if(SWR <SWR_old){
            SWR_min = SWR;
            for(byte n=0;n<3;n++){
              step [1][n] = step [0][n];
            }
          }
        }
        motor3.step(-24);
      }
      motor2.step(-24);
    }
    zapusk = 0;
  }
}

void perehod(){
  motor1.step(step [1][0]-step [0][0]);
  motor2.step(step [1][1]-step [0][1]);
  motor3.step(step [1][2]-step [0][2]);
  for(byte n=0;n<3;n++){
    step [0][n] = step [1][n];
  }
}

 

Devil40rus
Offline
Зарегистрирован: 27.03.2014

Большое спасибо вам. Вы молодец. Сколько я вам должен?

Извините, а можно все записать в EEPROM?

8 бит

10 бит

10 бит

4 бит

Частота

Положение C1

Положение C2

NANT

1 байт

2 байта

2 байта

 

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

это еще не все. нужно еще калибровку изначальную делать, точнее выставить в 0 конденсаторы

это делать или руками,

или программа сама переведет в ноль. но тут условие чтобы моторы не были сликом мощные и не свернули конденсатор (шагов на двигатель дадим немного больше чем нужно). или добавить концевые выключатели

и еще нужно определить практически сколько шагов нужно для полного поворота конденсатора (а то программа будет или меньше или больше чем нужно считать)

связаться со мной можете по почте jeka_tm@mail.ru

записать в еепром можно, но зачем?

и еще как ардуина узнает частоту? вводить как то хотите?

да и вашей картинке всего 2 конденсатора указано, а их 3 как вы говорили ранее

если дадите мне характеристику зависимости частоты от положения конденсатора можно сделать программный расчет примерной частоты, точную нужно смотреть по прибору

нашел в коде ошибку. сейчас исправлю

#include <Stepper.h>
#define STEPS 48
#define sped 200
#define PAD A0
#define OTR A1


float SWR;
float SWR_min;
int SWRpad;
int SWRotr;
boolean zapusk = 0;

byte step [2][3]; //первая строка текущее положение
                  //вторая строка положение с минимальным ксв
                  //мотор1, мотор2, мотор3

Stepper motor1(STEPS, 2, 3, 4, 5);
Stepper motor2(STEPS, 6, 7, 8, 9);
Stepper motor3(STEPS, 10, 11, 12, 13);

void setup()
{
  Serial.begin(9600);
  motor1.setSpeed(sped);
  motor1.setSpeed(sped);
  motor1.setSpeed(sped);
  zapusk = 1;
}

void loop()
{
  progon();
  Serial.print ("min KSV  ");
  Serial.println (SWR_min);
  perehod();
}


void progon(){
  if (zapusk == 1){
    for (byte i=0;i<25;i++){
      if (i>0)  motor1.step(1);                      //если не нулевое положение повернуть на 1 шаг
      step [0][0] = i;                               //запоминаем значение 1 мотора
      for (byte y=0;y<25;y++){
        if (y>0)  motor2.step(1);                    //если не нулевое положение повернуть на 1 шаг
        step [0][1] = y;                             //запоминаем значение 2 мотора
        for (byte k=0;k<25;k++){
          if (i>0)  motor3.step(1);                  //если не нулевое положение повернуть на 1 шаг
          step [0][2] = k;                           //запоминаем значение 2 мотора
          SWRpad = analogRead(PAD);                  //измеряем
          SWRpad = analogRead(OTR);
          SWR = (SWRpad + SWRotr)/(SWRpad - SWRotr); //измеряем ксв       
          if (i==0 && y==0 && k==0) {                //если самое начало то мин. ксв равно текущему
            SWR_min = SWR;
          }
          if(SWR < SWR_min){                         //если текущее КСВ меньше минимального
            SWR_min = SWR;                           //минимальное равно текущему
            for(byte n=0;n<3;n++){                   //запоминаем текущее положение моторов
              step [1][n] = step [0][n];
            }
          }
        }
        motor3.step(-24);                            //возвращаем мотор3 в ноль
      }
      motor2.step(-24);                              //возвращаем мотор2 в ноль
    }
    zapusk = 0;                                      //блокируем постоянное сканирование
  }
}

void perehod(){
  motor1.step(step [1][0]-step [0][0]);              //возвращаем моторы в место мин. ксв
  motor2.step(step [1][1]-step [0][1]);              //текущему положению присваиваем положение
  motor3.step(step [1][2]-step [0][2]);              //мин. ксв (моторы так как здесь)
  for(byte n=0;n<3;n++){
    step [0][n] = step [1][n];
  }
}

 

Devil40rus
Offline
Зарегистрирован: 27.03.2014

Извините, нужно идти. Я с вами свяжусь через 2-3 часа
Еще раз спасибо, но любой труд оплачивается