Помогите советом

Нет ответов
IvanDu
Offline
Зарегистрирован: 04.04.2015

 Имею: Arduino Uno , L293D, платформу с двумя движками, радиоаппа Turnigy 9XR, приемник Orange.

  int IN1 = 8; //input1 подключен к выводу 8 
  int IN2 = 9;
  int IN3 = 12;
  int IN4 = 13;
  int EN1 = 10;
  int EN2 = 11;
  int drive_1;
  int drive_2;

void setup()
{
  pinMode (EN1, OUTPUT);
  pinMode (IN1, OUTPUT);
  pinMode (IN2, OUTPUT);
  pinMode (EN2, OUTPUT);
  pinMode (IN4, OUTPUT);
  pinMode (IN3, OUTPUT);
  
  // Все пины порта D кроме нулевого(TX) устанавливаем как входы
  DDRD = 1;
  // Настраиваем таймер 1 на отсчет 0.5 мкс
  TCCR1B   =   0;   
  TCCR1A   =   0;
  TCNT1   =    0;   
  TCCR1A   =   0;   
  TCCR1B   =   0<<CS12 | 1<<CS11 | 0<<CS10;//0x1A; //start timer with 1/8
  // Разрешаем прерывания порта D по изменению уровня
  PCICR |= (1 << PCIE2);
  // настраиваем маску прерывания - пины 2-7
  PCMSK2 = 0xFC;
  // открываем UART для вывода результата
  Serial.begin(9600);
}

typedef struct {
  unsigned long riseTime; // время перехода 0->1
  unsigned int  lastWidth; // ширина импульса
} tPinTimingData;
volatile static tPinTimingData pinData[6]; //массив каналов
volatile static uint8_t PCintLast; 

uint8_t bit;
uint8_t curr;
uint8_t mask;
uint16_t currentTime;
uint16_t time;

// обработчик прерывания порта D
ISR(PCINT2_vect)
{
  // текущее время по таймеру 1 в мкс
  currentTime = TCNT1>>1;
  // Получаем состояние интересующих нас пинов
  curr = PIND & 0xFC;
  // пины, изменившие состояние
  mask = curr ^ PCintLast;
  PCintLast = curr;
  // в цикле просматриваем каждый пин
  for (uint8_t i=0; i < 6; i++) {
    // маска текущего пина цыкла
    bit = 0x04 << i;
    if (bit & mask) {
      // если 0->1
      if (bit & PCintLast) 
        // сохраняем текущее время для канала
        pinData[i].riseTime = currentTime;
      else {
        // рассчитываем ширину импульса
        time = currentTime - pinData[i].riseTime;
        // и сохраняем ее, если таймер не наврал
        if ((time >= 800) && (time <= 2200)) {
          pinData[i].lastWidth = time;
        }
      }
    }
  }
}

void loop()
{
  int drive_1 = (pinData[0].lastWidth - 986) / 4.05;
  int drive_2 = (pinData[1].lastWidth - 986) / 4.05;
  
  if (pinData[2].lastWidth < 1500)
    {
       digitalWrite (IN1, HIGH);
       digitalWrite (IN2, LOW); 
       digitalWrite (IN3, HIGH);
       digitalWrite (IN4, LOW); 
       analogWrite(EN1, drive_1);
       analogWrite(EN2, drive_2);
    }
  else
    {
       digitalWrite (IN1, LOW);
       digitalWrite (IN2, HIGH); 
       digitalWrite (IN3, LOW);
       digitalWrite (IN4, HIGH); 
       analogWrite(EN1, drive_1);
       analogWrite(EN2, drive_2);
    }  
   
    /* Serial.println();
     Serial.print("Ch 1:");
     Serial.print(drive_0);
     Serial.print("Ch 2:");
     Serial.print(drive_1);
     Serial.print("Ch 3:");
     Serial.print(pinData[2].lastWidth);
     
     delay(500);*/
}

           

Не крутится вообще 1й двигатель (пины 8,9,10), 2й работает как задумано.

На мониторе последовательно порта все переменные идут нормально.

Если убрать изи кода код чтения сигнала с приёмника и на двигатели, на ENABLE, подавать константы или через цикл наращивать\снижать- оба движка работают как надо.

Подскажите в чем проблема.

Спасибо.