Массивы

Тема в разделе "Arduino & Shields", создана пользователем Weazzy, 4 апр 2017.

  1. Weazzy

    Weazzy Нуб

    Добрый день.
    Появилась нужда запустить и удаленно управлять bldc-двигателем. В связи с чем был собран драйвер на полевиках, через который я и коммутирую обмотки в соответствии со значениями датчиков Холла.
    Набросал по-быстрому скетч, всё работает, но он большой и страшный, аки ультралиск после месячного запоя.
    Код (C++):
    #define pwm 3
    #define pot A0
    void setup() {
      pinMode(5, INPUT);
      pinMode(6, INPUT);
      pinMode(7, INPUT);
      pinMode(8, OUTPUT);
      pinMode(9, OUTPUT);
      pinMode(10, OUTPUT);
      pinMode(11, OUTPUT);
      pinMode(12, OUTPUT);
      pinMode(13, OUTPUT);
      pinMode(pwm, OUTPUT);
      pinMode(pot, INPUT);
    }

    void loop()

    {
      int x;
      x = analogRead(pot)/4;
      analogWrite(pwm, x);
      if(digitalRead(5) == HIGH && digitalRead(6) == LOW && digitalRead(7) == HIGH)
        {
          digitalWrite(8, HIGH);
          digitalWrite(11, HIGH);
          digitalWrite(9, LOW);
          digitalWrite(10, LOW);
          digitalWrite(12, LOW);
          digitalWrite(13, LOW);
          }
       else if (digitalRead(5) == LOW && digitalRead(6) == LOW && digitalRead(7) == HIGH)
        {
          digitalWrite(8, HIGH);
        digitalWrite(12, HIGH);
        digitalWrite(9, LOW);
        digitalWrite(10, LOW);
        digitalWrite(11, LOW);
        digitalWrite(13, LOW);
        }
       else if (digitalRead(5) == LOW && digitalRead(6) == HIGH && digitalRead(7) == HIGH)
        {
          digitalWrite(9, HIGH);
        digitalWrite(12, HIGH);
        digitalWrite(8, LOW);
        digitalWrite(10, LOW);
        digitalWrite(11, LOW);
        digitalWrite(13, LOW);
        }
       else if (digitalRead(5) == LOW && digitalRead(6) == HIGH && digitalRead(7) == LOW)
        {
          digitalWrite(9, HIGH);
        digitalWrite(13, HIGH);
        digitalWrite(8, LOW);
        digitalWrite(10, LOW);
        digitalWrite(11, LOW);
        digitalWrite(12, LOW);
        }
       else if (digitalRead(5) == HIGH && digitalRead(6) == HIGH && digitalRead(7) == LOW)
        {
          digitalWrite(10, HIGH);
        digitalWrite(13, HIGH);
        digitalWrite(9, LOW);
        digitalWrite(8, LOW);
        digitalWrite(11, LOW);
        digitalWrite(12, LOW);
        }
       else if (digitalRead(5) == HIGH && digitalRead(6) == LOW && digitalRead(7) == LOW)
        {
          digitalWrite(10, HIGH);
        digitalWrite(11, HIGH);
        digitalWrite(9, LOW);
        digitalWrite(8, LOW);
        digitalWrite(12, LOW);
        digitalWrite(13, LOW);
        }
      }
    В связи с этим решил освоить массивы. Расположил в них последовательность значений, как для датчиков, так и для пинов на полевики. И, он не работает.
    Код (C++):
    int hallSwitch[] = {1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0};
    int pinSwitch[] = {8, 11, 9, 10, 12, 13, 8, 12, 9, 10, 11, 13, 9, 12, 8, 10, 11, 13, 9, 13, 8, 10, 11, 12, 10, 13, 8, 9, 11, 12, 10, 11, 8, 9, 12, 13};
    int count1 = 0;
    int count2 = 0;

    void setup() {
      pinMode(5, INPUT);
      pinMode(6, INPUT);
      pinMode(7, INPUT);
      pinMode(8, OUTPUT);
      pinMode(9, OUTPUT);
      pinMode(10, OUTPUT);
      pinMode(11, OUTPUT);
      pinMode(12, OUTPUT);
      pinMode(13, OUTPUT);
     
    }

    void loop()
    {
     
      for (count1=0; count1<16; count1 = count1 + 3) {
        digitalRead(5) == hallSwitch[count1] && digitalRead(6) == hallSwitch[count1 + 1] && digitalRead(7) == hallSwitch[count1 + 2];
       
      }
      for (count2=0; count2<31; count2 = count2 + 6)
      {
     
        digitalWrite(pinSwitch[count2], HIGH);
        digitalWrite(pinSwitch[count2 + 1], HIGH);
        digitalWrite(pinSwitch[count2 + 2], LOW);
        digitalWrite(pinSwitch[count2 + 3], LOW);
        digitalWrite(pinSwitch[count2 + 4], LOW);
        digitalWrite(pinSwitch[count2 + 5], LOW);
     
        }
       
      }
    Возможно ошибка в том, что я прибавляю цифры к индексу для получения необходимого значения из шести значений прямо в digitalWrite, но как это по другому описать - я не знаю.
    Буду благодарен за любую помощь в сием деле.
     
  2. rkit

    rkit Гуру

    кусок кода ни на что не влияет

    Еще такой совет - циклы можно вкладывать друг в друга.
     
  3. fogary

    fogary Гик

    Может как-то так хотели?
    Код (C++):
    int hallSwitch[5][3] = {
      {1, 0, 1},
      {0, 0, 1},
      {0, 1, 1},
      {0, 1, 0},
      {1, 1, 0},
      {1, 0, 0}
    };
     
    int pinSwitch[5][6] = {
      {8, 11, 9, 10, 12, 13},
      {8, 12, 9, 10, 11, 13},
      {9, 12, 8, 10, 11, 13},
      {9, 13, 8, 10, 11, 12},
      {10, 13, 8, 9, 11, 12},
      {10, 11, 8, 9, 12, 13}
    };

    void setup() {
      pinMode(5, INPUT);
      pinMode(6, INPUT);
      pinMode(7, INPUT);
      pinMode(8, OUTPUT);
      pinMode(9, OUTPUT);
      pinMode(10, OUTPUT);
      pinMode(11, OUTPUT);
      pinMode(12, OUTPUT);
      pinMode(13, OUTPUT);
    }

    void loop() {
      for (int i = 0; i < 5; i++) {
        if (digitalRead(5) == hallSwitch[i][0] &&
            digitalRead(6) == hallSwitch[i][1] &&
            digitalRead(7) == hallSwitch[i][2])
        {
          digitalWrite(pinSwitch[i][0], HIGH);
          digitalWrite(pinSwitch[i][1], HIGH);
          digitalWrite(pinSwitch[i][2], LOW);
          digitalWrite(pinSwitch[i][3], LOW);
          digitalWrite(pinSwitch[i][4], LOW);
          digitalWrite(pinSwitch[i][5], LOW);
         
          break;
        }
      }
    }
     
  4. serg_admin

    serg_admin Гик

    Код (C++):
    void loop()
    {
      for (count1=0; count1<16; count1 = count1 + 3) {
        digitalRead(5) == hallSwitch[count1] && digitalRead(6) == hallSwitch[count1 + 1] && digitalRead(7) == hallSwitch[count1 + 2];
        count2=count1 * 6;
        digitalWrite(pinSwitch[count2], HIGH);
        digitalWrite(pinSwitch[count2 + 1], HIGH);
        digitalWrite(pinSwitch[count2 + 2], LOW);
        digitalWrite(pinSwitch[count2 + 3], LOW);
        digitalWrite(pinSwitch[count2 + 4], LOW);
        digitalWrite(pinSwitch[count2 + 5], LOW);
     
        }
     
      }
     
  5. rkit

    rkit Гуру

    Неправильные измерения массива. Не надо их писать вручную.
     
  6. fogary

    fogary Гик

    Ваша правда - обсчитался.
    Тогда и в цикле то же нужно исправить:
    Код (C++):
    int hallSwitch[][] = {
    . . .
    int pinSwitch[][] = {
    . . .
    void loop() {
      for (int i = 0; i < 6; i++) {
    . . .
     
     
  7. rkit

    rkit Гуру

    И в цикле писать вручную не надо.
    Код (C++):
    template <typename T,unsigned S>
    inline unsigned arraysize(const T (&v)[S]) { return S; }

    i < arraysize(hallSwitch)
     
  8. Weazzy

    Weazzy Нуб

    Благодарю превелико, всё заработало.