PWM fuer Inverter

The_Scientist

Neues Mitglied
26. Feb. 2011
91
1
0
Country Club Legetafo in Ethiopia
Sprachen
  1. BascomAVR
  2. ANSI C
  3. Assembler
Hallo ihr Lieben,

ich bin gerade dabei einen Inverter (3-Phase) zu bauen. Eigentlich nichts neues, aber ich wollte halt einmal auf ein vorhandenes Projekt zurueckgreifen.
Die eigentliche Schaltung sowie das Programm fuer den ATMega328P stammen von Omar David Muñoz von der California Polytechnic State University.
Ich wollte dieses Projekt mit meiner Azubine/Assistentin nachbauen, dabei ist mir aufgefallen, dass es wie von Herrn Omar David Muñoz beschrieben nicht funktioniert.
Das Problem waren die LM339, welche hier nicht verfuegbar sind und ein Nachbau mit anderen OPAMPs hat leider nicht wirklich funktioniert.
Dies hat bei mir die Frage aufgeworfen, ob es denn wohl mit den LM339 jemals funktioniert haette....
Ich habe mir die LM339 aus Dubai bringen lassen und das Ganze 1:1 nachgebaut -> es funktionierte nicht....

Das Signal fuer den Gatedriver war nicht ok....

Also alles umgekrempelt und die LM339 gegen RC4558 getauscht und als Gate-Driver einen IR2131 anstatt des IRS2336!
Die Software habe ich ein wenig angepasst, so dass der Frequenzbereich, nicht wie zuvor bei 0-1023Hz, von 1 - 85Hz geregelt werden kann...
Sonst stammt die Software aber von Herrn Omar David Muñoz (Ehre wem Ehre gebuehrt - zumindest fuer die Software)...

Als PWM-Quelle habe ich allerding anstatt eines ADRUINO Uno ein myAVR USB2.10 Board mit einen ATMega328P verwendet...

Hier mal der Plan fuer die Signalerzeugung PWM -> High-Side / Low-Side. Das Ganze natuerlich x 3 da ja 3 Phasen...

Filter.GIF

Der Source Code des Programms :

Code:
/******************************************************************
 * DDS-sinewave - 3phase
 * by Omar David Muñoz 
 ******************************************************************/
