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

2 часа назад, jcxz сказал:

У меня рядом работает двигатель с ШИМом ~20кГц.

У меня тоже работает с ШИМом ~20кГц. Пробовал и больше, не расплавился. :crazy:

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


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

1 час назад, Vasily_ сказал:

У меня тоже работает с ШИМом ~20кГц. Пробовал и больше, не расплавился. :crazy:

А может - всё дело в дождливом прибалтийском климате? Почему у нас не плавятся, а у AVI-crak - плавятся.  :laugh1:

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


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

Да, у меня мотор на 20КГц шима перегревается, когда хавает 3,5А на холостых оборотах через инвертор. И почти холодный, когда работает от сети на прямую (1,4А). Инвертор не мой, а чистокровный супердешовый китаец - точно так-же как и у всех сейчас.

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


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

В 22.08.2022 в 13:41, Сергей Борщ сказал:

Перечитал несколько раз. Так ничего и не понял.

Я немного ошибся DMA не делает модуляцию а прерывание по таймеру.Один таймер делает ШИМ а другой в паре работает в прерывании.А эти флаги по DMA устанавливают в майне.

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


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

sinusA=(sin(2px/128)+1)*127
 sinusB=(sin(2px/128+2p/3)+1)*127
 sinusC=(sin(2px/128-2p/3)+1)*127
sinusAN=(sin(2px/128-p)+1)*127
 sinusBN=(sin(2px/128+5p/3)+1)*127
 sinusCN=(sin(2px/128-5p/3)+1)*127

А если нужно шесть выходов 3 прямые фазы и 3 инверсионные.Вот формула 7класса

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


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

4 часа назад, jcxz сказал:

А может - всё дело в дождливом прибалтийском климате?

В этом году грех жаловаться, дождей совсем нет, и плавимся мы а не моторы. :beach:

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


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

On 8/22/2022 at 7:59 PM, dimir said:

А если нужно шесть выходов 3 прямые фазы и 3 инверсионные.Вот формула 7класса

Как уже говорили выше, достаточной одной таблицы синуса.

Допустим на 180 отсчетов

uint8_t sinus[180] = {.....};

А для каждой фазы надо просто завести свой индекс массива и проинициализировать эти индексы соответственно.

#define TABLE_SIZE		(180U)
  
uint8_t sinus[180] = {....};
uint8_t index_A = 0U * (TABLE_SIZE / 3U);
uint8_t index_B = 1U * (TABLE_SIZE / 3U);
uint8_t index_C = 2U * (TABLE_SIZE / 3U);

Это и даст вам сдвиг 120 градусов для каждой фазы.

Для инверсных каналов в STM32 у таймеров есть комплементарные выходы. 

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


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

11 минут назад, dimka76 сказал:

Допустим на 180 отсчетов

таблицу надо делать на два периода, чтобы не думать о выходе за ее пределы при добавлении смещения для остальных фаз.

13 минут назад, dimka76 сказал:

Для инверсных каналов в STM32 у таймеров есть комплементарные выходы

а если таких выходов не хватает и драйвер с встроенным мертвым временем - можно же вроде бы брать значения из той же таблицы со сдвигом 90 градусов?

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


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

On 8/22/2022 at 9:01 PM, Сергей Борщ said:

таблицу надо делать на два периода, чтобы не думать о выходе за ее пределы при добавлении смещения для остальных фаз.

Для каких остальных ?

On 8/22/2022 at 9:01 PM, Сергей Борщ said:

а если таких выходов не хватает и драйвер с встроенным мертвым временем - можно же вроде бы брать значения из той же таблицы со сдвигом 90 градусов?

Если драйвер со встроенным мертвым временем, то тогда, скорее всего, у него уже есть собственные инверсные выходы.

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

Можно и еще что-то придумать. По месту, так сказать )

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


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

15 minutes ago, Сергей Борщ said:

таблицу надо делать на два периода, чтобы не думать о выходе за ее пределы при добавлении смещения для остальных фаз.

