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?
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.
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
PwmOutLS_IN(D6);
2
voidLS_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.
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?
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?
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
DigitalOutHS_CS(D2);//Active high to disable current sense pin
7
AnalogInHS_Sense(A0);//Analog voltage proportional to load current
8
//PwmOut HS_IN(D5); //Defined in "HighSide.h"
9
DigitalInHS_IN2(D9);//
10
DigitalOutVgate(D4);//Only high if measuring analogue current
11
AnalogInV_I_OUT(A1);//Analog Input to measure the analog Current or Voltage
12
DigitalInVdig_OUT(D7);//Measuring the digital voltage [High = ; Low = ]
13
DigitalInLS_STAT(D8);//Status pin of LS-Driver
14
//PwmOut LS_IN(D6); //Input pin to activate output of LS-Driver
15
DigitalInLS_IN2(D3);//
16
DigitalOutled(LED3);
17
;
18
19
Serialpc(SERIAL_TX,SERIAL_RX);
20
21
intmain()
22
{
23
intnumber;
24
floati=0.0;
25
floata;
26
floatv_measure=0.0;
27
floatHS;
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
case1:
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
case2:
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
case3:
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
case4:
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
case5:
66
pc.printf("You choosed: 5.\t High Side Switch\n");
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.
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 :_)
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?
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.