Простой генератор трехфазного синусоидального ШИМ сигнала -загатовка электропривода АД U/F=const

StrangerM
Offline
Зарегистрирован: 02.11.2013


// #include <util/delay.h> 


int ku=0 ;
float F1=0 ;
float F2=0 ;
float F3=0 ;
float ifl=0;

int FI1[260] ;
int FI2[260] ;
int FI3[260] ;
int i=0 ;
int iT= 256 ;


//******************************************************************** 
void setup()     
{   
  
  pinMode(8, OUTPUT);
   digitalWrite(8, LOW); 
  Serial.begin(9600) ;
  while (i<iT) {
    ifl=float(i)/iT ;
    F1=sin(6.28*ifl) ;
    FI1[i]=int(256*(F1+1)/2) ;
    F2=sin(6.28*ifl+(6.26/3)) ;
    FI2[i]=int(256*(F2+1)/2) ;
    F3=sin(6.28*ifl -(6.26/3)) ;
    FI3[i]=int(256*(F3+1)/2) ;
     Serial.print("FI1=") ;Serial.print(FI1[i]) ; 
     Serial.print("FI2=") ;Serial.print(FI2[i]) ; 
      Serial.print("FI3=") ;Serial.println(FI3[i]) ;
    i=i+1 ;
  }
       
    TCCR0B = TCCR0B & 0b11111000 | 2;//частота ШИМ 62500Гц 
     TCCR3B = TCCR3B & 0b11111000 | 1 ;//частота ШИМ 62500Гц 
      TCCR1B = TCCR1B & 0b11111000 | 1;//частота ШИМ 62500Гц 
     TCCR2B = TCCR2B & 0b11111000 | 1;//частота ШИМ 62500Гц 
     pinMode(11, OUTPUT);//выход ШИМ для тестирования частотомера 
   analogWrite(11, 128);  //Запустить ШИМ 
   pinMode(12, OUTPUT);//выход ШИМ для тестирования частотомера 
     analogWrite(12, 128);  //Запустить ШИМ 
      pinMode(10, OUTPUT);//выход ШИМ для тестирования частотомера 
     analogWrite(10, 128);  //Запустить ШИМ 
        pinMode(5, OUTPUT);//выход ШИМ для тестирования частотомера 
     analogWrite(5, 128);  //Запустить ШИМ 
      pinMode(8, OUTPUT);//выход ШИМ для тестирования частотомера 
     analogWrite(8, 128);  //Запустить ШИМ 
 
 digitalWrite(8, HIGH);
}   
//******************************************************************** 
void loop()     
{ 
  if (ku>255) ku=0 ;
 
   analogWrite(12, FI1[ku]);  //Запустить ШИМ 
       analogWrite(10, FI2[ku]);  //Запустить ШИМ 
           analogWrite(5,FI3[ku]);  //Запустить ШИМ 
    
 ku=ku+1 ;
 delayMicroseconds(10000/256); //без задержки 10 мс
       
}    

 

StrangerM
Offline
Зарегистрирован: 02.11.2013

Может уже где и было, однако, народ спрашивает, вроде. Для МЕГА 2560, частота несушей около 30 кГц, можно установить и 3 кГц. В строчках закомментированах как частота ШИМ 30 кГц для этого в конце строчки надо поставить вместо 1 двойку. В сетапе генереруются таблички 3 фаз с дискретизацией 256. На это (довольно долгое) время по выходу 8 блокируется ШИМ усилитель. Таблички меняют ШИМ в луупе, длительность периода приблизительно 10 мс. Увеличить можно задержкой или вычислительно-измерительным процессом. Вполне для асинхронного электропривода с законом U/F=const заготовка.

Увы, ошибка в заголове - следует читать заготовка. :-) Ежли модератор сможет, плз, исправьте!!!!!!!!!!!

Мне код в предыдущем сообщении код отредактировать не удалось, вот лучше и вернее.

int ku=0 ;
float F1=0 ;
float F2=0 ;
float F3=0 ;
float ifl=0;

int FI1[260] ;
int FI2[260] ;
int FI3[260] ;
int i=0 ;
int iT= 256 ;


//******************************************************************** 
void setup()     
{   
  
  pinMode(8, OUTPUT);
   digitalWrite(8, LOW); 
  Serial.begin(9600) ;
  while (i<iT) {
    ifl=float(i)/iT ;
    F1=sin(6.28*ifl) ;
    FI1[i]=int(256*(F1+1)/2) ;
    F2=sin(6.28*ifl+(6.26/3)) ;
    FI2[i]=int(256*(F2+1)/2) ;
    F3=sin(6.28*ifl -(6.26/3)) ;
    FI3[i]=int(256*(F3+1)/2) ;
     Serial.print("FI1=") ;Serial.print(FI1[i]) ; 
     Serial.print("FI2=") ;Serial.print(FI2[i]) ; 
      Serial.print("FI3=") ;Serial.println(FI3[i]) ;
    i=i+1 ;
  }
       
         TCCR3B = TCCR3B & 0b11111000 | 1 ;//частота ШИМ ~30 кГц 
      TCCR1B = TCCR1B & 0b11111000 | 1;//частота ШИМ ~30 кГц 
     TCCR2B = TCCR2B & 0b11111000 | 1;//частота ШИМ ~30 кГц 
   
   pinMode(12, OUTPUT);//выход ШИМ для тестирования частотомера 
     analogWrite(12, 128);  //Запустить ШИМ 
      pinMode(10, OUTPUT);//выход ШИМ для тестирования частотомера 
     analogWrite(10, 128);  //Запустить ШИМ 
        pinMode(5, OUTPUT);//выход ШИМ для тестирования частотомера 
     analogWrite(5, 128);  //Запустить ШИМ 
    
 
 digitalWrite(8, HIGH);
}   
//******************************************************************** 
void loop()     
{ 
  if (ku>255) ku=0 ;
 
   analogWrite(12, FI1[ku]);  //Запустить ШИМ 
       analogWrite(10, FI2[ku]);  //Запустить ШИМ 
           analogWrite(5,FI3[ku]);  //Запустить ШИМ 
    
 ku=ku+1 ;
 delayMicroseconds(10000/256); //без задержки 10 мс
       
}    

 

StrangerM
Offline
Зарегистрирован: 02.11.2013

Да, увеличить основную частоту можно уменьшая дискретизацию (ku=ku+n) приблизительно в n раз. 

Sirocco
Offline
Зарегистрирован: 28.09.2013

На 328 атмеге не полочится реализовать? Правильно понимаю, добавив мощные транзисторы станет можно крутить мощные трёхфазные движки? Частоту вращения менять можно?

StrangerM
Offline
Зарегистрирован: 02.11.2013

Про 328 не в курсах. Надо три ШИМ таймера. С приводом не все так просто. Необходима схемка россыпью до драйверов силовых транзисторов. Будет время опубликую простую. Т.е. надо получить сигналы верхнего и нижнего плеча с задержкой по включению.

А так да, частоту вращения можно менять. Останется даже время сигнал с таха простыми методами обработать. Ну и конечно остаются проблемы с напряжением питания силовой части и собственно поиском подходящей асинхронной машины.  

Sinister
Offline
Зарегистрирован: 14.06.2012

Есть готовые сборки на IGBT транзисторах. На форуме chipmaker.ru есть теперь уже закрытая тема по изготовлению самодельных ПЧ. Только в этой теме управление на специализированой микросхеме.

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

328р как раз 6 таймеров для ШИМ, в 8-й меге - 3.