Перейти к содержанию
    

STM32 управление мостами

Есть  stm32g070

он управляет независимо двумя полумостами с частотой 500кгц, желательно с произвольным выбором ног,

выдает пачки импульсов, реализовано просто дерганьем ног, время между изменениями состояния задается

while(FG2--){__NOP();}

но при изменении int FG2 на единицу частота сдвигается на 35кгц (при вых 500кгц)

что слишком много, хотелось бы шаг хотя бы в 5кгц, есть ли конструкция аналогичная выше но выполняемая в 5-10  раз быстрее ?

Тогда можно двигать частоту с меньшим шагом.

 

 

Изменено пользователем whale

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Цитата

есть ли конструкция аналогичная выше но выполняемая в 5-10  раз быстрее

Есть. Но нужно перестать надевать трусы через голову и использовать таймеры по назначению.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Там только TIM1 умеет полный мост, и на любые выводы он это не умеет, поэтому прямой код на каждую пачку каждой частоты и каждой группы выводов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как сделать в IAR чтобы переход скажем goto был с приращением по заданной переменной,

те FG = 0....250

 goto FG;

1: nop

2: nop

3: nop

итд

тогда будет шаг = nop+переход  и автоматом приращиваться с увеличением FG

в этом случае не потребуется сравнений но возможно потребуется сложение

 

Изменено пользователем whale

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 минут назад, whale сказал:

Как сделать в IAR чтобы переход скажем goto был с приращением по заданной переменной, . . . . 

Не скажу за STM32, ищите по ключам "вычисляемый переход", "операции с программным счетчиком PC". Хотя это скорее для ASM.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 18.08.2024 в 01:07, whale сказал:

Для asm для avr я знаю asm + stm не успел изучить.

Зачем? Написать программу на си, потом откомпилировать её, получить asm. Исправить в си нужные места заменив их кодом asm.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Уточню,  нужна программа которая делает задержку на столько тактов, сколько записано в переменной char, в идеале,

в реале с минимальными доп. тактами.

Изменено пользователем whale

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 часов назад, whale сказал:

Как сделать в IAR чтобы переход скажем goto был с приращением по заданной переменной,

А если хоть слегка подумать?

switch (i) {
  case N: asm(" NOP");  
  case N-1: asm(" NOP");  
  ...  
  case 3: asm(" NOP");
  case 2: asm(" NOP");
  case 1: asm(" NOP");
  case 0: asm(" NOP");
}

При достаточно большой величине N должен получиться как раз ваш "вычисляемый переход".

Но делать это на си, а не на асм - это играть в рулетку. Уж не говоря о том, что продолжаете упорно надевать трусы через голову. С таким подходом никогда не научитесь создавать что-то стоящее на микроконтроллерах.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А массив указателей на ф-ции - разве не вариант "вычисляемого перехода"?

И я чет не понял, зачем столько NOP-ов в таблице? Они ж ничем не отличаются. Это чето похоже на индусский код.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 часов назад, whale сказал:

нужна программа которая делает задержку на столько тактов

Не нужна. Вам сказали, как такое делается — собираете в ОЗУ нужный линейный код, т.е. без ветвлений, под требуемую частоту и требуемые выводы МК, и по стробу с таймера, также ожидаемого выравнивающим кодом, переходите на него, иначе этот свой ультразвук при таком жабоудушении никак не сделаете, и ещё надо уточнить, имеет ли ОЗУ в STM32 приоритет перед шиной.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 часов назад, Plain сказал:

собираете в ОЗУ

 Если под каждые 256 частоты делать отдельную  таблицу никакой озу не хватит.

Я уже говорил, лучше сделать вычисляемой переход, при этом будет одна максимальная задержка из nop из которой выбирается нужная часть, если делать это по тупому через сравнение и goto то выигрыша не будет, тут надо более тонко, сразу прибавить к текущему счетчику команд нужное значение например.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 hours ago, whale said:

Как сделать в IAR чтобы переход скажем goto был с приращением по заданной переменной,

те FG = 0....250

 goto FG;

Причём тут IAR? Язык С++ позволяет очень просто делать такое.

Есть таблица вызовов методов класса:

////////////////////////////////////////////////////////////////////////////////

void( *const SysCall[ 256 ] )( PLC_F446* )
{
    //--------------------------------------------------------------------------
    // Системные вызовы, относящиеся к работе непосредственно ПЛК.

    &unsupportedSysCall,        // 0
    &sc_PLC_D2X,                // 1
    &sc_PLC_Y2D,                // 2
    &sc_PLC_STORE_EXTR_PARAMS,  // 3
    &unsupportedSysCall,        // 4
    &unsupportedSysCall,        // 5
    ......

Вот так вызывается метод по его индексу:

bool
PLC_F446::rtsyscall( void )
{
    bool
        result = false;

    if( ( unsigned )extr_params.sc < ( sizeof( SysCall ) / sizeof( SysCall[ 0 ] ) ) )
    {
        ( *SysCall[ extr_params.sc ] )( this );

        result = true;
    }

    return( result );
}

Поменяйте сигнатуру ( *SysCall[ extr_params.sc ] )( this ), передавая ил не передавая ему то, что ему нужно или не нужно, и оформите его как обычную функцию.

 

Привязываться к тактам МК очень плохая идея. Используйте периферию, ибо сама архитектура ARM такого не предполагает из-за всяких там кэшей, шин, FIFO и тому подобных штучек.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 8/16/2024 at 9:51 PM, whale said:

он управляет независимо двумя полумостами с частотой 500кгц, желательно с произвольным выбором ног,

Может быть тогда перекладывать данные в регистры GPIO через DMA по событию таймера?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Фазосдвигающий или противофазный мост? И зачем произвольный выбор ног?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...