PMW signal na ATmega16

Rasprava o AVR mikrokontrolerima, AVR projekti i drugo vezano za AVR...

Moderators: pedja089, stojke369, trax, InTheStillOfTheNight

Post Reply
em20
Posts: 6
Joined: 01-02-2015, 19:36

PMW signal na ATmega16

Post by em20 »

pozdrav svima

treba mi pmw signal na izlazu atmega16 i njegovi invert.
na faxu sam napravio pretvarac iz istosmjernog u izmjenicni napon i sad mi treba pwm za dobiti sinusni oblik napona.
nisam programer i molio bi Vas za pomoc

hvala
sonata
Napredujem
Napredujem
Posts: 121
Joined: 08-01-2013, 18:01

Re: PMW signal na ATmega16

Post by sonata »

Jednom davno sam se malo igrao sa 3 faze pa evo (slobodno zanemari dvije faze):

Code: Select all


//Program za PWM generiranje 3f sinusnog napona zadane frekvencije

#define faza1 11
#define faza2 3
#define faza3 10


int freq;
int kut;
int dc1; //duty cycle prve faze
int dc2;
int dc3;
unsigned long Tperiod;
unsigned long dt;
unsigned long Tcount;
byte sinus[120] = {127,134,140,147,153,160,166,173,179,185,190,196,202,207,212,217,221,226,230,234,237,240,243,246,248,250,251,252,253,254,254};

void setup()
{
  
  pinMode(faza1,OUTPUT);
  pinMode(faza2,OUTPUT);
  pinMode(faza3,OUTPUT);
  noInterrupts();
  TCCR2B &= B11111000;
  TCCR2B |= B00000010; //Postavljanje prescalera tako da PWM bude 4kHz
  TCCR1B &= B11111000;
  TCCR1B |= B00000010; //Postavljanje prescalera tako da PWM bude 4kHz

  interrupts();
  
  for(int i=0; i<31; i++)
  {
    sinus[i+30]=sinus[30-i];
  }
  
  for(int i=0; i<60; i++)
  {
    sinus[60+i]=254-sinus[60-i];
  }  //Ovime završava definicija LUT sinusa, 0 je 0, 1 je tri stupnja, 2 je 6 stupnjeva i.... 120 je opet nula (360/3)
  
  freq=50; //Frekvencija 50 Hz
  Tperiod=(833333/(100*freq)); //Zbog točnijeg računanja, ovo je 1000000/frekvencija pa podijeljeno sa 120 jer ćemo puni period podijeliti na 120 sekcija, umjesto na 360
  Tcount=micros();
  kut=-3;
  
}

void loop()
{
 if (micros()>=Tcount+Tperiod) {
   Tcount +=Tperiod;
   kut ++; //Uvećaj korak kuta za 1, što u LUT-u odgovara koraku 3 stupnja (jer smo periodu podijelili na 120 dijelova po 3 stupnja)
   if(kut==120) {
     kut=0;
   }
   dc1=sinus[kut] ; //Duty cycle PWM-a prve faze
   int kut2=kut-40; //(pomak faze za 120 stupnjeva, a naši koraci su po 3 stupnja pa je zato 40)
   if (kut2<0) {
     kut2=kut2+120;
   }
   int kut3=kut-80; //(pomak faze za 240 stupnjeva, a naši koraci su po 3 stupnja pa je zato 80)
   if (kut3<0) {
     kut3=kut3+120;
   }
   dc2=sinus[kut2];
   dc3=sinus[kut3];
   
   analogWrite(faza1, dc1);
   analogWrite(faza2, dc2);
   analogWrite(faza3, dc3); //Ovo je isključeno dok se ne sredi tajmer za frekvenciju treće faze
   
   
   //Kraj glavne petlje

}


}

Nisi napisao kakav je pretvarač, a i nećeš daleko samo sa PWM-om, pri uključivanju će ti prosvirati tranzistori (shoot through) bez dobrog drajvera...

Koji je ono faks u pitanju?

EDIT: Ovo je napisano u Arduinu, meni je AVR studio čisti overkill pa ga se i ne trudim koristiti. Arduino je dovoljan za 99% stvari, a kad treba prčkati po fuse-ovima, avrdude u komandnoj liniji je sasvim dovoljan :-)

MCU je Atmega 328, ali sve je to slično, samo treba pogledati datasheet za tajmere i pinove
Nullius addictus iurare in verba magistri
Shermanfep
Posts: 1
Joined: 25-07-2019, 11:36
Location: Spain
Contact:

PMW signal na ATmega16

Post by Shermanfep »

Hello.
I try simple program with MCP3202 and Atmega16. I use SPI master.
Something I do wrong. I need some help with this.
I attach datasheet of MCP3202 and program. Maybe I not understanding SPI protokol?
I did not find any simple example for this.
Post Reply