Forum: Mikrocontroller und Digitale Elektronik Brushlessregler, falsches Empfängersignal


von Jan (Gast)


Lesenswert?

Hi,

ich wollte gerade meinen Brushlessregler anschliessen. Dafür habe ich 
mir den Code aus eurem Servoartikel geholt und den für meinen Atmega324p 
mit 16 MHz abgeändert. Allerdings gibt der Regler nur Beeptöne im 
Abstand von 2 Sekudnen aus (Fehlercode: falsches Empfängersignal)

Könnt ihr euch mal den Code ansehen?
PinA4-A7 sind Taster zur Steuerung

Mein Signal greife ich ja am Pin PD5 (OC1A) ab, oder?
Habe leider kein Oszi zum prüfen
1
ISR( TIMER1_COMPA_vect )                // Interruptbehandlungsroutine
2
{
3
  OCR1A = 313-OCR1A;      // Das Servosignal wird aus der Differenz von
4
                                        // Periodenlänge (313*0,0064ms=20ms) und letztem
5
                                        // Vergleichswert (OCR1A) gebildet 
6
}
7
8
9
int main (void)
10
{   
11
12
  signed int x =24;
13
14
  DDRA &= ~((1 << DDA6) | (1 << DDA7));
15
  PORTA |= (1<<PA6) | (1<<PA7);
16
17
  DDRA &= ~((1 << DDA4) | (1 << DDA5));
18
  PORTA |= (1<<PA4) | (1<<PA5);
19
20
  DDRB = 0b11111100;
21
    PORTB = (1<<PB1) | (1<<PB0);          // Pullup für PB0 und PB1
22
 
23
    TCCR1A = (1<<COM1A0);                 // Togglen bei Compare Match
24
    TCCR1B = (1<<WGM12) | (1<<CS12) | (1<<CS10);      // CTC-Mode; Prescaler 1024
25
    TIMSK1  = (1<<OCIE1A);                 // Timer-Compare Interrupt an
26
 
27
    OCR1A = 289;                         // Neutralposition 
28
    sei();                                // Interrupts global an
29
30
  while(1)
31
  {
32
  
33
    if(PINA & (1<<PINA7))
34
    {
35
      if(x<=32)
36
      {
37
        
38
            cli();
39
            OCR1A = OCR1A + 1;
40
            sei();
41
            _delay_ms(50);
42
        
43
            x=x+1;  
44
        
45
        while(PINA & (1<<PINA7))
46
        {
47
      
48
        }
49
      }
50
    }
51
    if(PINA & (1<<PINA6))
52
    {
53
      if(x>=16)
54
      {
55
            cli();
56
            OCR1A = OCR1A - 1;
57
            sei();
58
            _delay_ms(50);
59
60
            x=x-1;  
61
62
        while(PINA & (1<<PINA6))
63
        {
64
      
65
        }
66
      }
67
    }
68
    if(PINA & (1<<PINA4))
69
    {
70
      if(x<=32)
71
      {
72
        
73
            cli();
74
            OCR1A = 16;  //Vollgas
75
            sei();
76
            _delay_ms(50);
77
        
78
            x=32;  
79
        
80
        while(PINA & (1<<PINA4))
81
        {
82
      
83
        }
84
      }
85
    }
86
    if(PINA & (1<<PINA5))
87
    {
88
      if(x<=32)
89
      {
90
        
91
            cli();
92
            OCR1A = 32;  //Langsam
93
            sei();
94
            _delay_ms(50);
95
        
96
            x=16;  
97
        
98
        while(PINA & (1<<PINA5))
99
        {
100
      
101
        }
102
      }
103
    }
104
  }
105
  return 0;
106
}

Danke
von STK500-Besitzer (Gast)


Lesenswert?

machst du den OCR-Pin auch irgendwann/irgendwo zu einem Ausgang?
von Jan (Gast)


Lesenswert?

Mhm, das hilft auch nicht....
Ohne Oszi weiß ich auch nicht, wie das Signal aussieht.

Oder habe ich einen Fehler bei meinem Timing und die 16 MHz falsch in 
die 20ms umgerechnet?
von Jan (Gast)


Lesenswert?

Ich habe ein Signal am Pin, das Mutltimeter zeigt eine kliene Spannung 
an (Mittelwert)

Tipps?
von Katzenspielzeug Kitty High tech Catwalk soundchip (Gast)


Lesenswert?

