Verluste am Motor? Oder Fehler im Code?

Gast #780201
Lesenswert?

Hi zusammen,
also ich programmiere ja an einem Motorregler. Es ist mir aufgefallen, 
dass meine Drehzahl_ist kleiner ist, als die, die ich vorgegeben habe.
Habe die Spannung, die am Motor ankommt gemessen, die ist fast so groß 
wie die Spannung am Netzteil, also kommt am Motor schon mal das an, was 
ankommen soll.
Die Drehzahlmessung müsste eigentlich auch stimmen: habe bei einer 
geringen Drehzahl die Umdrehungen optisch gemessen und mit dem Wert, den 
das Programm ausgibt, verglichen-> sind gleich. Allerdings kommen bei 
höheren Drehzahlen Abweichungen zustande, meine max. Drehzahl ist im 
Leerlauf so um die 3500, die Marke 2500 wird aber nie überschritten.
Weiß vielleicht einer woran das liegen könnte?

danke schön
Gast #780212
Lesenswert?

Hi,
So richtig verstehe ich dein Problem nicht. Bzw, was du da aufgebaut 
hast.
Es könnten vll. bei deiner MC Messung Abweichungen im oberen 
Drehzahlbereich auftreten, oder eine Spannungsmessung war falsch.
mfg
Gast #780219
Lesenswert?

Also wie gesagt, am Schaltplan sollte das nicht liegen (IMHO), denn 
genau am Motor kommt ja die Spannung an, die ankommen sollte. Also ist 
es doch so, dass die Verluste der Schaltung dabei nicht so große Rolle 
spielen.

@huhu: also ich hab mich auch gefragt, wie das sein kann, dass meine 
Messung nur im unteren Drehzahlbereich nen Sinn macht und in oberen 
nicht. Ich tu ja nichts anderes....
Gast #780222
Lesenswert?

> Also wie gesagt, am Schaltplan sollte das nicht liegen (IMHO), denn
> genau am Motor kommt ja die Spannung an, die ankommen sollte.

Wenn er trotzdem zu langsam läuft, kann das doch dann auch kaum am 
Programm liegen. Oder ist hier eine PWM im Spiel, mit der das 
Spannungsmeßgerät evtl. nicht klar kommt?
Gast #780266
Lesenswert?

@JÜrgen: also der Regler ist eigentlich noch gar nicht im Spiel -> den 
Regelalgorithmus ruf ich noch gar nicht auf.

Ich poste mal den Code:
1
//****************************************************************************
2
// @Defines
3
//****************************************************************************
4

5
// USER CODE BEGIN (CC1_General,4)
6
/*
7
#define MAX 65535    // untere Grenze
8
#define MIN 65135     // obere Grenze
9
#define MAXDREH 3000  // maximale Drehzahl
10

11
*/
12
// USER CODE END
13

14

15
//****************************************************************************
16
// @Global Variables
17
//****************************************************************************
18

19
// USER CODE BEGIN (CC1_General,7)
20
volatile unsigned int CC9alt;    // Dummy für Inhalt bei der vorheringen pos. Flanke (global)
21
volatile unsigned long int Counter_dif;  // Inhaltdifferenz des Timers bei 2 pos. Flanken
22
volatile unsigned long int Drehzahl_mot; // Istdrehzahl 
23

24

25
//****************************************************************************
26
// @Prototypes Of Local Functions
27
//****************************************************************************
28

29
// USER CODE BEGIN (CC1_General,9)
30

31
unsigned long int Drehzahl (void);  // Funktion zur Berechnung der Drehzahl
32
//unsigned long int Drehz_setzen(int);          // Solldrehzahl setzen mit Überwinden des Anlaufmomentes
33

34
// USER CODE END
35

36

37

38

39
//****************************************************************************
40
//              Variablen
41
//****************************************************************************
42
unsigned int Counter = 0;  // zum Zählen der Interrupts
43
//int Pulsbreite = 400;
44
//unsigned long int Hexwert;  // der entspr. Wert für CC2_CC30
45

46

