Я посмотрел как это всё дело работает: напряжение преобразуется в постоянное. далее стоят 3 конденсатора, от конденсаторов провода идут на полумосты, а полумостами управляют драйверы, которые в свою очередь управляются контроллером.
Я покумекал и решил, что надо действовать. В качестве igbt транзистора использую FGH40N60SFD, в качестве драйвера не знаю что выбрать, но пока остановился на IR2101, в качестве контроллера хочу использовать arduino uno, у него как раз 6 шим пинов, да и писать я умею под него.
Подключение драйвера использовал по типовой схеме:

Нарисовал схемку.
Теперь по порядку. Bat1 я обозначил питание 12-15 вольт. Этого хватает, чтобы запитать драйверы и контроллер.
С1, С2, С3 конденсаторы по 400v, 825мф (цифры взял из своего сгоревшего частотника).
Rel1 - это реле, которым управляет arduino (на схеме не нарисовал провод).
IC4 - это собственно сам arduino uno, а точнее просто пины.
R24 - это потенциометр, который обозначает контроллеру, какая частота должна быть.
T6 - T11 - это FGH40N60SFD.
IC1, IC2, IC3 - IR2101
R15,16,17,22,19,20 - резисторы на 20 Ом.
D1, D2, D3 - диоды, но какие у них должны быть параметры не знаю, но думаю на sf 1А.
С4, С5, С6 - конденсаторы, почти понял, как они работают и что зависят от частоты шим (на arduino частота 488,28 Гц). Гуглением нашел число в 33мф/50v.

И распишу, как по моему должна работать программа на контроллере.
Если мы берем частоту 50гц, то в каждом полумосту каждый транзистор должен включаться/выключаться 25 раз. Причем второй полумост должен смещаться на 120 градусов, а третий на 240, получается такая картинка (примерно):

И получается такой код:
Код: Выделить всё
int interval = 1000/50; // Секунда/нужная нам частота
int last_millis = 0; // последняя миллисекунда в такте
while {
// получаем текущую миллисекунду
int millis = getMillis();
// если текущая милисекунда больше, чем последняя полученная, то обновляем последнюю полученную
if(millis > last_millis) {
last_millis = millis;
}
double k = 180 / interval; // получаем коэффициент частоты=градусов
// например k = 9 (180 / (1000 / 50));
// last_millis = 10мс, что означает максимальную высоту полупериода
double sin1 = sin(k * last_millis) * 255; // например sin(9 * 10) * 255 = 255, например sin(9 * 30) * 255 = -255
double sin2 = sin(k * last_millis - 120) * 255; // например sin(9 * 23.4 - 120) * 255 ~ 255;
double sin3 = sin(k * last_millis - 240) * 255; // например sin(9 * 36.6 - 240) * 255 ~ 255;
// 1 полумост
if(sin1 > 0) {
write(T7, sin1);
write(T6, 0);
}
else {
write(T6, sin1);
write(T7, 0);
}
// 2 полумост
if(sin2 > 0) {
write(T8, sin2);
write(T9, 0);
}
else {
write(T9, sin2);
write(T8, 0);
}
// 3 полумост
if(sin3 > 0) {
write(T10, sin3);
write(T11, 0);
}
else {
write(T11, sin3);
write(T10, 0);
}
}
write(int pin, double val) {
writeToPin();
}
Правильна ли схема и алгоритм переключения транзисторов?







