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


von Frank B. (beatmatte)


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++!
1
#include <stdio.h>
2
#include <conio.h>
3
#include <math.h>
4
5
#include "io_toss.h"
6
#include "funktionen.h"
7
#include "clib.h"
8
#include "pwm_3_r.h"
9
10
void main(void)
11
{
12
// Variablendeklaration  
13
char Buffer[3]   = {0, 0, 0};  // Datenpuffer Kommunikation
14
int i = 0;      // Zaehler für Schleifen
15
int j = 0;      // Zaehler für Schleifen
16
unsigned char TG = 0;    // Tastgrad für Übergabe an PCA9633
17
double Sinus[20];    // Array mit Werten für Sinuskurve
18
double PI = 3.14159265358979;
19
int Phase[3]= {0, AnzWerte/3, AnzWerte/3*2};        
20
// Zaehler für die Phasen mit Offset für Phasenverschiebung
21
22
for(i=0;i<AnzWerte;i++)          // Belegen des Sinus-Arrays mit Werten
23
{
24
   Sinus[i] = 128 + 128*sin(2.0*i*PI/AnzWerte);
25
}
26
27
// Initialisierung der Komponenten
28
init_dk50();    // Initialisierung DK50 für Display
29
I2C_init();     // Initialisierung I²C-Bus
30
text_ini();     // Initialisierung Textmodus
31
pwm_init();     // Initialisierung PCA9633
32
BIOS_Set_Focus(FOCUS_APPLICATION);    // stdio an Anwendung übergeben
33
34
// Ausgabe auf dem Display
35
_gotoxy(0,0); printf("Dreiphasenspannung");
36
_gotoxy(0,1); printf("------------------");
37
_gotoxy(0,3); printf("Motor Rechtslauf");
38
_gotoxy(8,13); printf("Taste -> Ende");
39
40
// Schleife für Änderung der Tastgrade, Abbruch mit Taste
41
while(!kbhit())
42
{
43
    // Tastgrad für Kanal 0
44
    if(Phase[0]++ >= AnzWerte) Phase[0] = 0; // Vermeidung Überlauf Zaehler
45
    TG = (int)(Sinus[Phase[0]]);  // Momentanwert als Tastgrad
46
    Buffer[0] = TG;  // Tastgrad in Puffer
47
48
    // Tastgrad an Kanal 1
49
    if(Phase[1]++ >= AnzWerte) Phase[1] = 0;
50
    TG = (int)(Sinus[Phase[1]]);
51
    Buffer[1] = TG;
52
53
    // Tastgrad an Kanal 2
54
    if(Phase[2]++ >= AnzWerte) Phase[2] = 0;
55
    TG = (int)(Sinus[Phase[2]]);
56
    Buffer[1] = TG;
57
58
    // Ausgabe der PWM-Signale
59
    pwm_out(Buffer, 3);     // Datenpuffer und Anzahl Kanäle an PCA9633
60
    RTX_Sleep_Time(5);      // Ablaufunterbrechung zum Einstellen
61
    // der Frequenz der erzeugten Sinusspannung
62
    // f=1/(x*20) mit x in ms
63
}
64
pwm_stop();                      // Stoppt die Ausgabe
65
clear_text();         // Bildschirm löschen
66
BIOS_Set_Focus(FOCUS_SHELL);   // stdio an Kommandozeile übergeben
67
}

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

von tuppes (Gast)


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 ???

von kiar (Gast)


Lesenswert?

wo werden AnzWerte zugewiesen?

von Frank B. (beatmatte)


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

von Frank B. (beatmatte)


Lesenswert?

kiar schrieb:
> wo werden AnzWerte zugewiesen?

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

von tuppes (Gast)


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.

von Udo R. S. (Gast)


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?

von Oliver R. (superberti)


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ß,

von Frank B. (beatmatte)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.