47
//****************************************************************************
48
//               Unterfunktionen
49
//****************************************************************************
50
unsigned long int Drehzahl(void)
51
{
52
unsigned long int Drehz =0;
53

54
  /*if (Counter ==1)
55
  {
56
    CC9alt = 0x0000;
57
  } */
58
  if (CC1_CC9 < CC9alt) // Heißt: der Timer ist abgelaufen
59
    {
60
    Counter_dif = 0-(CC1_CC9-CC9alt);
61
    //Counter=0;
62
    }
63
  else
64
    {
65
  Counter_dif = CC1_CC9-CC9alt;
66
    }
67

68
  CC9alt = CC1_CC9;
69

70

71
  Drehz = 1200000L/(int)Counter_dif; // Drehzahl in Umdrehungen pro Minute
72

73

74
   return Drehz; 
75
}
76

77

78
// USER CODE END
79

80
void CC1_vInit(void)
81
{
82
  // USER CODE BEGIN (Init,2)
83

84
  CC9alt = 0x0000; // Vorbelegen für die erste Berechnung der Periode
85
   
86
  // USER CODE END
87

88
  ///  -----------------------------------------------------------------------
89
  ///  Configuration of CAPCOM1 Control:
90
  ///  -----------------------------------------------------------------------
91
  ///  - the contents of the port register is changed by the CAPCOM1 unit
92
  ///  - staggered mode is disabled
93

94
  CC1_IOC        =  0x0004;      // load CAPCOM1 I/O control register
95

96
  ///  -----------------------------------------------------------------------
97
  ///  Configuration of CAPCOM1 Timer 0:
98
  ///  -----------------------------------------------------------------------
99
  ///  - timer 0 works in timer mode
100
  ///  - prescaler factor is 4
101
  ///  - timer 0 run bit is set
102

103
  ///  -----------------------------------------------------------------------
104
  ///  Configuration of CAPCOM1 Timer 1:
105
  ///  -----------------------------------------------------------------------
106
  ///  - timer 1 works in timer mode
107
  ///  - prescaler factor is 1
108
  ///  - timer 1 run bit is reset
109

110

111
  CC1_T01CON     =  0x0002;      // load CAPCOM1 timer 0 and timer 1 control 
112
                                 // register
113

114
  CC1_T0         =  0x0000;      // load CAPCOM1 timer 0 register
115

116
  CC1_T0REL      =  0x0000;      // load CAPCOM1 timer 0 reload register
117

118
  CC1_T1         =  0x0000;      // load CAPCOM1 timer 1 register
119

120
  CC1_T1REL      =  0x0000;      // load CAPCOM1 timer 1 reload register
121

122
  ///  -----------------------------------------------------------------------
123
  ///  Configuration of the used CAPCOM1 Timer Port Pins:
124
  ///  -----------------------------------------------------------------------
125

126

127
  ///  -----------------------------------------------------------------------
128
  ///  Configuration of the used CAPCOM1 Timer Interrupts:
129
  ///  -----------------------------------------------------------------------
130
  ///  Tmr0 service request node configuration:
131
  ///  - Tmr0 interrupt priority level (ILVL) = 9
132
  ///  - Tmr0 interrupt group level (GLVL) = 1
133
  ///  - Tmr0 group priority extension (GPX) = 0
134

135
  CC1_T0IC       =  0x0065;     
136

137

138

139
  ///  -----------------------------------------------------------------------
140
  ///  Configuration of the used CAPCOM1 Channel 0:
141
  ///  -----------------------------------------------------------------------
142
  ///  - channel 0 is disabled
143

144
  CC1_CC0        =  0x0000;      // load CAPCOM1 channel 0 register
145

146
  ///  -----------------------------------------------------------------------
147
  ///  Configuration of the used CAPCOM1 Channel 1:
148
  ///  -----------------------------------------------------------------------
149
  ///  - channel 1 is disabled
150

151
  CC1_CC1        =  0x0000;      // load CAPCOM1 channel 1 register
152

153
  ///  -----------------------------------------------------------------------
154
  ///  Configuration of the used CAPCOM1 Channel 2:
155
  ///  -----------------------------------------------------------------------
156
  ///  - channel 2 is disabled
157

158
  CC1_CC2        =  0x0000;      // load CAPCOM1 channel 2 register
159

160
  ///  -----------------------------------------------------------------------
161
  ///  Configuration of the used CAPCOM1 Channel 3:
162
  ///  -----------------------------------------------------------------------
163
  ///  - channel 3 is disabled
164

165
  CC1_CC3        =  0x0000;      // load CAPCOM1 channel 3 register
166

167
  ///  -----------------------------------------------------------------------
168
  ///  Configuration of the used CAPCOM1 Channel 4:
169
  ///  -----------------------------------------------------------------------
170
  ///  - channel 4 is disabled
171

172
  CC1_CC4        =  0x0000;      // load CAPCOM1 channel 4 register
173

174
  ///  -----------------------------------------------------------------------
175
  ///  Configuration of the used CAPCOM1 Channel 5:
176
  ///  -----------------------------------------------------------------------
177
  ///  - channel 5 is disabled
178

179
  CC1_CC5        =  0x0000;      // load CAPCOM1 channel 5 register
180

181
  ///  -----------------------------------------------------------------------
182
  ///  Configuration of the used CAPCOM1 Channel 6:
183
  ///  -----------------------------------------------------------------------
184
  ///  - channel 6 is disabled
185

186
  CC1_CC6        =  0x0000;      // load CAPCOM1 channel 6 register
187

188
  ///  -----------------------------------------------------------------------
189
  ///  Configuration of the used CAPCOM1 Channel 7:
190
  ///  -----------------------------------------------------------------------
191
  ///  - channel 7 is disabled
192

193
  CC1_CC7        =  0x0000;      // load CAPCOM1 channel 7 register
194

195
  ///  -----------------------------------------------------------------------
196
  ///  Configuration of the used CAPCOM1 Channel 8:
197
  ///  -----------------------------------------------------------------------
198
  ///  - channel 8 is disabled
199

200
  CC1_CC8        =  0x0000;      // load CAPCOM1 channel 8 register
201

202
  ///  -----------------------------------------------------------------------
203
  ///  Configuration of the used CAPCOM1 Channel 9:
204
  ///  -----------------------------------------------------------------------
205
  ///  - capture on positive transition (rising edge) at pin CC9IO (P2.9)
206
  ///  - CC9 allocated to CAPCOM1 timer 0
207
  ///  - single event mode is disabled
208

209

210
  CC1_CC9        =  0x0000;      // load CAPCOM1 channel 9 register
211

212
  ///  -----------------------------------------------------------------------
213
  ///  Configuration of the used CAPCOM1 Channel 10:
214
  ///  -----------------------------------------------------------------------
215
  ///  - channel 10 is disabled
216

217
  CC1_CC10       =  0x0000;      // load CAPCOM1 channel 10 register
218

219
  ///  -----------------------------------------------------------------------
220
  ///  Configuration of the used CAPCOM1 Channel 11:
221
  ///  -----------------------------------------------------------------------
222
  ///  - channel 11 is disabled
223

224
  CC1_CC11       =  0x0000;      // load CAPCOM1 channel 11 register
225

226
  ///  -----------------------------------------------------------------------
227
  ///  Configuration of the used CAPCOM1 Channel 12:
228
  ///  -----------------------------------------------------------------------
229
  ///  - channel 12 is disabled
230

231
  CC1_CC12       =  0x0000;      // load CAPCOM1 channel 12 register
232

233
  ///  -----------------------------------------------------------------------
234
  ///  Configuration of the used CAPCOM1 Channel 13:
235
  ///  -----------------------------------------------------------------------
236
  ///  - channel 13 is disabled
237

238
  CC1_CC13       =  0x0000;      // load CAPCOM1 channel 13 register
239

240
  ///  -----------------------------------------------------------------------
241
  ///  Configuration of the used CAPCOM1 Channel 14:
242
  ///  -----------------------------------------------------------------------
243
  ///  - channel 14 is disabled
244

245
  CC1_CC14       =  0x0000;      // load CAPCOM1 channel 14 register
246

247
  ///  -----------------------------------------------------------------------
248
  ///  Configuration of the used CAPCOM1 Channel 15:
249
  ///  -----------------------------------------------------------------------
250
  ///  - channel 15 is disabled
251

252
  CC1_CC15       =  0x0000;      // load CAPCOM1 channel 15 register
253

254
  CC1_M0         =  0x0000;      // load CAPCOM1 mode register 0
255
  CC1_M1         =  0x0000;      // load CAPCOM1 mode register 1
256
  CC1_M2         =  0x0010;      // load CAPCOM1 mode register 2
257
  CC1_M3         =  0x0000;      // load CAPCOM1 mode register 3
258

259
  CC1_DRM        =  0x0000;      // load CAPCOM1 double-register mode register
260

261
  CC1_SEM        =  0x0000;      // load CAPCOM1 single event mode register
262

263
  CC1_SEE        =  0x0000;      // load CAPCOM1 single event enable register
264

265
  CC1_OUT        =  0x0000;      // load CAPCOM1 compare output register
266

267
  ///  -----------------------------------------------------------------------
268
  ///  Configuration of the used CAPCOM1 Channel Port Pins:
269
  ///  -----------------------------------------------------------------------
270
  ///  - P2.9 is used for CAPCOM1 Input (CC9IO)
271

272

273
  ///  -----------------------------------------------------------------------
274
  ///  Configuration of the used CAPCOM1 Channels Interrupts:
275
  ///  -----------------------------------------------------------------------
276
  ///  CC9 service request node configuration:
277
  ///  - CC9 interrupt priority level (ILVL) = 9
278
  ///  - CC9 interrupt group level (GLVL) = 3
279
  ///  - CC9 group priority extension (GPX) = 0
280

281
  CC1_CC9IC      =  0x0067;     
282

283

284

285
  CC1_T01CON_T0R    = 1;    // set CAPCOM1 timer 0 run bit
286

287
  // USER CODE BEGIN (Init,3)
288

289
  // USER CODE END
290

291
} //  End of function CC1_vInit
292

