Вт дек 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) { ... }
65536 точек 128 точек
0 800,00 800,00
512 839,25 839,25
1024 878,41 878,41
1536 917,38 917,38
2048 956,07 956,07
2560 994,38 994,38
3072 1032,23 1032,23
3584 1069,51 1069,51
4096 1106,15 1106,15
4608 1142,04 1142,04
5120 1177,12 1177,12
5632 1211,28 1211,28
6144 1244,46 1244,46
6656 1276,56 1276,56
Вт дек 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