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

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

3 часа назад, MPetrovich сказал:

Или вместо 31250 Вы предлагаете определить:

  #define F_PWM   31250  ?

Предлагаю

#define	PWM_TICKS	256
#define F_PWM	((F_CPU) / PWM_TICKS)

Но даже ваш вариант с F_PWM значительно повысил бы читаемость.

3 часа назад, MPetrovich сказал:

Я на осциллографе ПЕРИОД измеряю. Он поверенный, развёртка точная. Частоту я вижу на экране, но это результат 1/Т.

Погрешность измерения периода какая? Насколько точно вы можете совместить линию с сигналом? И контроллер у вас от чего тактируется? От внешнего кварца или внутреннего RC, у которого точность +- трамвайная остановка и который для частоты, отличной от 1 МГц нужно вручную подстраивать записью константы (которую надо сначала вычитать программатором из сигнатуры) в регистр OSCCAL?

3 часа назад, MPetrovich сказал:

Длина таблицы 32 или 36. Я так понимаю, что чем длиннее таблица, тем меньше раз повторяется каждое значение при одинаковом шаге аккумулятора. По формуле подсчёта частоты выходит, что длина таблицы на частоту не влияет. Но так ли это я не уверен...

Ничего не понимаю. Как не влияет? Вот полная формула подсчета: F = step * F_PWM / (table_size * 2^N). Для таблицы в 32 ячейки индекс занимает 5 бит в 16-битном фазовом аккумуляторе, 11 бит остается на дробную часть. Отсюда получается step * 8000000 / 256 / (32 * 2^11) = ваша формула  step * 31250 / 65536.

Для размера таблицы в 36 ячеек и 16-битном аккумуляторе индекс будет занимать уже не 5, а 6 бит и 10 бит остается на дробную часть. Формула будет step * 8000000 / 256 / (36 * 2^10) и фазовый аккумулятор должен считать от 0 до 36*2^10-1, т.е. до 36863 (или от 36863 до нуля, что дает более короткий код).

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

Я тут подумал, может для таблицы в 36 значений вычислить другой размер фазового аккумулятора? Скажем такой: 36*1024=36864:russian_ru:

Обязательно, иначе просто работать не будет. И еще вычесть единичку.

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

Только надо аккумулятор во такой сделать: 36*2048=73728

Хозяин - барин, вы выделили 11 бит на дробную часть. Но ваш аккумулятор уже не влезает в 16 бит, под него надо выделять 32-битную переменную, все вычисления становятся 32-битными и уже с точки зрения вычислений нет никакой разницы, считать для 36 * 2^11 - 1 (73727) или для 36*2^(32-6) - 1 = 2415919103, только в последнем случае разрешение по частоте получается гораздо лучше.

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

Нет, не вариант. Искажается форма синуса на отрицательной полуволне.

Что-то делаете неправильно. Показывайте код.

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


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

31 минуту назад, Сергей Борщ сказал:

Погрешность измерения периода какая? Насколько точно вы можете совместить линию с сигналом?

Кстати, а один период ШИМ сколько получается по вашему осциллографу?

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


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

1 hour ago, Сергей Борщ said:

Кстати, а один период ШИМ сколько получается по вашему осциллографу?

Частоту ШИМ я померил сначала на осциллографе, а уж потом подсчитал в цифрах через тактовую частоту))) Так что точно меряет осциллограф, главное картинку развернуть пошире. Ну, на глаз погрешность процентов до трёх-пяти примерно...

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


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

давно не заглядывал а тута всё закипело , на знаю потянет мега128 стока  вычислений ? я сижу на XMEGA разогнанный до 48 мгц. , все самодельщики колхозят таблицу и на произвольное число точек , но не я , и заводят прерывание на число точек , я вам скину проги куда я подглядывал , открывается студией 5 , если найду

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


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

В 03.08.2023 в 10:58, MPetrovich сказал:

Не смог пока придумать приемлемый вариант переключения ШИМ-синуса между верхними и нижними ключами

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

Изменено пользователем Oleg.normalniy

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


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

42 minutes ago, Oleg.normalniy said:

Спасибо, покурим эти исходники)))

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


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

14 minutes ago, Oleg.normalniy said:

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

 

Нижние ключи у Вас открыты всего полпериода. Я имею в виду алгоритм на 180гр. Я на нем остановил свой выбор.