293

294
//****************************************************************************
295
// @Function      void CC1_viTmr0(void) 
296
//
297
//----------------------------------------------------------------------------
298
// @Description   This is the interrupt service routine for the CAPCOM1 timer 
299
//                0. It is called when overflow of the timer 0 register 
300
//                occurs.
301
//                Please note that you have to add application specific code 
302
//                to this function.
303
//
304
//----------------------------------------------------------------------------
305
// @Returnvalue   None
306
//
307
//----------------------------------------------------------------------------
308
// @Parameters    None
309
//
310
//----------------------------------------------------------------------------
311
// @Date          21.11.2007
312
//
313
//****************************************************************************
314

315
// USER CODE BEGIN (Tmr0,1)
316

317
// USER CODE END
318

319
void CC1_viTmr0(void) interrupt CC1_T0INT using RB_LEVEL9
320
{
321
  // USER CODE BEGIN (Tmr0,2)
322

323
  // USER CODE END
324

325
} //  End of function CC1_viTmr0
326

327

328
//****************************************************************************
329
// @Function      void CC1_viCC9(void) 
330
//
331
//----------------------------------------------------------------------------
332
// @Description   This is the interrupt service routine for the CAPCOM1 
333
//                register CC9. If the content of the corresponding compare 
334
//                timer (configurable) equals the content of the 
335
//                capture/compare register CC9 or if a capture event occurs 
336
//                at the associated port pin, the interrupt request flag is 
337
//                set and an interrupt is triggered (only if enabled).
338
//                Please note that you have to add application specific code 
339
//                to this function.
340
//
341
//----------------------------------------------------------------------------
342
// @Returnvalue   None
343
//
344
//----------------------------------------------------------------------------
345
// @Parameters    None
346
//
347
//----------------------------------------------------------------------------
348
// @Date          21.11.2007
349
//
350
//****************************************************************************
351

352
// USER CODE BEGIN (CC9,1)
353

354
// USER CODE END
355

356
void CC1_viCC9(void) interrupt CC1_CC9INT using RB_LEVEL9
357
{
358
  // USER CODE BEGIN (CC9,2)
359

360
  Counter++; // zählen der Interrupts  und der Encoderimpulse
361

362
  Drehzahl_mot = Drehzahl();
363

364

365

366
  // USER CODE END
367

368
} //  End of function CC1_viCC9

Die Auswertung der Drehzahl ist schon mit ISR gecoded.
Also ich hab 2 ISR: eine für die Drehzahl und eine für PWM-Erzeugung. 
Die PWM hat nen höheren Level wie die Drehzahlmessung. Anders würd es ja 
nicht funktionieren..
(Firma: 4CKnowLedge) Persönliche Seite #780277
Lesenswert?

Kartoffel wrote:
> @JÜrgen: also der Regler ist eigentlich noch gar nicht im Spiel -> den
> Regelalgorithmus ruf ich noch gar nicht auf.

Gut, also es geht mal nur um die Auswertung...

> Die Auswertung der Drehzahl ist schon mit ISR gecoded.
> Also ich hab 2 ISR: eine für die Drehzahl und eine für PWM-Erzeugung.
> Die PWM hat nen höheren Level wie die Drehzahlmessung. Anders würd es ja
> nicht funktionieren...