Hat dein Regler vielleicht einen Anlaufschutz oder eine 
Einstellprozedur, die jedes Mal nach dem Start ausgeführt werden muss? 
Sowas gibt es durchaus häufig. Am besten, du testet dein Programm 
erstmal mit einem stinknormalen Billigservo(z.B. Conrad, 5€). wenn dein 
Regler eine Anfangssequenz braucht, kannst du diese ja einprogrammieren, 
wenn du sicher bist, dass der Rest funktioniert.

LG, Björn
von Norbert S. (norberts)


Lesenswert?

Hi,

Jan schrieb:
> OCR1A = 289;                         // Neutralposition
wäre bei 16MHz und 1024 schonmal nicht Neutralposition sondern 24 sollte 
es sein.

Jan schrieb:
> _delay_ms(50)
das sollten eher 20ms sein. Das ist zwar unkritisch aber eher im Bereich 
von gut 15 bis knapp 30ms und nicht 50ms. Mit 50Hz verwechselt? ;-)

Ausserdem würde ich Prescaler 8 nehmen, das gibt schön feine Auflösung, 
passt perfekt für Timer1. Wenn Du das so grob auflösen willst mit 64µs 
kannst Du auch Timer0 nehmen.

Gruß,
Norbert
von Jan (Gast)


Lesenswert?

DAs mit dem Anlaufschutz habe ich bedacht, ich muss erstmal vollgas 
geben, auf eine Rückmeldung warten und dann minimum und wieder auf eine 
Rückmeldung warten. So stelle ich die Gaswege ein.

Danach mit Minimum starten und auf eine Startmelodie warten.

Allerdings bekomme ich immer nur das Signal für falsches Signal.


nochmal neu mit einem Prescaler von 128, damit komme ich auf die Zeiten 
vom Beispielcode

Achja, die Neutralposition bruache ich doch nicht. Ich kann doch nur in 
eine Richtung drehen
1
ISR( TIMER1_COMPA_vect )                // Interruptbehandlungsroutine
2
{
3
  OCR1A = 2500-OCR1A;      // Das Servosignal wird aus der Differenz von
4
                                        // Periodenlänge (2500*0,008ms=20ms) und letztem
5
                                        // Vergleichswert (OCR1A) gebildet 
6
}
7
8
9
int main (void)
10
{   
11
12
  signed int x =24;
13
14
  DDRD &= ~((1 << DDD5));
15
16
17
  DDRA &= ~((1 << DDA6) | (1 << DDA7));
18
  PORTA |= (1<<PA6) | (1<<PA7);
19
20
  DDRA &= ~((1 << DDA4) | (1 << DDA5));
21
  PORTA |= (1<<PA4) | (1<<PA5);
22
23
  DDRB = 0b11111100;
24
    PORTB = (1<<PB1) | (1<<PB0);          // Pullup für PB0 und PB1
25
 
26
    TCCR1A = (1<<COM1A0);                 // Togglen bei Compare Match
27
    TCCR1B = (1<<WGM12) | (1<<CS12) | (1<<CS10);      // CTC-Mode; Prescaler 128
28
    TIMSK1  = (1<<OCIE1A);                 // Timer-Compare Interrupt an
29
 
30
    OCR1A = 2312;                         // Neutralposition ((2500-2312)*0.008ms)=1,5ms)
31
 
32
    sei();                                // Interrupts global an
33
34
  while(1)
35
  {
36
  
37
    if(PINA & (1<<PINA7))
38
    {
39
      if(x<=32)
40
      {
41
        
42
        cli();
43
            OCR1A = OCR1A + 1;
44
            sei();
45
            _delay_ms(20);
46
        
47
        x=x+1;  
48
        
49
        while(PINA & (1<<PINA7))
50
        {
51
      
52
        }
53
      }
54
    }
55
    if(PINA & (1<<PINA6))
56
    {
57
      if(x>=16)
58
      {
59
        cli();
60
            OCR1A = OCR1A - 1;
61
            sei();
62
            _delay_ms(20);
63
64
        x=x-1;  
65
66
        while(PINA & (1<<PINA6))
67
        {
68
      
69
        }
70
      }
71
    }
72
    if(PINA & (1<<PINA4))
73
    {
74
      if(x<=32)
75
      {
76
        
77
        cli();
78
            OCR1A = 2250;  //Vollgas
79
            sei();
80
            _delay_ms(20);
81
        
82
        x=32;  
83
        
84
        while(PINA & (1<<PINA4))
85
        {
86
      
87
        }
88
      }
89
    }
90
    if(PINA & (1<<PINA5))
91
    {
92
      if(x<=32)
93
      {
94
        
95
        cli();
96
            OCR1A = 2374;  //Langsam
97
            sei();
98
            _delay_ms(20);
99
        
100
        x=16;  
101
        
102
        while(PINA & (1<<PINA5))
103
        {
104
      
105
        }
106
      }
107
    }
108
109
  }
110
  return 0;
111
}
von Rolf M. (rmagnus)


