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

Как состряпать алгоритм синусоидального ШИМ?

Здравствуйте все!

Хочу сделать синусоидальный ШИМ, а получается что скважность по синусоидальному закону меняется. Вот на видео как, а надо как на картинке. К сожалению видео не вместилось.Но там скважность меняется от минимальногодо максимального значения. Вот формула 

TIM1->CCR1 = (uint16_t)(1818 + (Amp * sinf(ind * 6.283f / accur)));
if(ind < accur) ind++;
	  	  else ind = 0;

Я думал , что на каждый треугольник счетчика , хотя так и получается что на каждый и ШИМ меняется по одной формуле. Вот не знаю как этот алгоритм сделать

IMG_20230304_154855.jpg

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


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

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

А частоту ШИМ поднять нельзя?

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


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

Заранее обсчитайте таблицу синуса, заполните массив. А потом подставляйте в CCR1 значения из этого массива, по событию (прерыванию) обновления счета. При этом, должна быть включена буферизация записи CCR. Ввиду того, что расчет синуса занимает много процессорного времени, таблицу желательно иметь заранее сгенерированную.

 

 

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

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


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

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

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


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

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

Ввиду того, что расчет синуса занимает много процессорного времени

Правда что-ли? ~1 такт (на ARM) - это "много процессорного времени"??? :shok:

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


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

правда-правда. Вначале посмотрите, что там написано, потом будете писать очередную глупость.

Автор конечно написал мессагу так, что ничего непонятно, какие "треугольники счета" и что именно не получается. Возможно, невыставленный бит предзагрузки OC1PE, возможно, слишком долго идет расчет флоатов, возможно, вообще неверно построил алгоритм. 
Нет особого смысла высчитывать в каждом приращении угла синусоиды новое значение, можно брать из заранее просчитанной таблицы для периода. Или полупериода. Или даже четверти периода. Функция то симметричная по двум осям. Перезаписывать новым значением регистр CCR1 нужно с частотой шагов приращения угла синуса, то есть, от второго таймера, задающего частоту синусоидального сигнала, получаемого в результате фильтрации ШИМ.
Вообще, ШИМ - это ШИМ. Его частота - это частота ШИМ, влияющая на фильтрацию выходного сигнала. А частота синусоидальной огибающей выходного сигнала, получаемого после фильтрации ШИМ - это уже другая частота, она не связана с частотой ШИМ. Вернее, она конечно может быть кратна ей, но это частный, необязательный случай.

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

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


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

    a =  intangle1 / 1024;
    dimpos = sin1024_3 + (a % 1024) * 3 + a / 1024;
    
    TIM1->CCR1 = *dimpos++;
    TIM1->CCR3 = *dimpos++;
    TIM1->CCR2 = *dimpos;

    intangle1 += freq1;
    intangle1 %= 3072*1024;


static const uint16_t sin1024_3 [] = {
2048	,	3821	,	274	,
2052	,	3819	,	272	,
2056	,	3816	,	270	,
2060	,	3814	,	268	,
2064	,	3812	,	266	,
2068	,	3810	,	264	,
2073	,	3808	,	262	,
...
  

Я по таймеру вызываю такую функцию, а сам шимогенерящий таймер работает сам по себе, его вообще не трогаю, только цэцээры.

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

image.thumb.png.81ce3520f49c818c759e55a1a425bc23.png

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


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

Спасибо за ответы ! А прерывание обновления счета в каком регистре? я что то не нашел. У меня 407 проц

У меня 3 такие формулы рассчитываются за 12мкс.

"треугольники счета" это образно) ШИМ с выравниванием по центру

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


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

Менять CCR надо в обработчике прерывания "Update Event" Такой обработчик-это UIF ?

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


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

19 минут назад, khlenar сказал:

Менять CCR надо в обработчике прерывания "Update Event" Такой обработчик-это UIF ?

Да. И правильно тут советуют, рассчитать значения CCR таблично и обработчике UIF только перенести очередное значение в CCR. Нехорошо в обработчике прерывания вести float-вычисления.

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


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

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

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


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

48 minutes ago, khlenar said:

У меня 3 такие формулы рассчитываются за 12мкс.

Ужасно много для такой задачи, на f407 это около 1k fp операций умножения/сложения.

Делали бы с помощью поворота вектора, и не нужны ни тригонометрический функции ни таблицы.

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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