Генератор на регистрах, как ввести dead time

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 16, 2);

int regim = 1;
int flag = 0;
int val = 100;
int dead = 10;
void setup() {
  lcd.init();
  lcd.backlight();

  DDRB |= _BV(PB1) | _BV(PB2);       /* set pins as outputs */
  TCCR1A = _BV(COM1A1) | _BV(COM1B1) /* non-inverting PWM */
           | _BV(WGM11);             /* mode 14: fast PWM, TOP=ICR1 */
  TCCR1B = _BV(WGM13) | _BV(WGM12)
           | _BV(CS10);             /* no prescaling */
  TCCR1A = (TCCR1A & 0x0F) | 0xB0;  // set pin 10 inverted

  
}
void loop()

{
  if (digitalRead(14) == HIGH && flag == 0)  //если кнопка нажата
  // и перемення flag равна 0 , то ...
  {
    regim++;
    flag = 1;
    if (regim > 10)  //ограничение кол. режимов-нам и этих хатает
    {
      regim = 1;  //  переключать  циклично
    }
  }

  if (digitalRead(14) == LOW && flag == 1)  //если кнопка НЕ нажата
  //и переменная flag равна - 1 ,то ...
  {
    flag = 0;  //обнуляем переменную "knopka"
  }

  if (regim == 1)  //первый режим
  {
    ICR1 = 3200;   //задаем частоту 5КГЦ
    OCR1A = 2133;  //задаем девиацию 90% на 9пине
    OCR1B = 213;   //задаем девиацию 10% на 10пине

    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("5 Khz");
  }

  if (regim == 2)  //второй режим
  {
    ICR1 = 1066;  //задаем частоту 10КГЦ
    OCR1A = 600;  //задаем девиацию 90% на 9пине
    OCR1B = 108;  //задаем девиацию 10% на 10пине
analogWrite(9, val - dead);
  analogWrite(10, val + dead);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("10 Khz");
  }

  if (regim == 3)  //третий режим
  {
    ICR1 = 800;   //задаем частоту 20КГЦ
    OCR1A = 533;  //задаем девиацию 90% на 9пине
    OCR1B = 53;   //задаем девиацию 10% на 10пине
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("20 Khz");
  }

  if (regim == 4)  //четвертый режим
  {
    ICR1 = 400;   //задаем частоту 40КГЦ
    OCR1A = 267;  //задаем девиацию 90% на 9пине
    OCR1B = 27;   //задаем девиацию 10% на 10пине
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("40 Khz");
  }

  if (regim == 5)  //пятый режим
  {
    ICR1 = 266;   //задаем частоту 60КГЦ
    OCR1A = 177;  //задаем девиацию 90% на 9пине
    OCR1B = 17;   //задаем девиацию 10% на 10пине
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("60 Khz");
  }

  if (regim == 6)  //шестой режим
  {
    ICR1 = 200;   //задаем частоту 80КГЦ
    OCR1A = 137;  //задаем девиацию 90% на 9пине
    OCR1B = 14;   //задаем девиацию 10% на 10пине
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("80 Khz");
  }

  if (regim == 7)  //седьмой режим
  {
    ICR1 = 160;   //задаем частоту 100КГЦ
    OCR1A = 133;  //задаем девиацию 90% на 9пине
    OCR1B = 13;   //задаем девиацию 10% на 10пине
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("100Khz");
  }

  if (regim == 8)  //восьмой режим
  {
    ICR1 = 106;  //задаем частоту 150КГЦ
    OCR1A = 97;  //задаем девиацию 90% на 9пине
    OCR1B = 10;  //задаем девиацию 10% на 10пине
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("150Khz");
  }

  if (regim == 9)  //девятый режим
  {
    ICR1 = 80;   //задаем частоту 200КГЦ
    OCR1A = 72;  //задаем девиацию 90% на 9пине
    OCR1B = 7;   //задаем девиацию 10% на 10пине
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("200Khz");
  }

  if (regim == 10)  //десятый режим
  {
    ICR1 = 53;   //задаем частоту 300КГЦ
    OCR1A = 35;  //задаем девиацию 90% на 9пине
    OCR1B = 3;   //задаем девиацию 10% на 10пине
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("300Khz");
  }
  delay(100);
}