#include "avr/pgmspace.h"
#include "avr/io.h"
// table of 256 sine values / one sine period / stored in flash memory
PROGMEM prog_uchar sine256[] =
{
  127,130,133,136,139,143,146,149,152,155,158,161,164,167,170,173,176,178,181,184,187,190,192,195,198,200,203,205,208,210,212,215,217,219,221,223,225,227,229,231,233,234,236,238,239,240,242,243,244,245,247,248,249,249,250,251,252,252,253,253,253,254,254,254,254,254,254,254,253,253,253,252,252,251,250,249,249,248,247,245,244,243,242,240,239,238,236,234,233,231,229,227,225,223,221,219,217,215,212,210,208,205,203,200,198,195,192,190,187,184,181,178,176,173,170,167,164,161,158,155,152,149,146,143,139,136,133,130,127,124,121,118,115,111,108,105,102,99,96,93,90,87,84,81,78,76,73,70,67,64,62,59,56,54,51,49,46,44,42,39,37,35,33,31,29,27,25,23,21,20,18,16,15,14,12,11,10,9,7,6,5,5,4,3,2,2,1,1,1,0,0,0,0,0,0,0,1,1,1,2,2,3,4,5,5,6,7,9,10,11,12,14,15,16,18,20,21,23,25,27,29,31,33,35,37,39,42,44,46,49,51,54,56,59,62,64,67,70,73,76,78,81,84,87,90,93,96,99,102,105,108,111,115,118,121,124
};
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#define PWM_OUT_1 11 // PWM output on pin 11
#define PWM_OUT_2 10 // PWM output on pin 10
#define PWM_OUT_3 9 // PWM output on pin 9
#define LED_PIN 13 // LED status on pin 13
#define TEST_PIN 7 // Scope trigger on pin 7
#define POTEN_IN 0 // Potentiometer on pin 0
#define OFFSET_1 85 // Offset for second-phase
#define OFFSET_2 170 // Offset for third-phase
double dfreq;
const double refclk = 31376.6; // measured
const uint64_t twoTo32 = pow(2, 32); // compute value at startup and use as constant
// variables used inside interrupt service declared as voilatile
volatile uint8_t icnt; // var inside interrupt
volatile uint8_t icnt1; // var inside interrupt
volatile uint8_t c4ms; // counter incremented every 4ms
volatile uint32_t phase_accum; // pahse accumulator
volatile uint32_t tword_m; // dds tuning word m
//******************************************************************
void setup()
{
  pinMode(LED_PIN, OUTPUT); // sets the digital pin as output
  Serial.begin(115200); // connect to the serial port
  Serial.println("DDS Test");
  pinMode(TEST_PIN, OUTPUT); // sets the digital pin as output
  pinMode(PWM_OUT_1, OUTPUT); // PWM output / frequency output
  pinMode(PWM_OUT_2, OUTPUT); // PWM output / frequency output
  pinMode(PWM_OUT_3, OUTPUT); // PWM output / frequency output
  // Setup the timers
  setup_timer1();
  setup_timer2();
  // disable interrupts to avoid timing distortion
  cbi (TIMSK0, TOIE0); // disable Timer0 !!! delay() is now not available
  sbi (TIMSK2, TOIE2); // enable Timer2 Interrupt
  dfreq = 1000.0; // initial output frequency = 1000.0 Hz
  tword_m = twoTo32 * dfreq / refclk; // calulate DDS new tuning word
}
//******************************************************************
void loop()
{
  if (c4ms > 250) // timer / wait for a full second
  {
    c4ms = 0;
    dfreq = analogRead(POTEN_IN); // read Poti on analog pin 0 to adjust output frequency from 0..1023 Hz
    cbi (TIMSK2, TOIE2); // disble Timer2 Interrupt
    if (dfreq < 12)
    {
      dfreq = 12;
    }
    dfreq = dfreq / 12;
    tword_m = twoTo32 * dfreq / refclk; // calulate DDS new tuning word
    sbi (TIMSK2, TOIE2); // enable Timer2 Interrupt
    Serial.print(dfreq);
    Serial.print(" ");
    Serial.println(tword_m);
  }
}
//******************************************************************
// timer1 setup
// set prscaler to 1, PWM mode to phase correct PWM, 16000000/512 = 31.25kHz clock
void setup_timer1(void)
{
  // Timer1 Clock Prescaler to : 1
  sbi (TCCR1B, CS10);
  cbi (TCCR1B, CS11);
  cbi (TCCR1B, CS12);
  // Timer0 PWM Mode set to Phase Correct PWM
  cbi (TCCR1A, COM1A0); // clear Compare Match
  sbi (TCCR1A, COM1A1);
  cbi (TCCR1A, COM1B0); // clear Compare Match
  sbi (TCCR1A, COM1B1);
  sbi (TCCR1A, WGM10); // Mode 1 / Phase Correct PWM
  cbi (TCCR1A, WGM11);
  cbi (TCCR1B, WGM12);
  cbi (TCCR1B, WGM13);
}
//******************************************************************
// timer2 setup
// set prscaler to 1, PWM mode to phase correct PWM, 16000000/512 = 31.25kHz clock
void setup_timer2(void)
{
  // Timer2 Clock Prescaler to : 1
  sbi (TCCR2B, CS20);
  cbi (TCCR2B, CS21);
  cbi (TCCR2B, CS22);
  // Timer2 PWM Mode set to Phase Correct PWM
  cbi (TCCR2A, COM2A0); // clear Compare Match
  sbi (TCCR2A, COM2A1);
  sbi (TCCR2A, WGM20); // Mode 1 / Phase Correct PWM
  cbi (TCCR2A, WGM21);
  cbi (TCCR2B, WGM22);
}
//******************************************************************
// Timer2 Interrupt Service at 31.25kHz = 32us
// this is the timebase REFCLOCK for the DDS generator
// FOUT = (M (REFCLK)) / (2 exp 32)
// runtime : 8 microseconds ( inclusive push and pop)
ISR(TIMER2_OVF_vect)
{
  sbi(PORTD, TEST_PIN); // Test / set PORTD,TEST_PIN high to observe timing with a oscope
  phase_accum += tword_m; // soft DDS, phase accu with 32 bits
  icnt = phase_accum >> 24; // use upper 8 bits for phase accu as frequency information
  OCR2A = pgm_read_byte_near(sine256 + icnt); // read value fron ROM sine table and send to PWM DAC
  OCR1A = pgm_read_byte_near(sine256 + (uint8_t)(icnt + OFFSET_1));
  OCR1B = pgm_read_byte_near(sine256 + (uint8_t)(icnt + OFFSET_2));
  if (icnt1++ == 125) // increment variable c4ms every 4 milliseconds
  {
    c4ms++;
    icnt1 = 0;
  }
  cbi(PORTD, TEST_PIN); // reset PORTD,TEST_PIN
}

Die Dokumentation von Herrn Omar David Muñoz :

http://www.google.com.et/url?sa=t&r...pWyQXsCzf9rZC-kpC72r51A&bvm=bv.63808443,d.d2k

Werde in den naechsten Tagen mit Sara das Projekt anfangen und ueber den Werdegang berichten..


LG aus Addis


Klaus
 
Dies hat bei mir die Frage aufgeworfen, ob es denn wohl mit den LM339 jemals funktioniert haette....
Ich habe mir die LM339 aus Dubai bringen lassen und das Ganze 1:1 nachgebaut -> es funktionierte nicht....
der Plan von Omar David Muñoz ist ein anderer als deiner.
Während Omar hier eine Dead time mit Fensterkomparator erzeugt, machst du einen Mischmasch aus digitalen und analogen Signalen.
Klar, dass es nicht funktioniert.

SickBoy
 
Hmmmm

Hallo SickBoy,

Der Unterschied ist, dass meine Schaltung jetzt aber ein vernuenftiges High-/Low-Side Signal ausgibt und die Deadtime doch eh vom IR2131 (auf IRS 2336)
gemacht wird....
Verstehe jetzt nicht so ganz was Du meinst.....:confused: Vielleicht seh ich aber mal wieder den Wald vor lauter Baeumen nicht.
Wenn Du meinst, dass man ja mit dem Ausgang vom ATMega direkt auf den IR2131 gehen kann und den Mix-Up mit dem analog Part nicht braucht,
so stimmt dass nur halbwegs....
Dann muesste ich, fuer mein Verstaendnis, 6 PWM Signale generieren und nicht nur 3. Und dies ist mit einem "normalen" ATMega
nicht so einfach - zumindest vom Timing.....mit einen AT90PWM3B und alles in ASM.....klar kein Problem - aber dann erschlage ich Sara damit...

Ich habe die Schaltung von mir ja bereits einmal aufgebaut und die Signale versuchsweise dem IR2131 auf dem Steckbrett zugefuehrt....
Allerdings ohne richtige Last und Strombegrenzt auf 300mA. Aber die 3-Phasen waren korrekt und sauber im gesamten Frequenzbereich.

Hat prima geklappt....Will halt jetzt das ganze nocheinmal aufbauen mit PCB usw. als Lehrstueck fuer Sara...



LG aus Addis


Klaus
 
Hallo Klaus,

Hier mal der Plan fuer die Signalerzeugung PWM -> High-Side / Low-Side. Das Ganze natuerlich x 3 da ja 3 Phasen...

ich hab mir die Schaltung mal angesehen und bezweifle, dass diese Schaltung sinnvoll funktioniert.
Das Signal (PWM1) lauft durch die RC/LC-Glieder und dürfte am Pin 3 des OPV sinusähnlich ankommen, da der OPV ohne Gegenkopplung betrieben wird, arbeitet er als Komparator.
Am Ausgang (Pin 1) wird also wieder ein Rechtecksignal entstehen, damit steht bereits fest, dass die ganze Sinus-Erzeugung rel. sinnlos war.
Der zweite OPV (Eingänge Pin5 und Pin6) macht überhaupt keinen Sinn! Die beiden Eingänge sind über einen Widerstand (R5 139 Ohm) verbunden, der OPV ist ein Differenzverstärker, hier wird aber nie eine Differenz entstehen!
Der Ausgang (Pin 7) wird möglicherweise "zufällig" durch Nichtlinearitäten des OPV schalten, kann mir nicht vorstellen, dass dies gewünscht ist.
IC 3 Pin 1 hängt an einem Spannungsteiler und somit auf ca. 1,66V (1/3 VCC) - eindeutig im "verbotenen Bereich".
Die ganze Schaltung ist aus meiner Sicht dringend verbesserungswürdig, bevor das Leistungsteil angeschlossen wird!

Gruß
- gp177 -
 
Danke, Verbesserungen sind willkommen...

Hallo gp177,

erst einmal lieben Dank fuers druebr schauen...
Ich bin fuer alles offen, besonders wenn es um Verbesserungen geht....
Dass ich da erst einen Sinus draus gemacht habe, habe ich mir a) bei der Schaltung von Omar David Muñoz abgeschaut,
und b) fand ich die Idee ein enable-Signal zu haben gut um Stoerimpulse zu unterdruecken.

Der OP arbeitet als Komperator und gibt eine negative Flanke bei jeder halbwelle die ueber 3.32V liegt...
Der andere OP gibt eine negative Flanke wenn die Sinuskurve unterhalb 1.66V liegt.
Somit habe ich am zweiten OP eine neg. Flanke fuer jede "Halbwelle", wenn ich die dann AND verknuepfe, so
habe ich zwei getrennte Flanken mit ein wenig dT. Diese dann ueber die Inverter und AND's - Am Ende kommen
zwei getrennte (fuer IR2131 richtig polarisierte) PWM-Signale raus.....

So zumindes auf meinem Steckbrett....

Aber BITTE, wenn es einfacher und besser geht - Hilfe ist willkommen - Man lernt ja nie aus....


LG

Klaus
 
Hallo Klaus,

ich hab nochmal deine Schaltung mit der "original" Schaltung verglichen, da gibt es doch erhebliche Unterschiede - schau dir mal Bil 4.3 im Original an, hier wird aus dem PWM-Signal (an R1) ein Sinus-Signal gemacht, dieses wird auf die beiden Komparatoren gegeben, diese erzeugen an ihren Ausgängen entgegengesetzte Signale (würde auch mit einem Komparator und einem Inverter funktionieren), diese sperren dann den oberen bzw. unteren Zweig. Das PWM-Signal bleibt aber (anders als bei deiner Schaltung) erhalten, siehe auch Bild 4.4.
Bei deiner Schaltung geht einiges durcheinander - vergleich nochmal genau mit dem Original.

Gruß
- gp177 -
 
Original funktionierte bei aber micht..

Hallo gp177,

das Problem war ja, dass der original Aufbau bei mir nicht funktioniert hatte.
Erst hatte ich versucht, in Ermangelung der LM339, den Komperator mit verfuegbaren OPAMPs nachzubauen.
Das sollte ja eigentlich klappen...normalerweise klappt das auch bei mir mit den OPAMPs, aber in der original
Schaltung, selbst nachdem ich mir muehevoll die LM339 aus Dubai habe besorgen lassen,hat es nicht funktioniert...da kam kein PWM Signal am Ende raus...

Als ich dann meine "Wirre" Loesung gefunden hatte, hatte ich zumindest die PWM Signale sauber und scharf abgetrennt....

Wo liegt den jetzt der Fehler? Ich stehe warscheinlich wieder im Wald...


LG

Klaus
 
Hallo Klaus,

das Problem habe ich schon in #4 und #6 beschrieben - ich wiederhole mich ungern.
Was soll am Ende bei der ganzen Sache herauskommen ? Motorsteuerung ?

- gp177 -
 
Naja

Hallo gp177,

ich habe #4 und #6 gelesen, wenn es also danach geht, duerfte meine Schaltung nicht funktionieren - tut sie aber...
Und die original Schaltung aus der Doku funktioniert nicht!

Am Ende soll eine kleine Motosteuerung fuer einen 1.5HP Motor dabei rauskommen, den wir hier im Lab fuer Testzwecke haben....
Keine Last dran und nur zur Veranschaulichung....also ohne VQS und so'n zeug....einfach mal drehen lassen - Startup bei 50Hz und dann langsam hoch oder runter....


LG

Klaus
 
Hallo Klaus,

sorry, war vorhin etwas genervt. Ich hab ja nicht behauptet das deine Schaltung grundsätzlich nicht funktioniert, es sollten lediglich Hinweise sein, wo Ungereimtheiten bzw. potentielle Probleme lauern.
Wenn ein TTL-Gatter im "verbotenen Bereich" betrieben wird, sind Probleme vorprogrammiert. Wenn dann, wie angenommen eine Motorsteuerung dranhängt, wo mit erheblichen Strömen zu rechnen ist, kann die Sache leicht kippen!
Ich hab mir das Programm noch nicht näher angesehen, aber bedenke, dass bei einer Frequenzregelung alle 3 PWM-Signale ihren Phasenversatz von 120 Grad beibehalten müssen.
Beim Leistungsteil ist auch äußerste Vorsicht geboten, da ich annehme, dass es sich um einen "normalen" Drehstrommotor (230V / 400V) handelt, wirst du den wohl mit 3 Vollbrücken ansteuern müssen, da kann ein kleiner Fehler schnell jede Menge Elektronikschrott erzeugen.
Auf jeden Fall wünsche ich dir gutes Gelingen bei diesem doch recht anspruchsvollen Projekt.

Gruß
- gp177 -
 
Spannungsteiler

Hallo gp177,

keine Sorge, habe das nicht falsch aufgefasst....

Was den TTL Pegel (1.66V) angeht, so hast Du natuerlich Recht. Laut Datenblatt fuer einen "normalen" 74 LS 08 werden min. 2,0V angegeben.
Werde den Spannungsteiler entsprechend ein wenig verziehen...hatte diesen so vom vorherigen Versuchsaufbau der original Schaltung beibehalten....

Aber hast Du eine Erklaerung warum die original Schaltung nicht funktioniert?
Selbst mit den LM339 und 6 oder 7 mal neu aufgebaut hat es nie funktioniert....
Wenn ich mir die Schaltung anschaue, so macht alles Sinn und sollte funktionieren....aber?!

Was mein/unser Projekt hier angeht, so bleiben die Phasen stets 120° verschoben und via IR2131 geht es damit
auf eine 3-Phasen Vollbruecke mit 6x IRG4PC40KD.

Was die Stromueberwachung angeht am IR2131 (ITRIP) so habe ich keinen Shunt und die niederohmigen Widerstaende die
ich am Lager habe duerften bei der Leistung Heizsonne spielen. Also habe ich mir ueberlegt einfach eine Diode zu nehmen (60EPS08)
und den Spannungsabfall ueber der Diode (ueber Spannungsteiler) ITRIP zuzufuehren....
Sollte meiner Meinung nach klappen - was meinst Du dazu?

LG aus Addis



Klaus
 
Hallo Klaus,

die Sache mit der Diode halte ich für suboptimal - eine Diode ist halt eine Diode und kein Widerstand.
Wenn sich aus irgent welchen Gründen die Stromrichtung ändert (Stichwort Induktion) dann grillst du die Eingangsstufe des Stromsensors.
Ein weiteres Problem ist der Spannungsabfall an der Diode in Flussrichtung, der ist nicht wirklich proportional zum Strom, was den Stromsensor in gewisser Weise ausser Funktion setzt.

Ich hab nochmal über die Schaltung an sich nachgedacht - alles viel zu kompliziert!
Der ATMega erzeugt über die PWM ein "Sinus-Signal", über Filter und Komparator wird der Nulldurchgang bestimmt um dann die positive bzw. negative Halbwelle zu erzeugen.
Das mit der negativen Halbwelle ist mir hier ohnehin noch nicht so ganz klar.

Warum nicht viel einfacher:

Atmega erzeugt nur eine Halbwelle (PWM 0..254), dann wird ein Port getoggelt, nächste Halbwelle, Port toggeln usw. - so kannst du dir den ganzen analogen Kram mit Komarator Filter usw. sparen.
Nicht dass ich was gegen Analogtechnik hätte, aber hier gehört so etwas einfach nicht hin!
Du brauchst für diese Lösung natürlich einen zusätzlichen Port (Pin) für jede Phase - damit kannst du dann jeweils eine Häfte der Brücke sperren.
Sicher wirst du noch einige Nand-Gatter und Inverter brauchen - sollte aber kein Problem darstellen. Hier kannst du dann auch gleich noch ein Enable-Signal für die Endstufe vorsehen, damit die Brücke keinen Kurzschluss beim initialisieren des MC macht.

Ach ja, noch eine Idee zu den Shunts - falls du z.B. Halogen-Lampen 12V / 50W o.ä. haben solltest, die funktionieren in gewissen Grenzen auch ganz gut als Hochlast-Widerstand, die könntest du zur Sicherheit noch mit den Dioden überbrücken, damit der Spannungsabfall nicht zu hoch wird.

Gruß
- gp177 -
 
The_Scientist schrieb:
Aber hast Du eine Erklaerung warum die original Schaltung nicht funktioniert?
weil du sie nicht original nachgebaut hast. Deine Schaltung unterscheidet sich deutlich vom Original, aber das schrieb ich schon.

gp177 schrieb:
damit kannst du dann jeweils eine Häfte der Brücke sperren.
das ist aber schlecht für die Funktion.

SickBoy
 
Hurra, der Strom ist wieder da...

Hallo ihr Lieben,

kann leider erst jetzt wieder antworten, da wir mal wieder keinen Strom hatten...TIA (this is Africa)....

SickBoy: Ich hatte die Schaltung schon im original nachgebaut - wie bereits beschrieben, habe ich mir sogar die LM339 besorgen lassen....
Im Anschluss habe ich dann die hier angefuegte Schaltung daraus abgewandelt, da die original Schaltung ja nicht funktioniert hat....

gp177: Das mit der Diode ist in der Tat eine Schnapps-Idee von mir, aber die Halo-Lampe geht auch nicht...der Widerstand variiert zu stark bei Erwaermung.
Habs gerda mal probiert und einen Strom von NUR 1.5A @ 48V ueber die Wendel gejagt und der Widerstand hat sich von 0.622 Ohm auf 1.979 Ohm erhoeht.....da ist auch nix linear....
bei 3.0A @48V waren es dann schon 2.133 Ohm....und bei 6.0A @ 48V 2.912 Ohm.....

Und da es ja DC ist hilft mir auch kein CT weiter......und selbst wenn ich jetzt CT's vor den Gleichrichter haue, hab ich wieder so meine Probleme,
da ich nur ASM-10er am Lager habe - sprich bis 10A garantier linear.....danach weiss der Geier......

Hat eigentlich schoneinmal jemand von euch mit dem IR2131 gebastelt? Die Bootstrap-Geschichte wuerde mich mal interessieren, da ich hier nur eine
begrenzte Auswahl an HV ESR Elkos habe...


Was die PWM Erzeugung und die Sinus-Geschichte angeht, so habe ich der einfachheit halber das Programm von Omar David Muñoz uebernommen....
Aber ein ATMega328 duerfte bei 6 PWM-Signalen im Bereich 256 Steps 1-85Hz ueberfordert sein....Timing...Selbst bei 20MHz CLK.....

Oder hast Du eine Software-Loesung parat ? Als µC's habe ich verfuegbar...ATMega8, 328, 8535, 128, 64, 644 / Tiny 13,25,85,2113 / Xmega 16D4, 256D3....ansonsten muss ich
auf TI ausweichen C2000, C5000 Serie dank TI-Sample Service vollstaendig und in ausreichender Stueckzahl vorhanden....(wollte ich aber fuer mein Smart-Grid und Smart-Meter Projekt aufsparen)

Ich hatte mal einen Frequenzumwandler gebaut in meiner Zeit in Abu Dhabi, aber die gesamten Plaene usw. sind dort verblieben, der war zwar nur fuer 48V (fuer einen Kompressor), aber
haette ich ja anpassen koennen - Ich weiss noch, dass ich gut 4 Monate dran gesessen habe......hat aber funktioniert...ich kann mich nur nicht mehr im Detail erinnern...
Man wird halt doch aelter.....ich meine aber, dass ich damals auch nur 3 PWM Signale erzeugt hatte und dann.....?????......

Kann mir mal jemand TaiGinSeng (oder wie heisst das Zeug?) schicken....


LG aus Addis


Klaus
 
Hallo Klaus,

das mit den Halos war nur ein grundsätzlicher Vorschlag, ich kannte deine Randbedingungen nicht.
Zu beachten wäre noch, dass der Strom ja nicht linear über die ganze Zeit fließt, sondern der Sinuskurve folgt.

Die Sache mit der PWM-Erzeugung hast du glaube ich falsch verstanden, ich meinte nicht, du sollst 6 PWM-Signale ausgeben - sondern 3 PWM-Signale und 3 Steuersignale, die jede Halbwelle toggeln und das jeweilige PWM-Signal auf den oberen bzw. unteren Teil der Brücke legen (positive / negative Halbwelle).

PWM beginnt bei 0, folgt der Sinuskurve bis 255 (Scheitelwert) folgt der Kurve weiter bis 0 (Nulldurchgang) Steuersignal schaltet um (PWM geht jetzt auf den anderen Zweig der Brücke) --> pos. Halbwelle
PWM beginnt bei 0, folgt der Sinuskurve bis 255 (Scheitelwert) folgt der Kurve weiter bis 0 (Nulldurchgang) Steuersignal schaltet um (PWM geht jetzt auf den anderen Zweig der Brücke) --> neg. Halbwelle
PWM beginnt bei 0, folgt der Sinuskurve bis 255 (Scheitelwert) folgt der Kurve weiter bis 0 (Nulldurchgang) Steuersignal schaltet um (PWM geht jetzt auf den anderen Zweig der Brücke) --> pos. Halbwelle
PWM beginnt bei 0, folgt der Sinuskurve bis 255 (Scheitelwert) folgt der Kurve weiter bis 0 (Nulldurchgang) Steuersignal schaltet um (PWM geht jetzt auf den anderen Zweig der Brücke) --> neg. Halbwelle

usw.


Gruß
- gp177 -
 
Zwischenstand

Hallo ihr Lieben,

wollte nur kurz Bescheid geben, dass ich daran arbeite.....aber nach einen Blitzeinschlag am 02.04. ging bis gerade garnix mehr....
Der gesamte Compound ohne Strom und selbst der Sendemast fuer EVDO (Internet hier) war platt.....TIA (This is Africa),
die haben keine Ahnung, was Blitzschutz bedeutet....das geht hier so min. 1x pro Monat....

Wie dem auch sei, erst einmal lieben Dank an gp177, die Idee mit dem PWM habe ich verstanden und werde dies versuchen in dieses
Projekt zu integrieren......dummerweise sind einige der Platinen bereits geaetzt....Rohstoff ist kostbar hier, da ich immer nur sehr schwer
an die Saeure komme....Versand von Deutschland geht nicht - Gefahrgut - und im Koffer ist imer eine 50/50 Sache...also besser nicht...

Auf meine letzte Lieferung aus Dubai - via Sammelcontainer - habe ich 8 Monate gewartet.....also werde ich wahrscheinlich die Filter ersteinmal so verwenden
wie geplant, aber fuer weitere PWM Geschichten, habe ich was dazu gelernt. Nochmals Danke....................

Ich werde uebers Wochende hoffentlich alles soweit fertig bekommen und dann entsprechend hier die aktuellen Plaene und Software posten....

Ein schoenes Wochenende an Alle....drueckt die Daumen fuer gutes, windstilles Wetter morgen....bin ab 9:00am auf dem Golfplatz - wir haben Turnier....


LG aus Addis


Klaus
 
Es kommt......

Hallo ihr Lieben,

also ersteinmal SORRY fuer die Verspaetung...aber was soll ich sagen - kein Internet...lange Geschichte....mach ich mal als OFF in den naechsten Tagen....

Ich fange dann jetzt mal an mit dem Upload....

Hier mein Kot - aehhhh Code:

Code:
' Motor-Drive 3-Pahse V1.0
' Speed CTRL by 0-5V @ ADC(0)
' Range from 6.85Hz to 62.5Hz
' PWM Output:
' PWM1 (0°)   PortB.3
' PWM2 (120°) PortB.2
' PWM3 (240°) PortB.1
' RefClk Output :
' Timer0      PortD.6
' f-Out PortD.6 / 127 = f-Out PWM/Sinewave
' LED's:
' CTRL OK     PortD.4
' FAULT       PortD.5
' PWM On/Off  PortD.7
'
' (C) 2014 Dr. Klaus Helmgens
' and partially Omar David Muñoz
' for using some of his ideas/values...
'
' Used µC : ATMega 328P @ 16MHz
' Powered at 5V
' -------------------------------------------
$regfile = "m328pdef.dat"
$crystal = 16000000
$hwstack = 64
$swstack = 64
$framesize = 64

Dim Sine(256) As Byte                                       ' Variable for the Sine Data
Dim Hv As Integer                                           ' Helping variable for internal calculations
Dim Icnt As Byte                                            ' Variable for interrupt count
Dim A As Byte                                               ' Variable to assign the result from the ADC calculation
Dim Ain As Word                                             ' Variable for the ADC(0)
Dim Onoff As Bit                                            ' Variable for PCINT to see if it was triggered
Dim Cnt As Integer                                          ' Variable for counting timeout after PCINT
Dim Pint As Byte                                            ' Variable to store the value of PortC in the moment of PCINT1
Dim Pprt As Byte                                            ' Variable to determine which port was triggered at PCINT1
Dim Cmpr As Byte                                            ' Variable to determine which port was triggered at PCINT1
Dim Fault As Bit                                            ' Variable which is set in case of Fault
Dim Pwr As Bit                                              ' Variable which is set in case the On/Off Button was triggered
Dim Pwr_ As Bit                                             ' Variable to store the status of On/Off
Dim Fltclr As Bit                                           ' Variable which is set on case the Clear Fault Button was triggered