Wieso würd es anders nicht funktionieren? Damit verhaust du dir 
allerdings die Drehzahlmessung...

Schalt mal den Interrupt für die PWM ab, und sieh dir dann das Ergebniss 
an... Ich glaub mal das es dann funktionieren wird... ^^
Gast #780293
Lesenswert?

@Jürgen:
hab das nicht so ganz verstanden mit "schalt mal den Int. für PWM ab". 
Ich erzeuge meine PWM mittels Interrupt!!! Wenn ich kein Interrupt hab, 
hab ich keine PWM und kann den Motor ja nicht mehr drehen lassen.
Aber ich könnte dem PWM ne niedrigere Priorität zuweisen als der 
Drehzahl..oder?????????????
(Firma: 4CKnowLedge) Persönliche Seite #780339
Lesenswert?

Kartoffel wrote:
> @Jürgen:
> hab das nicht so ganz verstanden mit "schalt mal den Int. für PWM ab".
> Ich erzeuge meine PWM mittels Interrupt!!! Wenn ich kein Interrupt hab,
> hab ich keine PWM und kann den Motor ja nicht mehr drehen lassen.
> Aber ich könnte dem PWM ne niedrigere Priorität zuweisen als der
> Drehzahl..oder?????????????

Jup, probiers mal mit niedrigerer Priorität und vllt sonst Motor direkt 
ans Netzgerät und Interrupts für PWM Erzeugung abschalten und nur mehr 
Impulse messen... wenn das funktioniert, weist du zumindest schon mal 
das es mit der PWM zu tun hat bzw. mit dem Interruptsystem... und dann 
kannst du dir was einfallen lassen...
Gast #780395
Lesenswert?

es ist tatsächlich so, dass wenn ich den Motor über Netzteil speise, 
dass ich dann ganz "normale" Drehzahlen messen kann, also bei 24V hab 
ich meine Leerlaufdrehzahl von ca.3600

Wenn ich die Messung höher priorisiere als die PWM Erzeugung, hilft das 
leider nicht und ich messe immer noch die niedrigere Drehzahl als 
Drehzahl_soll.
Das heißt also, dass es mit PWM zu tun hat.
Aber was?????????????????????? Was mache ich falsch???
(Firma: 4CKnowLedge) Persönliche Seite #780602
Lesenswert?

Kartoffel wrote:
> es ist tatsächlich so, dass wenn ich den Motor über Netzteil speise,
> dass ich dann ganz "normale" Drehzahlen messen kann, also bei 24V hab
> ich meine Leerlaufdrehzahl von ca.3600
>
> Wenn ich die Messung höher priorisiere als die PWM Erzeugung, hilft das
> leider nicht und ich messe immer noch die niedrigere Drehzahl als
> Drehzahl_soll.
> Das heißt also, dass es mit PWM zu tun hat.
> Aber was?????????????????????? Was mache ich falsch???

Hm... hab ich's mir gedacht... Wichtig ist, das die Messung vollkommen 
von der PWM Erzeugung abgekapselt ist...