Прощу подсказать как ввести dead time в этот скетч. пробовал вставить в один из диапазонов…
analogWrite(9, val - dead);
analogWrite(10, val + dead);
бесполезно. очевидно, где-то как-то в регистрах надо что-то подправлять

Этот термин применяют к импульсам в разных трехфазных обмоточных приложениях, что бы импульсы гарантированно не перекрывали друг друга. Реальная аппаратная реализация есть в первом таймере stm32 на блюпиле. Изменение скважности это не dead time.

Изменение скважности это не dead time.

Я осознаю что изменение скважности не есть получение dead time. У меня Ардуино Уно, на ней, с помощью регистров (без delay) и всяких прерываний был скомпанован генератор с кучей частот и длительнстью. Можно ли аппаратно реализовать dead time на 9 и 10 ноге (в дополнение к написанному). Если можно–то как?..Или надо писать скетч с прерываниями, можно сказать: напрямую задавть задержки. не хотелось бы связываться с прерываниями, они не “кошерные”
Как выглядит скетч “в первом таймере stm32 на блюпиле” есть ли пример чтоб вникнуть в сущность?

https://www.google.com/search?q=stm32+timer+deadtime

Правильно ли я понял, что АРДУИНО УНО не способно на такое, нужен другой камень, другое все! STM32–'это же не УНО?
Наверное, проще мне будет на 9 ногу повесить драйвер IR2117–который и будет задавать дед тайм? неужто УНО не способно генерить с дет=таймом?

Что генерить? Какие параметры импульсов? Между какими фронтами нужен dead time?

Генерить меандр от 5кгц до 300кгц. dead time --примерно до 2% от длительности импульса, как слева так и справа.

Вы можете понять здесь написанное? Я нет. dead time Должен быть относительно какого то фронта не относящемуся к данному импульсу. Внятно задачу сформулировать можно? А если будет диаграмма того что должно получиться, хоть от руки, вообще блеск.

Я пробовал повторить чужие действия:
oid setup ()
{
TCCR1A = (TCCR1A & 0x0F) | 0xB0 ; // set pin 10 inverted
int val = 100 ;
int dead = 2 ;
analogWrite (9, val-dead) ;
analogWrite (10, val+dead) ;
}
void loop ()
{}

to build Half Bridge deadtime must be between both signal edges.
This line “analogWrite (9, val);” should be written like this: analogWrite (9, val-dead);
Then we get a signal with the necessary pauses “dead time”

но у меня ничего не вышло

диаграмма

При таком способе не будет первой задержки, будет только вторая.

На уне аппаратно не сделать. Программно уна 300 кГц не вытянет.

Возможно, надо два разных таймера запускать с нужной задержкой ( для первой задержки)
P.S.Сам этого не делал, просто мысли

Будет, для этого есть режим phase correct pwm

А вот те мысли чужие, на аглицком языке…у них получилось или нет? У меня не прошел этот номер. опыта совсем нет, хотя экспериментировал. Весь скетч на генератор я писал сам (этим мне он дорог), года два назад, долго вникал в регистры, экспериментировал, но получил генератор на несколько фиксированных частот с разной длительностью. Я думаю!!! наверное есть какая то фича в регистрах, чтоб сигналы синхронизировались не по началу импульса, а по посреди их длительности (но я такую фичу не нашел). Спасибо вам что откликнулись!!! Огромное спасибо! Буду мастырить на 7500 микросхеме и драйверах (“копировать выходной каскад моста сварочного инвертора”)

если можно…с этого момента поподробнее!!!

Будет, для этого есть режим phase correct pwm…
Это для Ардуино применимо, или для STM только?

В мой скетч можно воткнуть этот режим? Чтоб на 10 ноге “phase correct” была сдвинута

Это применимо для UNO

void setup() {

	DDRB |= _BV(PB1) | _BV(PB2);       /* set pins as outputs */	

	TCCR1A =B10110000;
	TCCR1B =B00010001;

	ICR1 = 12000;

  OCR1A = 5000 - 900;  //9пине
  OCR1B = 5000 + 900;  //10пине
/* Или	
	analogWrite(9,5000 - 900);
	analogWrite(10,5000 + 900);
*/
}
void loop(){
}

ДРУЖИЩЕ!!! Спасибо!! Ардуино Уно под рукой, двухлучевой ослик под рукой…что еще надо мужчине для полного счастья? (Белое солнце пустыни))) Бу экспериментировать