Вт дек 21, 2021 13:01:50
Вт дек 21, 2021 13:43:46
Ну дык объясни.jcxz писал(а):Складывается впечатление что вы не понимаете как работает ШИМ....
jcxz писал(а):по формуле синусоиду генерить - однозначно быстрее.
Вопрос не уместен, пока на выше вопрос не ответите.jcxz писал(а):Разницу между скачками 360/128 градусов (у вас) и 360/65536 градусов (у меня) понимаете?
Вт дек 21, 2021 14:01:42
Вт дек 21, 2021 14:15:16
А частота ШИМ, к примеру, 10кГц.jcxz писал(а): И вызывается эта функция с частотой ШИМа.
Мы об этом уже говорилиjcxz писал(а):Результат sin(x) - тоже 16 бит.
Ну и, хочу шим 10кГц 16БИТjcxz писал(а):Разрешение ШИМ определяется соотношением = частота_тактирования_таймера/частота_ШИМ
Dimon456 писал(а):FFFF*10кГц = 655МГц
Вт дек 21, 2021 14:49:17
Dimon456 писал(а):FFFF*10кГц = 655МГц
#define F_TIM 16000000 //[Гц] частота тактирования таймера
#define F_PWM 10000 //[Гц] частота ШИМ-а
#define F_SIN 15 //[Гц] частота синусоиды
#define B16 0x00010000ul
#define divRound(a, b) (((a) + (b) / 2u) / (b)) //деление a/b с округлением до ближайшего целого
#define PHASE_STEP (divRound((u64)F_SIN << 32, F_PWM)) //шаг фазы генератора; формат U0.32
#define PERIOD_TIM (F_TIM / F_PWM) //период таймера ШИМ
//Sinus. {x} == angle[rad] / PI * 2^15
//return: {-2^15+1...+2^15-1} == {-1...+1}
s16 Sine(s16 x) { ... }
u16 magnitude = ...; //должно быть в диапазоне 0...PERIOD_TIM
void Gen() //выполняется с частотой F_PWM
{
static u32 phase;
phase += PHASE_STEP;
u16 x = phase >> 16;
u16 ccr0 = ((u32)((s32)sin(x + B16 * 0 / 3) * magnitude) >> 16) + PERIOD_TIM / 2;
u16 ccr1 = ((u32)((s32)sin(x + B16 * 1 / 3) * magnitude) >> 16) + PERIOD_TIM / 2;
u16 ccr2 = ((u32)((s32)sin(x + B16 * 2 / 3) * magnitude) >> 16) + PERIOD_TIM / 2;
//ccr0,ccr1,ccr2 - значения, записываемые в регистры сравнения таймера для всех 3-х фаз
}
Вт дек 21, 2021 18:00:24
Возможно и не понимаю.jcxz писал(а):Вы похоже не понимаете что такое ШИМ, что такое "частота ШИМ-а".
static u32 phase;
phase += PHASE_STEP;
u16 x = phase >> 16;
F_PWM 10000 //[Гц] частота ШИМ-а
#define PERIOD_TIM (F_TIM / F_PWM) //период таймера ШИМ
//Sinus. {x} == angle[rad] / PI * 2^15
//return: {-2^15+1...+2^15-1} == {-1...+1}
s16 Sine(s16 x) { ... }
Вт дек 21, 2021 19:04:46
Вт дек 21, 2021 22:57:13
Чт дек 23, 2021 12:48:24
Чт дек 23, 2021 15:08:01
jcxz писал(а): 4-й раз повторяю: Я НЕ ИСПОЛЬЗОВАЛ ТАБЛИЦ. Никаких.
Мне не удалось найти в инете готового решенияDimon456 писал(а):Этот друг полином считает, сразу бы сказал
{-2^15+1...+2^15-1}
{-2^14 ... 2^14}
У меня комповый бесперебоник есть с полиномом 3-го порядка.jcxz писал(а):Синус прекрасно аппроксимируется полиномом 7-го порядка.
Имелось ввиду сколько времени тратится на расчет одной точки. Я привел пример 16,25us.jcxz писал(а):Очевидно, что код выполняется от момента включения контроллера до его выключения.
Чт дек 23, 2021 23:08:28
//Синус. Аргумент R0 == угол[радиан] / PI * 2^31
//Результат: R0{-2^31+1...+2^31-1} == {-1...+1}
s32 sine(s32 x)
{
static s32 const sineT[] = {
-248273015, //A6=-0.9248890576
845095976, //A5=3.1482278419
-53406011, //A4=-0.1989528976
-1377768453, //A3=-5.1325874557
-830572, //A2=-0.0030941259
843345115, //A1=3.1417053758
-266}; //A0=-0.0000009929
s32 const *p = sineT;
s32 i, y;
if ((i = x << 1) < 0) i = -i;
i >>= 1;
y = *p++;
do y = (s32)((s64)y * i >> 31) + *p++;
while (p != sineT + ncell(sineT));
if ((y <<= 2) < 0) y = -y;
if (y >> 30) y = B30 - 1; //ограничим диапазоном 0...2^30-1
if (x < 0) y = -y;
return y << 1;
}
Вс дек 26, 2021 21:13:22
Сб янв 01, 2022 14:41:12
Вс янв 02, 2022 19:49:49
Пн янв 03, 2022 23:15:20
Ср янв 05, 2022 07:10:16
Ср янв 05, 2022 09:18:20
Astrahard писал(а):Здорово, что на STM8 одноразовой сделали.
Astrahard писал(а):Просто феноменально крутая идея.
Astrahard писал(а):с помощью электронного предохранителя на IGBT в цепи +310В.
Astrahard писал(а):А это не хотите попробовать.
Ср янв 05, 2022 11:57:54
Чт янв 06, 2022 17:20:37
Вс янв 16, 2022 11:24:55