Vasily_ 59 22 августа, 2022 Опубликовано 22 августа, 2022 · Жалоба 2 часа назад, jcxz сказал: У меня рядом работает двигатель с ШИМом ~20кГц. У меня тоже работает с ШИМом ~20кГц. Пробовал и больше, не расплавился. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 245 22 августа, 2022 Опубликовано 22 августа, 2022 · Жалоба 1 час назад, Vasily_ сказал: У меня тоже работает с ШИМом ~20кГц. Пробовал и больше, не расплавился. А может - всё дело в дождливом прибалтийском климате? Почему у нас не плавятся, а у AVI-crak - плавятся. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AVI-crak 0 22 августа, 2022 Опубликовано 22 августа, 2022 · Жалоба Да, у меня мотор на 20КГц шима перегревается, когда хавает 3,5А на холостых оборотах через инвертор. И почти холодный, когда работает от сети на прямую (1,4А). Инвертор не мой, а чистокровный супердешовый китаец - точно так-же как и у всех сейчас. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimir 2 22 августа, 2022 Опубликовано 22 августа, 2022 · Жалоба В 22.08.2022 в 13:41, Сергей Борщ сказал: Перечитал несколько раз. Так ничего и не понял. Я немного ошибся DMA не делает модуляцию а прерывание по таймеру.Один таймер делает ШИМ а другой в паре работает в прерывании.А эти флаги по DMA устанавливают в майне. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimir 2 22 августа, 2022 Опубликовано 22 августа, 2022 · Жалоба 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класса Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vasily_ 59 22 августа, 2022 Опубликовано 22 августа, 2022 · Жалоба 4 часа назад, jcxz сказал: А может - всё дело в дождливом прибалтийском климате? В этом году грех жаловаться, дождей совсем нет, и плавимся мы а не моторы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 63 22 августа, 2022 Опубликовано 22 августа, 2022 · Жалоба 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 у таймеров есть комплементарные выходы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 22 августа, 2022 Опубликовано 22 августа, 2022 · Жалоба 11 минут назад, dimka76 сказал: Допустим на 180 отсчетов таблицу надо делать на два периода, чтобы не думать о выходе за ее пределы при добавлении смещения для остальных фаз. 13 минут назад, dimka76 сказал: Для инверсных каналов в STM32 у таймеров есть комплементарные выходы а если таких выходов не хватает и драйвер с встроенным мертвым временем - можно же вроде бы брать значения из той же таблицы со сдвигом 90 градусов? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 63 22 августа, 2022 Опубликовано 22 августа, 2022 · Жалоба On 8/22/2022 at 9:01 PM, Сергей Борщ said: таблицу надо делать на два периода, чтобы не думать о выходе за ее пределы при добавлении смещения для остальных фаз. Для каких остальных ? On 8/22/2022 at 9:01 PM, Сергей Борщ said: а если таких выходов не хватает и драйвер с встроенным мертвым временем - можно же вроде бы брать значения из той же таблицы со сдвигом 90 градусов? Если драйвер со встроенным мертвым временем, то тогда, скорее всего, у него уже есть собственные инверсные выходы. Если использовать таймер без комплементарных выходов, то тогда либо драйвер с комплементарными выходами, либо два таймера. И у каждого из таймеров настроить разные режимы работы схемы совпадения. Можно и еще что-то придумать. По месту, так сказать ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 79 22 августа, 2022 Опубликовано 22 августа, 2022 · Жалоба 15 minutes ago, Сергей Борщ said: таблицу надо делать на два периода, чтобы не думать о выходе за ее пределы при добавлении смещения для остальных фаз. на четверть периода, остальное решается примитивной арифметикой с сложением/вычитанием индекса, чтобы он в нужное место внутри этого четверть периода попал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 63 22 августа, 2022 Опубликовано 22 августа, 2022 · Жалоба On 8/22/2022 at 9:20 PM, _pv said: на четверть периода, Тогда с DMA не получится. И, кстати, я не удачный пример выше привел. Количество отсчетов в таблице лучше делать кратным степени двойки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimir 2 22 августа, 2022 Опубликовано 22 августа, 2022 · Жалоба В 22.08.2022 в 20:43, dimka76 сказал: Это и даст вам сдвиг 120 градусов для каждой фазы. Для инверсных каналов в STM32 у таймеров есть комплементарные выходы. Я вам формулу дал сдвига 3 массива.Думаю вы ошибаетесь.Или пытаетесь запутать меня.Насчёт таймера 1 нужно тоже почитать.Если есть инверсионные выходы то продублировать 3 массива а пустить на эти выводы.Но DMAэтот вариант наверное не подойдёт.А вот прерывание по таймеру проверенный вариант.Модуляция есть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 22 августа, 2022 Опубликовано 22 августа, 2022 · Жалоба 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 навалом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimir 2 22 августа, 2022 Опубликовано 22 августа, 2022 · Жалоба В 22.08.2022 в 21:01, Сергей Борщ сказал: а если таких выходов не хватает и драйвер с встроенным мертвым временем - можно же вроде бы брать значения из той же таблицы со сдвигом 90 градусов? Не 90 градусов а 180 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 63 22 августа, 2022 Опубликовано 22 августа, 2022 · Жалоба 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; // накладываем маску // и т.д. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться