Проблема синхронизации с сигналами
#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. Я проверил вывод, который подключен к драйверу с помощью области видимости, и я получил это. Предполагается, что восходящий и нисходящий фронты более длинного сигнала (CI, темно-зеленый) синхронизируются с восходящим фронтом сигнала FDCS (лаймовый зеленый), но они совпадают с нисходящим фронтом. Обратите внимание, что выходной сигнал инвертирован (по сравнению с кодом), следовательно, сигнал, генерируемый выводами Arduino, соответствует коду.
@Redlion11, 👍2
Обсуждение1 ответ
Лучший ответ:
Я не пробовал это делать. Но что-то вроде этого может помочь синхронизировать инвертированные сигналы с восходящим фронтом высокочастотного сигнала.
Я удалил задержку 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);
}
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
итак, в чем заключается ваш вопрос?, @jsotola
@jsotola Почему сигнал не включается в одно и то же время? согласно коду, я записываю регистр PORTD одновременно для обоих выводов 6 и 5, так что они должны синхронизироваться, верно?, @Redlion11
какая строка кода записывает оба бита в PORTD?, @jsotola
@jsotola PORTD=CIState, в runInjectortest(), в цикле for. CIState=B01100000, @Redlion11
Если выходной сигнал инвертирован, и вы включаете более частый сигнал, он отображается на прицеле в виде падающего края. (потому что он перевернут: восходящий край становится падающим краем.) Вы получили то, что запрограммировали. ;-), @Peter Paul Kiefer
@PeterPaulKiefer О боже, спасибо, теперь есть ли какой-нибудь способ изменить код, чтобы он работал на падающем крае?, @Redlion11
Вы изменяете оба сигнала по отдельности с задержкой между ними. Я добавил ответ, чтобы показать вам свою идею., @Peter Paul Kiefer