Lesenswert?

Bist du denn auch sicher, daß der µC mit 16 Mhz läuft?
von Jan (Gast)


Lesenswert?

Ja, steht ja auf dem Quarz drauf
von Magnus M. (magnetus) Benutzerseite


Lesenswert?

Jan schrieb:
> Ja, steht ja auf dem Quarz drauf

Nur weil du einen 16MHz Quarz mit dem µC verbunden hast muss dieser 
nicht automatisch auch mit 16MHz arbeiten.
von Jan (Gast)


Lesenswert?

Bei Vollgas messe ich eine Spannung von ca 0,25V und bei Minimum 0,200V. 
Das passt ja auch nicht so richtig.

2ms sind doch 10% und dann müsste ich doch 0,5V haben (Vollgas)
von Norbert S. (norberts)


Lesenswert?

Hi,

ich kann ja kein C aber Du kannst Doch nicht andauernd an OCR1A mit 
wilden Werten rumschrauben. Das wird ständig übernommen und nicht erst 
in der ISR.

In Bascom würde das jeder sehen aber in C ist es ja schon eine Leistung 
das zu lesen. Brrrr....

Gruß,
Norbert
von Rolf M. (rmagnus)


Lesenswert?

Jan schrieb:
> Ja, steht ja auf dem Quarz drauf

Aber du weißt, daß man dem µC erst sagen muß, daß er den Quarz auch 
benutzen soll?
von Jan (Gast)


Lesenswert?

Norbert S. schrieb:
> ich kann ja kein C aber Du kannst Doch nicht andauernd an OCR1A mit
> wilden Werten rumschrauben. Das wird ständig übernommen und nicht erst
> in der ISR.

Klar, so soll es ja auch sein. Das Grundgerüst kommt aus dem Servo 
Tutorial. Wahrscheinlich schon oft benutzt

Rolf Magnus schrieb:
> Aber du weißt, daß man dem µC erst sagen muß, daß er den Quarz auch
> benutzen soll?

Natürlich, da macht euch mal keine Sorgen, das ist korrekt

Trotzdem Danke für eure weiteren Hinweise
von Karl H. (kbuchegg)


Lesenswert?

Jan schrieb:

>> Aber du weißt, daß man dem µC erst sagen muß, daß er den Quarz auch
>> benutzen soll?
>
> Natürlich, da macht euch mal keine Sorgen, das ist korrekt

Wenn wir für jedesmal, wenn wir diesen Satz gehört haben einen Euro 
kriegen würden und es dann doch nicht gestimmt hat, dann wären viele 
hier reiche Männer.

Hast du überprüft ob der µC mit 16MHz läuft? Wie hast du es überprüft?

Ausserdem ist weiter oben ein wie ich meine wirklich guter Vorschlag 
gekommen: Teste das alles erst mal mit einem Servo. Bei einem Servo hast 
du eine viel bessere Rückmeldung, ob deine Pulsgenerierung stimmt, als 
einfach nur ein paar Piepser. Wenn das Servo sauber stellt, dann passt 
es und du kannst dir dann ansehen, ob deine Endwerte hinkommen. Und 
nachdem dann beides stimmt, wird auch der Regler damit zufrieden sein. 
Aber momentan stocherst du nur im Nebel und hoffst, dass Code den du 
irgendwo zusammengeklaut hast, das alles irgendwie schon richten wird.
von Jan (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Hast du überprüft ob der µC mit 16MHz läuft? Wie hast du es überprüft?

Habe es extra nochmal mit einem Timer überprüft, der jede Sekunde eine 
Variable hochzählt und die auf einem Display anzeigt.

Karl Heinz Buchegger schrieb:
> Teste das alles erst mal mit einem Servo.

Würde ich wirklich gerne, habe nur keines da. Bestellen dauert ein paar 
Tage und kostet für ein Servo auch wieder zu viel Versand.
Zur Not kann ich in 1 Woche wieder an ein Oszi kommen. Das würde mir 
auch helfen.
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.