Расчет таблицы SIN для управления асинхронным трехфазным двигателем.
PERIOD-значение периода таймера, искусственным нулем будет период деленный на два.
NUMBER-количество вычислений синусоиды, должно быть только четным.
OFFSET-синусоида смещенная относительно нуля периода, используется для понижения момента на валу, значение должно быть меньше периода или ноль(будет синусоида периода).
Period and Offset-если поставите галочку будет выводится два результата PERIOD и OFFSET.
Что бы рассчитать правильную синусоиду вы должны выполнить два условия для NUMBER, первое значение должно быть четным и второе делится без остатка на три!
Расчет смещения фаз в таблице выполняется следующим образом например имеем NUMBER со значением 24( четное и делится на три) и знаем что все фазы должны быть смещены друг от друга на 120 градусов которых в 360 градусах будет 360/120=3, находим смещение для фаз в нашем вычисленном массиве будет 24/3=8, если фаза_1 номер массива 0 то фаза_2 фаза_1+8=8, фаза_3 фаза_2+8=16 или W=fase[0], U=fase[8] и V=fase[16].
Nikolay 2019-02-12 23:44:27Вечер добрый ! Да разобрался в моём понимании (может я и не прав) расчёт синусоиды будет выглядеть так... Я приведу код на СИ, посмотреть и проверить работу можно вот здесь https://www.onlinegdb.com/online_c_compiler. Данный код можно адаптировать для плавного разгона и остановки двигателя ... Я постарался соблюсти все ВАШИ условия перечисленные выше.. В сотый раз спасибо!!!
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int Period;int Number;int Offset;int z;int x;double pi = 3.14159;float a;float b;
int main()
{ system("chcp 1251");
system("cls");
printf("Введите значение периода = ");
scanf("%d",&Period);
printf("Period = %d OK!
",Period);
printf("Введите значение Number = ");
while(1){
scanf("%d",&Number);
if (Number %2 == 0 && Number %3 == 0 ){
printf("Number = %d OK!
",Number);
break;
}
else{
printf("Значение точек синуса должно быть чётным и делится на три
");
continue;
}
}
printf("Введите значение OFFSET = ");
while(1){
scanf("%d",&Offset);
if (Offset<Period || Offset == 0 ){
printf("Offset = %d OK!
",Offset);
break;
}
else{
printf("значение OFFSET, должно быть меньше периода (Period)
");
printf("либо значение OFFSET должно быть равно 0...
");
continue;
}
}
z = Period/2;
x = Offset/2;
a = (float)2.000*(1.000/Number);
b = (float)2.000*(1.000/Number);
printf(" a = %8.4f
",a);
printf("Period ....
");
for (int i = 0;i<Number;i++){
int q;
printf("%d",q = z+(z*sin(pi*i*a)));
printf(";");
}
if(Offset<Period&&Offset!=0){
printf("
b = %8.4f
",b);
printf("OFFSET ....
");
for (int i = 0;i<Number;i++){
int m;
printf("%d",m = z+(x*sin(pi*i*a)));
printf(";");
}
}
else if (Offset==0) {
printf("
Good Bye!!!");
}
getchar();
return 0;}
Nikolay 2019-02-13 00:08:58Весь код получился в куче ... на https://www.onlinegdb.com/online_c_compiler. будет кидать ошибку при нажатии на RUN... что бы избежать ошибки надо #include <stdio.h> #include <stdlib.h> #include <math.h> разделить нажатием клавиши ENTER
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int Period;int Number; и т.д. и должно всё заработать ... у меня работает!