Forum: Mikrocontroller und Digitale Elektronik Low Side Schalter nur bedingt per PWM ansteuerbar


von Brnd19xx (Gast)


Lesenswert?

Hallo Leute,

ich habe den BTS3035EJ Low-Side Schalter: 
https://www.infineon.com/dgdl/Infineon-BTS3035EJ-DS-v01_00-EN.pdf?fileId=5546d462576f34750157be864ba243a9

Den Schalter konnte ich mit permanenter Spannung am Input Signal 
erfolgreich testen. Nur mit der PWM will es nicht klappen. z.B. möchte 
ich den Schalter alle 0,5s schalten.

Es funktioniert zwar, aber nicht ganz genau:

Programmiert habe ich das ganze mit dem STM32 nucleo F401RE.

folgendermaßen sieht der Code aus (while-Schleife);
1
 //Low side switch START
2
        if (number == 4) {
3
            LS_SET_PWM();
4
5
            if(LS_STAT == 0.0 && LS_IN2==1) {
6
                //LS_SET_PWM();
7
8
                pc.printf("Status is low\n");
9
                pc.printf("Overtemperature!\n");
10
                LS_IN = 0;
11
                wait(3);
12
            } else
13
                pc.printf("Status is high\n");
14
        }
15
        //******************** END ************************

LS_SET_PWM(); setzt ein PWM Signal mit einer Periode von 1s und einem 
DutyCycle von 50%.

Der if-Teil funktioniert ohne Probleme, wie schon erwähnt, wenn der 
Input permanent auf High ist.

So, kommen wir nun zum Punkt, den ich nicht verstehe.

Am Ende der while Schleife ist ein wait_ms(1000); Also eine Sekunde 
warten, bis der nächste Durchlauf beginnt.
Verringere ich nun diese Zeit auf z.B. 500ms, dann gibt der PWM Pin 
permanent High aus. Ändere ich nun den DutyCycle auf 10% (Periode immer 
noch auf 1s), dann messe ich am Oszi eine Periode von 500ms und einen 
100ms langen Pegel, welcher ja 10% von 1s ist.

Das selbe Schema funktioniert allerdings mit einem High-Side Schalter 
problemlos, auch ohne wait_ms() Befehl.

An den PWM Pins, kann es nicht liegen, habe schon andere ausprobiert.

Was habt ihr für Tipps?

von Route_66 H. (route_66)


Lesenswert?

Brnd19xx schrieb:
> Am Ende der while Schleife ist ein wait_ms(1000);

Sieht hier Niemand!

Brnd19xx schrieb:
> Was habt ihr für Tipps?

Nicht nur einen Programmschnipsel zeigen!
Ratestunde gibts bei kinderfesten.

von Brnd19xx (Gast)


Lesenswert?

Route 6. schrieb:
> Brnd19xx schrieb:
>> Am Ende der while Schleife ist ein wait_ms(1000);
>
> Sieht hier Niemand!
>

Da gibts nichts zu sehen außer einem wait Befehl und ein led!=led, um 
die LED zum Blinken zu bringen.

>
> Nicht nur einen Programmschnipsel zeigen!
> Ratestunde gibts bei kinderfesten.
>

Der restliche Code trägt nichts zum Verständnis bei, aber da du keine 
Kinderfeste magst, bitteschön:
1
PwmOut LS_IN(D6);          
2
void LS_SET_PWM(){
3
    LS_IN.write(0.1);
4
    LS_IN.period(1.0);
5
    }

Diese funktion ist einem anderen Header, genau so wie beim Highside 
Treiber.

von A. S. (Gast)


Lesenswert?

Liegt es am Code oder am Schalter?

Wenn es am Schalter liegt, warum dann die Codefragmente?

Wenn es am Code liegt, warum dann die Info zum Schalter und nur 
Codefragmente?

Oder hast Du keine LED oder Multimeter um zu schauen wo es hakt?

von Brnd19xx (Gast)


Lesenswert?

Achim S. schrieb:
> Liegt es am Code oder am Schalter?
>

Der Schalter funktioniert problemlos, wenn ich anstatt eines PWM Signals 
einen permanenten High-Pegel von 3.3V anlege (auch über den µC). Das 
habe ich schon im Eingangspost geschrieben...

Der Schalter ist auch für PWM ausgelegt.

>
> Oder hast Du keine LED oder Multimeter um zu schauen wo es hakt?
>

Glaubst du ich mache mir die Mühe hier einen Beitrag zu verfassen, ohne 
vorher mir Gedanken zur Problemlösung zu machen?

von Brnd19xx (Gast)


Lesenswert?

Da hier viele den Code sehen wollen, bitteschön (wegen der Lesbarkeit 
etwas gekürzt).

