Программирование Arduino с несколькими циклами

Я пытался запрограммировать Arduino (вместе с подключенным контроллером двигателя) для переключения с цикла на цикл с помощью этой программы. Однако это не работает. Там все еще много места для хранения и динамической памяти, так что это не проблема. Это программа:

int EnablePin1 = 8;
int duty;
int period;
int cycle;

int PWMPinA1 = 11;  
int PWMPinB1 = 3;
int PWMPinA3 = 6;  
int PWMPinB3 = 5;

const byte CPin1 = A0;  

int CRaw1;      
void setup() {

    Serial.begin(9600);

    pinMode(EnablePin1, OUTPUT);

    pinMode(PWMPinA1, OUTPUT);
    pinMode(PWMPinB1, OUTPUT);
    pinMode(PWMPinA3, OUTPUT);
    pinMode(PWMPinB3, OUTPUT);

}

void loop() {
    digitalWrite(EnablePin1, HIGH); //включаем плату
    for (duty = 0; duty <= 255; duty += 15) 
    {

        analogWrite(PWMPinB1, 0); //Установить контакт B в 0, когда скорость записывается на контакт A

        analogWrite(PWMPinA1, 255);
        delay(850);
        if (PWMPinA1 == 11)
        {
            PWMPinA1 = 3;
            PWMPinB1 = 11;
        }
        else
        {
            PWMPinA1 = 11;
            PWMPinB1 = 3;
        }
   }
   analogWrite(PWMPinA1,0);//конец на максимальной скорости
   analogWrite(PWMPinB1,0);
   CRaw1 = analogRead(CPin1);

   Serial.println("Feedback");

   Serial.print(CRaw1);


   delay(2000);
   // аналоговая запись (PWMPinB3, 0);
   for (duty = 255; duty >= 0; duty -= 51) // скорость замедления
   {
       //аналоговая запись(PWMPinA1, долг);
       analogWrite(PWMPinB3, 0);
       analogWrite(PWMPinA3, 255);
       delay(period);
       // задержка (цикл);
       if(PWMPinA3 == 6)
       {
           PWMPinA3 = 5;
           PWMPinB3 = 6;
           // период = 850;
       }
       else
       {
           PWMPinA3 = 6;
           PWMPinB3 = 5;
          //период = 2500;
       }
   }
   analogWrite(PWMPinA3, 0); // устанавливаем скорость 0
   analogWrite(PWMPinB3, 0);
   delay(2000);

   digitalWrite(EnablePin1, LOW);// Переключить, чтобы сбросить чипы питания, если у нас была ошибка перегрузки по току или перегреву

   for (cycle = 1000; cycle < 9000; cycle += 4000) 
   {
       //цикл=период;
       period=cycle;
   }

 /*for (cycle = 2000; cycle <= 3000; cycle += 1000) 
   {
       //цикл=период;
       period=10000;
   }*/
   for (cycle = 9000; cycle >= 1000; cycle -= 8000) 
   {
       period=0;
   }

   // задержка (2000); // Поменяйте контакты местами, чтобы заставить двигатель изменить направление

}//конец основного цикла

Я также пытался сделать так, чтобы циклы циклов были такими:

 for (cycle = 0; cycle < 9000; cycle += 3000) 
 {
     //cycle=period;
     period=cycle;
 }
 for (cycle = 9000; cycle >= 0; cycle -= 9000) 
 {
     //cycle=period/3;
     period=cycle;
 }

Но это ничего не дало (я вижу, что выводы ШИМ питаются от светодиодов, и при первой попытке светодиоды загорелись только на 1 секунду, а при второй вообще не загорелись.

, 👍0

Обсуждение

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

Почему вы меняете значения номеров контактов? Не кажется хорошим. И что на самом деле должны делать циклы for? В настоящее время они устанавливают переменную period только несколько раз, ничего с ней не делая. Второй цикл выполняется только один раз. Переменная period больше никогда не используется. Эта часть кода абсолютно ничего не делает. Вам нужно гораздо больше объяснить, чего вы хотите добиться и какие с этим проблемы., @chrisl

duty следует переименовать: это не рабочий цикл, и его название вводит в заблуждение. period должен быть инициализирован перед использованием. Циклы над cycle следует удалить: они не несут никакой полезной пользы (и компилятор все равно их удалит). Самая большая проблема заключается в том, что при прочтении программы совершенно непонятна ее цель. И описание в вашем вопросе («переключение с цикла на цикл») не имеет смысла. Если вы хотите иметь хоть какую-то надежду получить полезный ответ, вам следует написать **четкое и полное** описание того, что должна делать программа., @Edgar Bonet


1 ответ


1

Во-первых, попробуйте использовать несколько функций и вызывать их из цикла()

Вы можете использовать магию кода для работы с многозадачностью на Arduino. Это немного сложно понять, но это работает.

Вот пример:

const int BROCHE_LED_1 = 13;
const int BROCHE_LED_2 = 12;
const int BROCHE_LED_3 = 11;

const unsigned long BLINK_INTERVAL_1 = 1000;
const unsigned long BLINK_INTERVAL_2 = 500;
const unsigned long BLINK_INTERVAL_3 = 2000;

недействительная установка () {

pinMode (BROCHE_LED_1, ВЫХОД);
pinMode (BROCHE_LED_2, ВЫХОД);
pinMode (BROCHE_LED_3, ВЫХОД);

цифровая запись (BROCHE_LED_1, НИЗКИЙ);
цифровая запись (BROCHE_LED_2, НИЗКИЙ);
цифровая запись (BROCHE_LED_3, НИЗКИЙ);
}

недействительный цикл () {

задача_лед1();
задача_лед2();
задача_led3();
}

пустота task_led1 () {
статический беззнаковый длинный предыдущаяMillisLed1 = 0;
статический байт etatBrocheLed1 = LOW;

unsigned long currentMillis = millis();


если (текущийMillis - предыдущийMillisLed1 >= BLINK_INTERVAL_1) {

предыдущийMillisLed1 = текущийMillis;

etatBrocheLed1 = !etatBrocheLed1;
digitalWrite(BROCHE_LED_1, etatBrocheLed1);
}
}

пустота task_led2() {
статический беззнаковый длинный предыдущаяMillisLed2 = 0;
статический байт etatBrocheLed2 = LOW;

unsigned long currentMillis = millis();


если (текущийMillis - предыдущийMillisLed2 >= BLINK_INTERVAL_2) {

предыдущийMillisLed2 = текущийMillis;

etatBrocheLed2 = !etatBrocheLed2;
digitalWrite(BROCHE_LED_2, etatBrocheLed2);
}
}

пустота task_led3 () {
статический без знака длинный предыдущаяMillisLed3 = 0;
статический байт etatBrocheLed3 = LOW;

unsigned long currentMillis = millis();

если (текущийMillis - предыдущийMillisLed3 >= BLINK_INTERVAL_3) {

предыдущийMillisLed3 = текущийMillis;

etatBrocheLed3 = !etatBrocheLed3;
digitalWrite(BROCHE_LED_3, etatBrocheLed3);
}
}

Во-вторых, попробуйте использовать операционную систему реального времени

Вы можете попробовать использовать FreeRTOS, она работает с большинством Arduino, и у вас есть много информации в Интернете.

Это делает многозадачность намного проще, чем в предыдущем примере.

Вот Документы, которые я нашел

,