Генерация сигнала 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 (что он уже делает). Как мне изменить свой код, чтобы сделать это?
@Redlion11, 👍0
Обсуждение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
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
Каким должно быть поведение "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