Main:

   Ddrb = &B00111111                                        ' Set the Direction-Registers
   Ddrc = &B00011000
   Ddrd = &B11111110
   Portc = &B00100110
   Portb.5 = 1                                              ' Set Start-Up conditions regarding the Datasheet for IR2131, etc...
   Portd.4 = 0
   Portd.5 = 0
   Portd.7 = 1
   Onoff = 0
   Fault = 0
   Pwr = 0
   Pwr_ = 0
   Fltclr = 0

   Restore Sinedata                                         ' Read Sine Data and store in the variable
   For Hv = 1 To 256
      Read Sine(hv)
   Next

   Config Adc = Single , Prescaler = Auto                   ' Configure the Analog-Input

   Tccr0a = &B01000000                                      ' Configure the Timers
   Tccr0b = &B00000011
   Tccr1a = &B10100001
   Tccr1b = &B00000001
   Tccr2a = &B10000001
   Tccr2b = &B00000001
   Pcicr = &B00000010
   Pcmsk1 = &B00100110

   On Ovf0 Isr                                              ' Set the ISR's
   On Pcint1 Event

   Enable Interrupts                                        ' Enable the Interrupts
   Enable Timer0

   Do
      Portd.4 = 1                                           ' Set to show the system is internally running
      Ain = Getadc(0)                                       ' Read value from Analog-Input
      Ain = Ain / 8                                         ' Devide analog value by 8
      A = Ain + 116                                         ' Set Offset to the analog value and store in variable "A"
      If Onoff = 1 Then                                     ' If the PCINT1 was triggered
         Incr Cnt                                           ' Counter for Timeout (Debounce PCINT1)
         If Cnt = 2000 Then
            Pcifr = &B00000010                              ' Clear the interrupt flag for PCINT1
            Enable Pcint1                                   ' Enable PCINT1 after blocking
            Cnt = 0                                         ' Set the counter back to 0
            Onoff = 0                                       ' Set the trigger varibale back to 0
            Gosub Chkport                                   ' Go and check which port triggered the PCINT1
         End If
      End If
      Portd.4 = 0                                           ' Set to show the system passed the PCINT part - will be set fast again, but on the Oscar you can see "alive"
      If Pwr = 1 Then                                       ' If On/Off Button was pressed go to SUB _pwr
         Gosub _pwr
      End If

      If Fltclr = 1 Then                                    ' If Fault Clear Button was pressed go to SUB CLRFLT
         Gosub Clrflt
      End If

      If Fault = 1 Then                                     ' If Fault was triggered by IR2131 go to SUB Flt
         Gosub Flt
      End If

   Loop

Flt:

   Portb.4 = 1                                              ' Set SHTDWN Output high = IR2131 Shutdown
   Fault = 0                                                ' Set Fault variable back to 0
   Stop Timer0                                              ' Stop all Timers
   Stop Timer1
   Stop Timer2
   Waitms 10                                                ' Wait to ensure all Timers are stopped
   Portb.1 = 0                                              ' Set all PWM Outputs to low
   Portb.2 = 0
   Portb.3 = 0
   Portd.5 = 1                                              ' Switch Fault-LED on

Return

Clrflt:

   Portb.4 = 1                                              ' Set SHTDWN Output high = IR2131 Shutdown
   Fltclr = 0                                               ' Set FLTCLR variable back to 0
   Stop Timer0                                              ' Stop all Timers
   Stop Timer1
   Stop Timer2
   Waitms 10                                                ' Wait to ensure all Timers are stopped
   Portb.1 = 0                                              ' Set all PWM Outputs to low
   Portb.2 = 0
   Portb.3 = 0
   Portb.5 = 0                                              ' Set FLTCLR Output to low to reset IR2131
   Wait 5                                                   ' Wait 5 seconds to give the operator time to refocus on the motor ;-)
   Portb.4 = 0                                              ' Set SHTDWN Output low = IR2131 starts operating again
   Portb.5 = 1                                              ' Set FLTCLR Output back to high for normal operation of IR2131
   Start Timer0                                             ' Start all Timers
   Start Timer1
   Start Timer2
   Portd.5 = 0                                              ' Switch off Fault-LED
   Goto Main

Return

_pwr:

   If Pwr_ = 0 Then                                         ' Check the power status varibale, if power is ON
      Portb.4 = 1                                           ' Set SHTDWN Output high = IR2131 Shutdown
      Portb.5 = 1                                           ' Set FLTCLR to high - to ensure it's not low for proper Shutdown of IR2131
      Stop Timer0                                           ' Stop all Timers
      Stop Timer1
      Stop Timer2
      Waitms 10                                             ' Wait to ensure all Timer are stopped
      Portb.1 = 0                                           ' Set all PWM Outputs to low
      Portb.2 = 0
      Portb.3 = 0
      Pwr_ = 1                                              ' Set the power status variable to 1 = Power Off
      Pwr = 0                                               ' Set the variable Pwr back to 0 to be able to indicate new trigger
      Portd.7 = 0                                           ' Switch off the ON/OFF LED
   End If
   If Pwr_ = 1 And Pwr = 1 Then                             ' Check if the power is OFF and the Button was triggered
      Portb.4 = 0                                           ' Set SHTDWN Output low = IR2131 starts operating again
      Portb.5 = 0                                           ' Set FLTCLR Output to low to reset IR2131
      Waitms 100                                            ' Wait 100ms to ensure startup of IR2131
      Portb.5 = 1
      Start Timer0                                          ' Start all Timers
      Start Timer1
      Start Timer2
      Portd.7 = 1                                           ' Switch on the ON/OFF LED
      Goto Main
   End If

Return

