Проблема синхронизации с сигналами


#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 CiCnt;
int totalCnt;
int CIState=B01100000;
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 сигнала управления подачей топлива
  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(FDCSoffset);
      PORTD=PORTD^B01000000;
      delayMicroseconds(PWus);
      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 сигналов, называемых CI и FDCS. CI остается включенным до 5-го импульса FDCS. Я проверил вывод, который подключен к драйверу с помощью области видимости, и я получил это.The signal Предполагается, что восходящий и нисходящий фронты более длинного сигнала (CI, темно-зеленый) синхронизируются с восходящим фронтом сигнала FDCS (лаймовый зеленый), но они совпадают с нисходящим фронтом. Обратите внимание, что выходной сигнал инвертирован (по сравнению с кодом), следовательно, сигнал, генерируемый выводами Arduino, соответствует коду.

, 👍2

Обсуждение

итак, в чем заключается ваш вопрос?, @jsotola

@jsotola Почему сигнал не включается в одно и то же время? согласно коду, я записываю регистр PORTD одновременно для обоих выводов 6 и 5, так что они должны синхронизироваться, верно?, @Redlion11

какая строка кода записывает оба бита в PORTD?, @jsotola

@jsotola PORTD=CIState, в runInjectortest(), в цикле for. CIState=B01100000, @Redlion11

Если выходной сигнал инвертирован, и вы включаете более частый сигнал, он отображается на прицеле в виде падающего края. (потому что он перевернут: восходящий край становится падающим краем.) Вы получили то, что запрограммировали. ;-), @Peter Paul Kiefer

@PeterPaulKiefer О боже, спасибо, теперь есть ли какой-нибудь способ изменить код, чтобы он работал на падающем крае?, @Redlion11

Вы изменяете оба сигнала по отдельности с задержкой между ними. Я добавил ответ, чтобы показать вам свою идею., @Peter Paul Kiefer


1 ответ


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

2

Я не пробовал это делать. Но что-то вроде этого может помочь синхронизировать инвертированные сигналы с восходящим фронтом высокочастотного сигнала.

Я удалил задержку FDCSoffset, потому что она отрицательна в соответствии с переменными вверху.

// инициализировать CIState с помощью 00
int CIState=B00000000;

// строки не показаны .....

for( totalCnt=0; totalCnt<8000; totalCnt++ )
{
  CIState=CIState^B01000000;
  if(totalCnt%4==0)
  {
    CIState=CIState^B00100000;
  }
  // оба сигнала устанавливаются одновременно
  PORTD=CIState;
  delayMicroseconds(PWus);
}
,