Pin D5 und D6 sind jeweils in einer anderen header Datei. Dort ist kein 
Fehler.
1
#include "mbed.h"
2
#include "HighSide.h"
3
#include "LowSide.h"
4
5
//Define In- and Output-Pins
6
DigitalOut HS_CS(D2);       //Active high to disable current sense pin
7
AnalogIn HS_Sense(A0);      //Analog voltage proportional to load current
8
//PwmOut HS_IN(D5);         //Defined in "HighSide.h"
9
DigitalIn HS_IN2 (D9);      //
10
DigitalOut Vgate(D4);       //Only high if measuring analogue current
11
AnalogIn V_I_OUT(A1);       //Analog Input to measure the analog Current or Voltage
12
DigitalIn Vdig_OUT(D7);     //Measuring the digital voltage [High = ; Low = ]
13
DigitalIn LS_STAT(D8);      //Status pin of LS-Driver
14
//PwmOut LS_IN(D6);           //Input pin to activate output of LS-Driver
15
DigitalIn LS_IN2(D3);       //
16
DigitalOut led(LED3);
17
;
18
19
Serial pc(SERIAL_TX, SERIAL_RX);
20
21
int main()
22
{
23
    int number;
24
    float i=0.0;
25
    float a;
26
    float v_measure=0.0;
27
    float HS;
28
29
30
    //float overtemp = 0.0;
31
    pc.printf("Please choose one operation: \n");
32
    pc.printf("1.\t Analogue voltage input\n2.\t Analogue current input\n3.\t Digital voltage input\n4.\t Low Side Switch\n5.\t High Side Switch\n\n");
33
34
    do {
35
        pc.scanf("%d", &number);
36
        switch (number) {
37
            case 1:
38
                pc.printf("You choosed: 1.\t Analogue voltage input\n");
39
                Vgate = 0;
40
                LS_IN = 0;
41
                HS_CS= 1;
42
                HS_IN= 0;
43
                break;
44
            case 2:
45
                pc.printf("You choosed: 2.\t Analogue current input\n");
46
                Vgate = 1;
47
                LS_IN = 0;
48
                HS_CS= 1;
49
                HS_IN= 0;
50
                break;
51
            case 3:
52
                pc.printf("You choosed: 3.\t Digital voltage input\n");
53
                Vgate = 0;
54
                LS_IN = 0;
55
                HS_CS= 1;
56
                HS_IN= 0;
57
                break;
58
            case 4:
59
                pc.printf("You choosed: 4.\t Low Side Switch\n");
60
                Vgate=0;
61
                HS_CS = 1;
62
                HS_IN=0;
63
                LS_SET_PWM();
64
                break;
65
            case 5:
66
                pc.printf("You choosed: 5.\t High Side Switch\n");
67
                Vgate=0;
68
                LS_IN=0;
69
                HS_CS=0;
70
                HS_SET_PWM();
71
                break;
72
            default:
73
                pc.printf("Invaild input. Please try again.\n");
74
        }
75
    } while ((number != 1) && (number != 2) && (number != 3) && (number != 4) && (number != 5));
76
77
78
79
80
    while (1) {
81
        //analogue voltage or current measurement START
82
        if ((number==1 || number == 2)) {
83
           ....
84
        }
85
        //******************** END ************************
86
87
        //digital voltage measurement START
88
        if (number == 3) {
89
           ...
90
        }
91
        //******************** END ************************
92
93
        //Low side switch START
94
        if (number == 4) {
95
            LS_SET_PWM();
96
97
            if(LS_STAT == 0.0 && LS_IN2==1) {
98
                LS_SET_PWM();
99
100
                pc.printf("Status is low\n");
101
                pc.printf("Overtemperature!\n");
102
                LS_IN = 0;
103
                wait(3);
104
            } else
105
                pc.printf("Status is high\n");
106
        }
107
        //******************** END ************************
108
109
        // High Side Switch START
110
        if (number == 5) {
111
            while(i<=3) {
112
                HS = HS_Sense;
113
114
                pc.printf("HS Sense is %f\n", HS);
115
                if(HS >=0.95 && LS_IN2 == 1) {
116
                    pc.printf("Overtemp!\n");
117
                    HS_IN = 0;
118
                    wait(3);
119
                    HS_SET_PWM();
120
                    i=0.0;
121
                }
122
123
                if(HS >=0.000010 && HS <= 0.000500 && LS_IN2 == 1) {
124
                    i++;
125
                }
126
            }
127
            i=0.0;
128
            pc.printf("Undervoltage or Short circuit to Vbat\nPlease check your connections and Battery!\n");
129
            HS_IN=0;
130
            wait(3);
131
            HS_SET_PWM();
132
        }
133
        //******************** END ************************
134
        led=!led;
135
        wait_ms(100);
136
    }
137
}

von Conny G. (conny_g)


Lesenswert?

Brnd19xx schrieb:
> Verringere ich nun diese Zeit auf z.B. 500ms, dann gibt der PWM Pin
> permanent High aus.

Ich kenne den STM32 noch nicht (liegt rum und wartet darauf getestet zu 
werden).

Aber rechne mal: die PwM macht 50% von einer Sekunde, das sind 500ms.
Du machst das alle 500ms und sieht nur High.
Also wird die PWM alle 500ms neu gestartet und legt erstmal mit High 
los. Bevor sie Low gehen kann initialisierst Du sie neu sie macht 
deshalb wieder High.

Also ist das ein Logikfehler im Ablauf.
Es macht keinen Sinn die PWM alle 500ms neu zu initialisieren.
Es scheint ja ein Fehler-Blinker zu sein.
Dann müsste man ein Flag setzen - overtemp = true - und nur dann wenn 
sich das ändert die PWM setzen oder löschen.

von Brnd19xx (Gast)


Lesenswert?

Conny G. schrieb:

> Aber rechne mal: die PwM macht 50% von einer Sekunde, das sind 500ms.
> Du machst das alle 500ms und sieht nur High.
> Also wird die PWM alle 500ms neu gestartet und legt erstmal mit High
> los. Bevor sie Low gehen kann initialisierst Du sie neu sie macht
> deshalb wieder High.
>

So denke ich ja auch, aber beim HighSide Treiber funktioniert es 
genauso! Das PWM Signal wird permanent ausgegeben, auch wenn ich keinen 
Wait() Befehl einbaue.
Das heißt dann wohl, dass das PWM-Signal nach dem initialisieren 
permanent ausgegeben wird. Nur beim LowSide ist diese Abhängigkeit da.

Entweder funktioniert der Lowside nicht richtig, oder aber der Highside 
Treiber funktioniert nicht, macht aber das was ich will :_)

von Conny G. (conny_g)


Lesenswert?

Datenblatt des Highside?

von Conny G. (conny_g)


Lesenswert?

Und poste mal den Schaltplan sowie ein Foto des Aufbaus.

von Brnd19xx (Gast)


Lesenswert?

Datenblatt:

http://www.st.com/content/ccc/resource/technical/document/datasheet/a5/a5/cc/12/f9/81/42/3c/CD00151378.pdf/files/CD00151378.pdf/jcr:content/translations/en.CD00151378.pdf


der Low- und Highside sind ja im Prinzip nur MOSFET's mit ein paar 
Schutzfunktionen.


Im Bild ist der Schaltplan zu sehen. Ein Bild vom Aufbau kann ich jetzt 
nicht posten, aber die Lasten sind genauso geschaltet, wie in den 
schwarzen Linien im Bild.

Am Aufbau kann es auch nicht liegen, weil die Schalter ja funktionieren! 
Nur die PWM Ansteuerung beim Lowside macht Probleme.

von Brnd19xx (Gast)


Angehängte Dateien:

Lesenswert?

Schaltplan

von A. S. (Gast)


Lesenswert?

Brnd19xx schrieb:
> Achim S. schrieb:
>> Liegt es am Code oder am Schalter?
>>
> ...
>>
>> Oder hast Du keine LED oder Multimeter um zu schauen wo es hakt?
>>
>
> Glaubst du ich mache mir die Mühe hier einen Beitrag zu verfassen, ohne
> vorher mir Gedanken zur Problemlösung zu machen?

Dann halte die LED doch mal dran und sage, ob es Code oder Schalter ist.

Oder ist das ein Quiz?

von Conny G. (conny_g)


Lesenswert?

Ist das Absicht?

 if(HS >=0.95 && LS_IN2 == 1) {

von Axel S. (a-za-z0-9)


Lesenswert?

Brnd19xx schrieb:
> Da hier viele den Code sehen wollen, bitteschön

Au weia. Mir ist vollkommen klar, daß du das nicht zeigen wolltest.

Es hat weder etwas mit dem Switch zu tun. Oder mit PWM. Das ist ein 
reines Logikproblem in der Software. Was soll z.B. der Unsinn, die PWM 
bei jedem Schleifendurchlauf neu zu initialisieren? Zumal wir immer noch 
nicht wissen, was da hinter den Kulissen wirklich passiert. Aber ich 
denke mal, daß Conny G. in seinem 
Beitrag "Re: Low Side Schalter nur bedingt per PWM ansteuerbar" ganz richtig liegt.

Daß man Fließkomma-Werte niemals mit == vergleichen sollte, ist dir 
bekannt? Und dein Englisch ist ... <zensiert>. Schreib Meldungen lieber 
in einer Sprache, die du auch beherrschst.

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.