Hallo zusammen,
vllt. ist das Problem leicht behoben, ich schätze ich mache einen
Denkfehler. Also zuerst mal die Theorie welche dahinter steht.
Ich habe eine Strom und eine Spannungsmessung. Beide werden über OP's
verstärkt. Beim Strommess-OP kommen hinten max. 2V raus, beim
Spannungs-OP max. 2,5V(im Test kommen immer um die 1,75V raus, da
konstante Spannung). Nun nehme ich die Werte mit dem ADC auf(10Bit,
Referenz sind 2,56V).
Nun habe ich ein Programm geschrieben, welches mir den Strom, über ein
PWM Signal mit anschließender Elektronik, einstellt.
Ich hatte dann in meinem Programm zwei Abfragen, welche mir Strom und
Spannung überwachen und bei überschreiten eines bestimmten Stromes
anhalten und den Strom auf den eingestellten Wert begrenzen. Soweit
funktionierte das. Nun wollte ich aber nicht mehr über Strom und
Spannung begrenzen, sondern über die Leistung.
Also einfach die Werte multiplizieren und fertig. Aber er läuft immer
bis ans Ende der Schleife. Hat das vllt. was mit den Datentypen zu tun?
Strom und Spannung sind uint16_t Typen, die Leistung muss dann also ein
uint32_t Typ sein (16Bit*16Bit=32Bit). Denk ich mir zumindest! Der µC
ist ein Mega32. Ich häng mal nur den Source vom eigentlichen Programm
an, da der ADC und die PWM funktionieren.
1 | int main(void)
|
2 | {
|
3 | /* PWM starten */
|
4 | PORTB = 0x00; //Alle Bit's löschen
|
5 | DDRB = 0xFF; //PortB als Ausgang beschalten für die PWM
|
6 | PWM_init(); //Die PWM starten
|
7 |
|
8 |
|
9 | uint8_t const pwmoffset = 126; //ADC Offset von 2,5V(2^8*0.5)
|
10 | //Der Offset wird von der Elektronik
|
11 | //dahinter benötigt
|
12 |
|
13 | uint8_t DC = 0;
|
14 |
|
15 | int x=1;
|
16 | uint16_t strom=0;
|
17 | uint16_t spannung=0;
|
18 | uint32_t leistung=0;
|
19 |
|
20 | while(1) //Endlosschleife für den µC
|
21 | {
|
22 |
|
23 | /* TESTPROGRAMM */
|
24 | while(x==1)
|
25 | {
|
26 | //for-Schleife soll langsam den Strom erhöhen, PWM ist DAC als
|
27 | //Sollwertgeber für einen Tiefpass für die Elektronik
|
28 |
|
29 | for(int i=0; i<=30; i++)
|
30 | {
|
31 | OCR0 = pwmoffset + i;
|
32 | Delay(); //Delay() ist ne Wartefunktion von mir
|
33 | Delay();
|
34 | strom = ADCRead(2);
|
35 | Delay();
|
36 | spannung = ADCRead(1);
|
37 | Delay();
|
38 | leistung = strom * spannung;
|
39 | if(leistung>=60000) //Wenn die Leistung einen bestimmten
|
40 | //Wert überschreitet, stehenbleiben
|
41 | {
|
42 | i=40;
|
43 | x=0;
|
44 | }
|
45 | }
|
46 | x=0;
|
47 | }
|
48 |
|
49 | /* ENDE WHILE SCHLEIFE!!! */
|
50 | }
|
51 |
|
52 | return 0; //Damit der Compiler nicht meckert, der Punkt wird allerdings nie erreicht!
|
53 | }
|
Meine Vermutung liegt irgendwie darin, das er beim berechnen der
Leistung ein Problem hat. Mit einer getrennten Abfrage von Strom und
Spannung klappt's ja.
Kann das was mit dem uint32_t zu tun haben?
Hoffe das die Beschreibung in soweit verständlich ist!!!
Gruß Daniel