на четверть периода,

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

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


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

On 8/22/2022 at 9:20 PM, _pv said:

на четверть периода,

Тогда с DMA не получится.

И, кстати, я не удачный пример выше привел. Количество отсчетов в таблице лучше делать кратным степени двойки.

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


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

В 22.08.2022 в 20:43, dimka76 сказал:

Это и даст вам сдвиг 120 градусов для каждой фазы.

Для инверсных каналов в STM32 у таймеров есть комплементарные выходы. 

Я вам формулу дал сдвига 3 массива.Думаю вы ошибаетесь.Или пытаетесь запутать меня.Насчёт таймера 1 нужно тоже почитать.Если есть инверсионные выходы то продублировать 3 массива а пустить на эти выводы.Но DMAэтот вариант наверное не подойдёт.А вот прерывание по таймеру проверенный вариант.Модуляция есть.

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


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

15 минут назад, dimka76 сказал:

Для каких остальных ?

Если мы все еще о прямом цифровом синтезе, то мы имеем одну переменную аккумулятора фазы, из которой получаем индекс для фазы А. Индекс фазы B мы получаем путем прибавления к полученному индексу фазы A значения index_B, для фазы C- прибавлением index_C. При этом уже через 120 градусов индекс для фазы C выйдет за границы массива, а еще через 120 - и индекс для фазы B. Поэтому я дописываю следом еще один период и не беспокоюсь о выходе за границу массива. Весь цифровой синтез сводится к четырем сложениям и одному сдвигу:

size_t const PERIOD = 256;      // должен быть степенью двойки
uint8_t Envelope[PERIOD * 2];   // огибающая двух периодов синуса, но можно и более хитрую форму
uint32_t Phase_acc;             // аккумулятор фазы

uint32_t Phase_step;            // Этой переменной определяем часоту.


void update()
{
    Phase_acc += Phase_step;
    
    size_t Index = Phase_acc >> 24;
    Phase_A_out = Envelope[Index + 0 * PERIOD / 3] * Amplitude;
    Phase_B_out = Envelope[Index + 1 * PERIOD / 3] * Amplitude;
    Phase_C_out = Envelope[Index + 2 * PERIOD / 3] * Amplitude;
}
22 минуты назад, _pv сказал:

на четверть периода,

Можно и на 1/8 периода, но какой в этом смысл? Скорости много не бывает, а памяти у STM32 навалом.

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


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

В 22.08.2022 в 21:01, Сергей Борщ сказал:

а если таких выходов не хватает и драйвер с встроенным мертвым временем - можно же вроде бы брать значения из той же таблицы со сдвигом 90 градусов?

Не 90 градусов а 180

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


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

On 8/22/2022 at 10:01 PM, Сергей Борщ said:

Если мы все еще о прямом цифровом синтезе, то мы имеем одну переменную аккумулятора фазы, из которой получаем индекс для фазы А. Индекс фазы B мы получаем путем прибавления к полученному индексу фазы A значения index_B, для фазы C- прибавлением index_C. При этом уже через 120 градусов индекс для фазы C выйдет за границы массива, а еще через 120 - и индекс для фазы B. Поэтому я дописываю следом еще один период и не беспокоюсь о выходе за границу массива. Весь цифровой синтез сводится к четырем сложениям и одному сдвигу:

Если я правильно вас понял. То этого не произойдет, если выполнить все следующие условия

1. Таблица на один период

2. Количество элементов в таблице кратно степени двойки.

3. На индекс накладывать маску, вот так

// допустим количесвто элементов массива 128.
// маска 0x7F (128 - 1)

uint8_t index_A;
uint8_t index_B;

uint8_t acc; // условно аккумалятор фазы

index_A = acc;
index_A &= 0x7F; // накладываем маску

index_B = acc + 128U/3U;
index_B &= 0x7F; // накладываем маску

// и т.д.

 

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


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

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

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

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

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

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

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

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

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

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