Добрый день. Появилась нужда запустить и удаленно управлять 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, но как это по другому описать - я не знаю. Буду благодарен за любую помощь в сием деле.
Может как-то так хотели? Код (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; } } }
Код (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); } }
Ваша правда - обсчитался. Тогда и в цикле то же нужно исправить: Код (C++): int hallSwitch[][] = { . . . int pinSwitch[][] = { . . . void loop() { for (int i = 0; i < 6; i++) { . . .
И в цикле писать вручную не надо. Код (C++): template <typename T,unsigned S> inline unsigned arraysize(const T (&v)[S]) { return S; } i < arraysize(hallSwitch)