Welchen Controller verwendest du denn? Es kann auch gut und leicht 
möglich sein, das wenn wir keine elegante Lösung finden, das du dann 2 
Controller brauchst...

Mal überlegn...
(Firma: 4CKnowLedge) Persönliche Seite #780637
Lesenswert?

Eine Idee, dir mir gerade gekommen ist - versuch mal die PWM von der 
Auflösung ein wenig runter zu schrauben (bzw. langsamer zu machen) somit 
überlappen sich die Interrupts nicht so oft, vllt wird dadurch deine 
Drehzahlmessung genauer...

Sonst wenn der Controller mitspielt... die Frequenzmessung ohne 
Interrupt, auf eine Flanke triggern und dann mitzählen...
Gast #781385
Lesenswert?

@Jürgen:
also ich verwende den XC167 von Infineon.
Ich hab es so eingestellt, dass die Prio von der Messung höher ist, als 
die von der PWM Erzeugung. Damit hab ich doch erreicht, dass sich die 
Interrupts nicht überlappen, bzw. dass der Interrupt für die Messung 
nicht von der PWM beeinflusst werden kann, oder nicht?
Mit dem zweiten Controller wird es problematisch, denn ich habe eine 
fertige Platine, wo leider nur einer drauf ist :-(

Zur Frequenzmessung ohne Interrupt: also meinst du, dass ich ich nur 
eine Flanke auswerten soll? Also auf eine Flanke triggern ist ok, aber 
dadurch hab ich doch schon wieder nen Interrupt...denn eine Flanke 
brauch ich auf jeden Fall.

Hab gestern noch die Abweichungen von der Solldrehzahl ausgewertet, die 
sind schön nicht linear, hab sogar ein mal eine negative drin.
#781404
Lesenswert?

PWM Erzeugung und Eingangsimpulse zählen über Interrupt ist so ziemlich 
die ungünstigste Lösung, schlechte wäre dafür nur noch pollen.

Dein µC hat mehr als genug CapCom Kanäle, nutz diese dafür.

Die erledigen das meiste was du mit Interrupt mühsam versuchst in HW und 
damit zuverlässiger und schneller als es in SW jemals gehen wird.
Gast #781408
Lesenswert?

@Ralph:
also ich hab ja eine fest konzeptionierte Platine, deswegen kann ich 
nicht einfach sagen ok, ich leg mal das Signal von X nach Y und 
beobachte es..verstehst du?
Mein Encoderausgang liegt an einem bestimmten Pin an und ich muss es so 
nutzen wie es ist.
Ich hab außer Polling eingentlich keine andere Idee, wie ich das ohne 
Interrupt realisieren könnte. Hast du eine??
Gast #781609
Lesenswert?

also ich habe mir jetzt einen digitalen Tachometer geholt und geschaut, 
was mein Motor denn wirklich schafft.
Rausgekommen ist, dass meine gemessene Drehzahl der tatächlichen 
ENTSPRICHT!!
Er dreht tatsächlich langsamer, als ich ihm vorgebe.
Hab dann die Spannung am Motor in Abhängigkeit von der Geschwindigkeit 
gemessen, also da kommen wirklich komische Sachen raus.....
Also 3600U/min -> 24 V (Maximalwerte)
Die verhalten sich ja pi*Auge direkt proportional zueinander.
Das sind die Werte, dich ich gemessen hab:

500->2,5V
700->3,75
900->5,5
1200->12!!
1500->12!!
1700->12!!
1900->13
2200->15
2500->16


He????????
Also ich bin mit meinem Latein echt am Ende..
Gast #782724
Lesenswert?

Also ich wollte noch mal nachhacken:
hab nämlich jetzt ein paar Geschwindigkeiten mit dem Oszi angekuckt.
Die Höhe des Pulses verändert sich nicht, denn die Spannung wird ja nur 
durch das Tastverhältnis ausgedrückt oder?
Bei 0U/min hab ich genau 50% PWM, wie es auch sein sollte.
3000 U/min-> hab ich noch nicht gescheit darstellen können.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren