www.mikrocontroller.net

Forum: PC-Programmierung Dreiphasenspannung mit PWM in Borland C++


Autor: Frank Breitbarth (beatmatte)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

im Rahmen meiner Studienarbeit soll über einen Mikrocontroller mittels 
PWM-Signalen ein Drehstrommotor angesteuert werden. Der Links- und 
Rechtslauf funktioniert schon so weit, aber das Anlaufen des Motors auf 
Nenndrehzahl will mir noch nicht gelingen.
Hier mal der entworfene Code in Borland C++!
#include <stdio.h>
#include <conio.h>
#include <math.h>

#include "io_toss.h"
#include "funktionen.h"
#include "clib.h"
#include "pwm_3_r.h"

void main(void)
{
// Variablendeklaration  
char Buffer[3]   = {0, 0, 0};  // Datenpuffer Kommunikation
int i = 0;      // Zaehler für Schleifen
int j = 0;      // Zaehler für Schleifen
unsigned char TG = 0;    // Tastgrad für Übergabe an PCA9633
double Sinus[20];    // Array mit Werten für Sinuskurve
double PI = 3.14159265358979;
int Phase[3]= {0, AnzWerte/3, AnzWerte/3*2};        
// Zaehler für die Phasen mit Offset für Phasenverschiebung

for(i=0;i<AnzWerte;i++)          // Belegen des Sinus-Arrays mit Werten
{
   Sinus[i] = 128 + 128*sin(2.0*i*PI/AnzWerte);
}

// Initialisierung der Komponenten
init_dk50();    // Initialisierung DK50 für Display
I2C_init();     // Initialisierung I²C-Bus
text_ini();     // Initialisierung Textmodus
pwm_init();     // Initialisierung PCA9633
BIOS_Set_Focus(FOCUS_APPLICATION);    // stdio an Anwendung übergeben

// Ausgabe auf dem Display
_gotoxy(0,0); printf("Dreiphasenspannung");
_gotoxy(0,1); printf("------------------");
_gotoxy(0,3); printf("Motor Rechtslauf");
_gotoxy(8,13); printf("Taste -> Ende");

// Schleife für Änderung der Tastgrade, Abbruch mit Taste
while(!kbhit())
{
    // Tastgrad für Kanal 0
    if(Phase[0]++ >= AnzWerte) Phase[0] = 0; // Vermeidung Überlauf Zaehler
    TG = (int)(Sinus[Phase[0]]);  // Momentanwert als Tastgrad
    Buffer[0] = TG;  // Tastgrad in Puffer

    // Tastgrad an Kanal 1
    if(Phase[1]++ >= AnzWerte) Phase[1] = 0;
    TG = (int)(Sinus[Phase[1]]);
    Buffer[1] = TG;

    // Tastgrad an Kanal 2
    if(Phase[2]++ >= AnzWerte) Phase[2] = 0;
    TG = (int)(Sinus[Phase[2]]);
    Buffer[1] = TG;

    // Ausgabe der PWM-Signale
    pwm_out(Buffer, 3);     // Datenpuffer und Anzahl Kanäle an PCA9633
    RTX_Sleep_Time(5);      // Ablaufunterbrechung zum Einstellen
    // der Frequenz der erzeugten Sinusspannung
    // f=1/(x*20) mit x in ms
}
pwm_stop();                      // Stoppt die Ausgabe
clear_text();         // Bildschirm löschen
BIOS_Set_Focus(FOCUS_SHELL);   // stdio an Kommandozeile übergeben
}

Mein Problem scheint bei der Schleife zu liegen in welcher ich das 
Sinus-Array mit Werten belege. Dort müsste eigentlich in der 
Wertzuweisung für Sinus[i] die Variable AnzWerte mit Werten von 60 bis 
20 belegt sein. Habe es schon dazu mit einer weiteren Schleife 
dazwischen versucht, hat aber keinen Erfolg gebracht. Hat jemand von 
euch dazu eine Idee???

Mfg
Frank

Autor: tuppes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frank Breitbarth schrieb:
> // Tastgrad an Kanal 1
>     if(Phase[1]++ >= AnzWerte) Phase[1] = 0;
>     TG = (int)(Sinus[Phase[1]]);
>     Buffer[1] = TG;
>
>     // Tastgrad an Kanal 2
>     if(Phase[2]++ >= AnzWerte) Phase[2] = 0;
>     TG = (int)(Sinus[Phase[2]]);
>     Buffer[1] = TG;

Für Kanal 2:

      Buffer[ 2 ] = TG;

Ansonsten: Borland-C++ für Mikrocontroller ???

Autor: kiar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wo werden AnzWerte zugewiesen?

Autor: Frank Breitbarth (beatmatte)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ups, da hat sich schon der erste Schreibfehler eingeschlichen. 
Buffer[2]=TG ist korrekt. Das löst aber noch nicht mein Problem, dass 
der Motor aus dem Stand auf Nenndrehzahl läuft. Bisher läuft er mit dem 
obigen Quellcode nur mit konstannter Geschwindigkeit, aber nicht langsam 
an und danach auf Maximaldrehzahl. Jemand noch eine Idee???

Mfg
Frank

Autor: Frank Breitbarth (beatmatte)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kiar schrieb:
> wo werden AnzWerte zugewiesen?

In der pwm_3_r.h wird die Anzahl der Werte mit define AnzWerte 20 
zugewiesen.

Autor: tuppes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich dein Programm richtig verstehe, dann gibt es einfach nur drei 
phasenverschobene Sinussignale aus, und die Schleifenverzögerung ist 
konstant.

RTX_Sleep_Time (5) - heißt das 5 ms?

Einen DS-Motor langsam anlaufen lassen heißt, die Frequenz langsam 
erhöhen Der primitivste Weg hierzu wäre, mit einer Schleifenverzögerung 
von, sagen wir, 50 anzufangen und bei jedem Durchlauf um 1 zu 
verringern, bis 5 (Nenndrehzahl) erreicht ist.

Ach ja, und AnzWerte = 20 ist etwas ungünstig, dadurch sind die drei 
Phasen nicht genau 120 Grad gegeneinander verschoben. Ein durch 3 
teilbarer Wert wäre besser.

Autor: Udo R. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also für eine Studienarbeit würde ich zumindest erwarten, daß man die 
Nennfrequenz und die Rampenparameter für das Hochfahren zumindest mal 
als Konstanten in der korrekten Einheit im Programm  und das Programm 
dann das Umrechnen in Programminterne Werte erledigt.
Außerdem bin ich doch etwas verwirrt, da der TE wohl noch nicht mal weiß 
WAS zu tun ist um einen Drehstrommotor langsam hochzufahren.

Und das gibt eine Studienarbeit?

Autor: Oliver R. (superberti)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

> kiar schrieb:
>> wo werden AnzWerte zugewiesen?
>
> In der pwm_3_r.h wird die Anzahl der Werte mit define AnzWerte 20
> zugewiesen.

Dann solltest Du aber auch die Zeile

double Sinus[20];    // Array mit Werten für Sinuskurve

anpassen, sonst bekommst Du Ärger bei allen Werten >20!

Gruß,

Autor: Frank Breitbarth (beatmatte)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

mir ist schon klar, dass ich den Motor auf Nenndrehzahl fahre, wenn ich 
mit einer niedrigen Frequenz beginne und diese dann erhöhe. Lt. meinen 
Erkenntnissen läuft der Motor zwischen 15 und 60 Hz, d.h. bei 15 Hz 
läuft er an und bei 60 Hz hört er wieder auf. Bei 50 Hz. sollte er dann 
mit Maximaldrehzahl laufen. Der Hinweis zu RTX_Sleep_Time werd ich mal 
aufgreifen und ausprobieren.

Mfg
Frank

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.