Генерация сигнала Bit Bang

  
  #include <Wire.h>
  #include <LiquidCrystal_I2C.h>
  #include "digitalWriteFast.h"
  
  #define BUTTONPIN 2
  #define FDCSPIN 6
  #define CIPIN 5
  #define SPEAKERPIN 4
  
  float RPM=1000.0;
  int PWus=1.5*1000.0;
  int FDCSoffset=(1000.0/RPM/60.0/4.0) - (PWus/1000.0);
  int totalCnt;
  int CIState=B00000000;
  bool Buttonstate=0;
  LiquidCrystal_I2C lcd(0x27, 20, 4);
   
  void setup() 
  {
    Serial.begin(9600);
    lcd.begin();
    lcd.backlight();
    lcd.clear();
    lcd.print("READY TO TEST"); // Ожидание нажатия кнопки
    pinMode(BUTTONPIN, INPUT);// Настройка кнопки в качестве ввода
    pinMode(FDCSPIN, OUTPUT); // Сигнал управления подачей топлива
    pinMode(CIPIN, OUTPUT); // Идентификация цилиндра
    digitalWriteFast(FDCSPIN, LOW);
    digitalWriteFast(CIPIN, LOW);
  }
  
  void loop() 
  {
   Buttonstate=digitalReadFast(BUTTONPIN);
   if(Buttonstate==1)
   {
    delay(5);
    if(Buttonstate==1)
    {
      runInjectorTest();
    }
   }
  }
  void runInjectorTest()
  {
    lcd.print("Test Run");
    playtesttone();
    
      
      for(totalCnt=0;totalCnt<8000;totalCnt++)
      {
      
        PORTD=CIState;
        delayMicroseconds(PWus);
        PORTD=PORTD^B01000000;
        delayMicroseconds(FDCSoffset);
        if(totalCnt%4==0)
        {
          CIState=CIState^B00100000;
        }
      }
    totalCnt=0;
    playfinishtone();
  }
  void playtesttone()
  {
    tone(SPEAKERPIN, 500, 500);
    delay(700);
    tone(SPEAKERPIN, 500, 500);
    delay(700);
    tone(SPEAKERPIN, 500, 500);
    delay(700);
    tone(SPEAKERPIN, 2000, 500);
  }
  void playfinishtone()
  {
  
    tone(SPEAKERPIN, 2000, 500);
    delay(700);
    tone(SPEAKERPIN, 2000, 500);
    delay(700);
    tone(SPEAKERPIN, 2000, 500);
    delay(700);
    tone(SPEAKERPIN, 500, 500);
  
  }

Я пытаюсь сгенерировать 2 сигнала, используя приведенный выше код, и этот результат

Судя по изображению, лимонно-зеленый сигнал называется FDCS, а другой - CI. Обратите внимание, что область видимости показывает перевернутую форму сигнала. Я хочу, чтобы падающий край CI совпадал с падающим краем сигнала 5-го FDCS (прямо сейчас восходящий край совпадает с падающим краем сигнала CI). Но восходящий фронт сигнала CI должен совпадать с восходящим фронтом первого сигнала FDCS (что он уже делает). Как мне изменить свой код, чтобы сделать это?

, 👍0

Обсуждение

Каким должно быть поведение "CI", когда оно "низкое", после спадающего фронта пятого импульса "FDCS"? В течение скольких импульсов "FDC" он должен оставаться низким? Код легко адаптировать, но вы еще не указали полный цикл "CI"., @StarCat

@StarCat Подводя итог, CI должен повышаться, когда FDCS становится ВЫСОКИМ, затем оставаться ВЫСОКИМ в течение 4 полных циклов FDCS, затем опускаться до МИНИМУМА на ПАДАЮЩЕМ крае 5-го цикла. Теперь вывод CI должен оставаться НИЗКИМ до тех пор, пока не достигнет ВОСХОДЯЩЕГО фронта 10-го цикла FDC, после чего шаблон повторяется. Шаблон должен повториться 2000 раз., @Redlion11

Уже заданный вопрос и ответ здесь: [Проблема синхронизации с сигналами](https://arduinoprosto.ru/q/79776/sync-issue-with-signals ), @ocrdu


1 ответ


Лучший ответ:

1

Если я правильно понимаю, ваш сигнал имеет период в 8 импульсов FDCS: 4 с высоким CI и 4 с низким CI. Поскольку восходящие и нисходящие края CI не происходят в одном и том же месте относительно импульсов FDCS, вы должны обрабатывать их отдельно.

Я предлагаю что-то вроде следующего. Обратите внимание, что, поскольку я не знаю, какие сигналы были инвертированы вашей настройкой, я просто пытаюсь воспроизвести то, что вы показываете в области видимости, без инверсии:

uint8_t portState = 0;
for (int totalCnt = 0; totalCnt < 16000; totalCnt++)
{
    // При импульсе 0 CI повышается с помощью FDC.
    portState |= _BV(FDCSPIN);
    if (totalCnt % 8 == 0)
        portState |= _BV(CIPIN);
    PORTD = portState;

    delayMicroseconds(FDCSoffset);  // длительность импульса

    // На импульсе 4 CI падает вместе с FDC.
    portState &= ~_BV(FDCSPIN);
    if (totalCnt % 8 == 4)
        portState &= ~_BV(CIPIN);
    PORTD = portState;

    delayMicroseconds(PWus);  // межимпульсная задержка
}
,

Не могли бы вы сообщить мне, что такое переменная postState?, @Redlion11

@Redlion11: Это опечатка. ;-) Исправлено!, @Edgar Bonet

Спасибо за разъяснение!!, @Redlion11