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
PMW signal na ATmega16
Moderators: pedja089, stojke369, trax, InTheStillOfTheNight
Re: PMW signal na ATmega16
Jednom davno sam se malo igrao sa 3 faze pa evo (slobodno zanemari dvije faze):
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
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
}
}
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
-
- Posts: 1
- Joined: 25-07-2019, 11:36
- Location: Spain
- Contact:
PMW signal na ATmega16
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.
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.