Chkport:

   Pprt = Pint Xor 32                                       ' Check if PortC.5 was triggering PCINT1
   Cmpr = Pprt - Pint
   If Cmpr = 32 Then
      Fault = 1
   End If

   Pprt = Pint Xor 4                                        ' Check if PortC.2 was triggering PCINT1
   Cmpr = Pprt - Pint
   If Cmpr = 4 Then
      Fltclr = 1
   End If

   Pprt = Pint Xor 2                                        ' Check if PortC.1 was triggering PCINT1
   Cmpr = Pprt - Pint
   If Cmpr = 2 Then
      Pwr = 1
   End If

Return

Event:                                                      ' PCINT1 ISR

   Pint = Pinc                                              ' Take a snapshot of PortC
   Disable Pcint1                                           ' Disable PCINT1 for debounce reasons
   Onoff = 1                                                ' Set the trigger status variable Onoff to 1

Return

Isr:                                                        ' Timer0 ISR

   If Icnt > 255 Then                                       ' If the interrupt counter variable exceed 255....
      Icnt = 0                                              ' ...set the variable back to 0
   End If

   Ocr2a = Sine(icnt)                                       ' Load OutputCompareRegister2A with the value for the sinewave

   Hv = Icnt + 85                                           ' Add Offset for 120°
   If Hv > 256 Then                                         ' In case the value exceeds 256, rollover...
      Hv = Hv - 256
   End If
   Ocr1a = Sine(hv)                                         ' Load OutputCompareRegister1A with the value for the sinewave

   Hv = Icnt + 170                                          ' Add Offset for 240°
   If Hv > 256 Then                                         ' In case the value exceeds 256, rollover...
      Hv = Hv - 256
   End If
   Ocr1b = Sine(hv)                                         ' Load OutputCompareRegister1B with the value for the sinewave

   Incr Icnt                                                ' Increment the interrupt counter variable
   Timer0 = A                                               ' set the Timer0 accordingly to the speed, choosen by the value of ADC(0)

Return

Sinedata:                                                   ' Sinewave values taken from a program of Omar David Muñoz - Thx...
   Data 0 , 0 , 0 , 0 , 1 , 1 , 1 , 2 , 2 , 3 , 4 , 5 , 5 , 6 , 7 , 9
   Data 10 , 11 , 12 , 14 , 15 , 16 , 18 , 20 , 21 , 23 , 25 , 27 , 29 , 31 , 33 , 35
   Data 37 , 39 , 42 , 44 , 46 , 49 , 51 , 54 , 56 , 59 , 62 , 64 , 67 , 70 , 73 , 76
   Data 78 , 81 , 84 , 87 , 90 , 93 , 96 , 99 , 102 , 105 , 108 , 111 , 115 , 118 , 121 , 124
   Data 127 , 130 , 133 , 136 , 139 , 143 , 146 , 149 , 152 , 155 , 158 , 161 , 164 , 167 , 170 , 173
   Data 176 , 178 , 181 , 184 , 187 , 190 , 192 , 195 , 198 , 200 , 203 , 205 , 208 , 210 , 212 , 215
   Data 217 , 219 , 221 , 223 , 225 , 227 , 229 , 231 , 233 , 234 , 236 , 238 , 239 , 240 , 242 , 243
   Data 244 , 245 , 247 , 248 , 249 , 249 , 250 , 251 , 252 , 252 , 253 , 253 , 253 , 254 , 254 , 254
   Data 254 , 254 , 254 , 254 , 253 , 253 , 253 , 252 , 252 , 251 , 250 , 249 , 249 , 248 , 247 , 245
   Data 244 , 243 , 242 , 240 , 239 , 238 , 236 , 234 , 233 , 231 , 229 , 227 , 225 , 223 , 221 , 219
   Data 217 , 215 , 212 , 210 , 208 , 205 , 203 , 200 , 198 , 195 , 192 , 190 , 187 , 184 , 181 , 178
   Data 176 , 173 , 170 , 167 , 164 , 161 , 158 , 155 , 152 , 149 , 146 , 143 , 139 , 136 , 133 , 130
   Data 127 , 124 , 121 , 118 , 115 , 111 , 108 , 105 , 102 , 99 , 96 , 93 , 90 , 87 , 84 , 81
   Data 78 , 76 , 73 , 70 , 67 , 64 , 62 , 59 , 56 , 54 , 51 , 49 , 46 , 44 , 42 , 39
   Data 37 , 35 , 33 , 31 , 29 , 27 , 25 , 23 , 21 , 20 , 18 , 16 , 15 , 14 , 12 , 11
   Data 10 , 9 , 7 , 6 , 5 , 5 , 4 , 3 , 2 , 2 , 1 , 1 , 1 , 0 , 0 , 0

Dieses war der Erste Streich und der Zweite folgt -hoffentlich- gleich....
 
und weiter geht's

Und der Zweite....


http://www.massivedynamics.biz/downloads/VFD.zip


Der Upload hat hier gerade 43 Minuten gedauert....Das Internet hier in Aethiopien treibt mich noch in den Wahnsinn....fuer schlappe 2.5MB!!!!!!

In den naechsten Tagen ein paar Bilder vom Aufbau und ggf. verbrannten Boards und/oder einer Azubine mit neuer Frisur....


LG aus Addis


Klaus
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)