В принципе, я уже накидал прогу. Теперь только "доработать напильником" немножко осталось и с индикацией разобраться.

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


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

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

Во всяком случае синус на выходе дает такой же

правильной дорогой идёте товарисчи

ленин.webp

4 минуты назад, MPetrovich сказал:

Нижние ключи у Вас открыты всего полпериода. Я имею в виду алгоритм на 180гр

всё верно

но есть но , есть режим ШИМ-а две стороны , тама поиграться с нижним ключом , как в блдс не получиться

две стороны.png

ДВЕ СТОРОНЫ.logicdata

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


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

народ переходите на XMEGA , плюшки , разгон , если верить DATA-е , до 128 мгц. , система событий это почти полноценный второй проц , ацп пошустрей и много чего

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


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

Делюсь кодом формирования техфазной векторной ШИМ, упростил и удалил излишние для начала сложности. На вход подаётся заданный вектор напряжения в осях альфа-бетта, можете крутить его как хотите, самое простое это uX = A*cos(phi), uY = A*sin(phi).

 

void pm_voltage(pmc_t *pm, float uX, float uY)
{
	float		uA, uB, uC, uMIN, uMAX, uDC;
	int		xA, xB, xC;

	uX /= pm->quick_Udc;
	uY /= pm->quick_Udc;

	uA = uX;
	uB = - .5f * uX + .8660254f * uY;
	uC = - .5f * uX - .8660254f * uY;

	if (uA < uB) {

		uMIN = (uC < uA) ? uC : uA;
		uMAX = (uB > uC) ? uB : uC;
	}
	else {
		uMIN = (uC < uB) ? uC : uB;
		uMAX = (uA > uC) ? uA : uC;
	}

	uDC = uMAX - uMIN;

	if (uDC > 1.f) {

		uDC = 1.f / uDC;

		uA *= uDC;
		uB *= uDC;
		uC *= uDC;

		uMIN *= uDC;
		uMAX *= uDC;
	}

	if (pm->config_VSI_ZERO == PM_VSI_GND) {

		uDC = 0.f - uMIN;
	}
	else if (pm->config_VSI_ZERO == PM_VSI_CENTER) {

		uDC = .5f - (uMAX + uMIN) * .5f;
	}

	uA += uDC;
	uB += uDC;
	uC += uDC;

	xA = (int) (pm->dc_resolution * uA);
	xB = (int) (pm->dc_resolution * uB);
	xC = (int) (pm->dc_resolution * uC);

	pm->proc_set_DC(xA, xB, xC);
}

 

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


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

у меня нет таблицы , вернее она есть но она меняется по вашим хотелкам ( опция U и L ) , основная формула U/F=const. то есть напряжение делим на 50 гц. и получаем const. на 1 гц , а дальше const x F (частота) и раскидываем в массиве для каждой частоты (обороты) , дальше беру из массива 1 число соответствуешей частоты (обороты) и прогоняю по другому уравнению на 24 точки и закидываю в другой массив 2 , и как только F +1 , беру другое число из массива 1 и опять прогоняю по уравнению и в массив 2 , а из массива 2 закидываю в таймеры , пока трудно понять но я вам помогу и если вы раскроете мой секрет , всё должно только между нами

сталин.webp

а лучше Вам самим придумать свой алгоритм , а то народ будет спрашивать кто у кого списал ?

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


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

а теперь о сложном , на самом деле у меня другая формула U + (ваши хотелки по опции U)/ F (только 50гц)=const. и в массив 1 по const. x F (частота до 50 гц. свыше 50-100 гц. другое уравнение) , дальше переменная L только для малых оборотов , и с повышением F переменная L декремент , и дальше я заметил что примерно от 15 до 25 гц. идет провал мощности и тогда я завел две переменные которые следят сами за собой на понижение и повышение числа , и корректируют число и только потом число попадает на уравнение 24 точки , а дальше вы все знаете

сталин.webp

Изменено пользователем Oleg.normalniy

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


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

Модератор: Oleg.normalniy, освежите знания правил форума. Нецензурная и грубая лексика тут запрещена и требование высказываться грамматически правильно там тоже прописано. Ваши нарушающие правила сообщения скрыты.

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


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

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

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

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

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

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

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

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

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

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