Forum: Mikrocontroller und Digitale Elektronik Programm für Servomotor


von Chandler B. (chandler)


Lesenswert?

Hallo,
hiermit habe ich direkt 2 Fragen.
zunächst mal mein Programm
1
#define F_CPU 1000000UL
2
#include <stdlib.h>
3
#include <stdio.h>
4
#include <stdint.h>
5
#include <avr/io.h>
6
#include <util/delay.h>
7
8
void init_timer(){
9
  // Set Fast PWM mode.
10
  TCCR0A |= (1<<WGM00) | (1<<WGM01);
11
  // Clear 0C0A on compare.
12
  TCCR0A |= (1<<COM0A1);
13
  // Start timer, no prescaling.
14
  TCCR0B |= (1<<CS00) | (1<<CS01);
15
  // Duty cycle 0% 
16
  OCR0A = 0;
17
}
18
19
void init_servo(){
20
  DDRA = 0x00; // PortA als Eingang deklarieren
21
  PORTA=0x00; //Ports auf LOW schalten
22
  DDRB |= (1<<PB2); 
23
}
24
25
int main(){
26
  int i, x;
27
  init_servo();
28
  init_timer();
29
  while(1){
30
    if(PINA&(1<<PINA0)){
31
    i = 1;
32
    while(!(PINA & (1 << PINA0))){
33
      i++;
34
      OCR0A = i;
35
      _delay_ms(20);
36
    }
37
    while(i<=5){
38
      i--;
39
      OCR0A = i;
40
      _delay_ms(20);
41
    }          
42
  }
43
  }
44
  return 0;
45
}

Ich kann das Programm builden(?) also eine hex-file erstellen, die ich 
anschließend auf meinen Attiny2313 machen möchte.
Meine erste Frage bezieht sich auf das Programm AVR-Studio 4. WEnn ich 
das Programm debuggen(?) mcöhte, bedeutet es ja so viel, dass ich es in 
AVR-Studio simulieren möchte. Dann könnte ich bei I/O View ja eingänge 
setzen und sehen, wie sich welcher Ausgang verhält oder? aber immer wenn 
ich das machen möchte, stürzt AVR-Studio ab. wei einer woran das liegen 
kann?
Meine zweite Frage ist zum Programm ansich. Ich möchte ja, solange wie 
er Eingang an PA0 anliegt, dass der Ausgang PB2 ein steigendes PWM 
rausgibt. Damit möchte ich einfach nur, dass sich der Servor dreht. 
Sobald das Signal an PA0 wieder weg ist, möchte ich, dass sich der Servo 
wieder zurückdreht.

Allerdings dreht sich der servo ganz komisch, was ihc zu erklären 
versuche:
Obwohl kein Signal anliegt, dreht der servo sich. Zunächst dreht er sich 
fast ~80° nach links, macht eine Pause von ca 4 sekunden, dreht sich 
noch ein stück weiter nach links (~15°) und dann sofort wieder auf 
Startposition. Dort verweilt er wieder ein bisschen und fängt dann 
wieder von vorne an.
Auch wenn ich das Signal anlege, macht er genau das selbe. liegt das am 
Programm? wenn ja, was habe ich falsch gemacht?

hoffe, dass ich mein Problem verständlich erklärt habe, ansonsten bitte 
einfach nochmal nachfragen.

von Hubert G. (hubertg)


Lesenswert?

Bei der Taste den PullUp aktivieren.
Zum anderen Problem könnte das behilflich sein:
Beitrag "Avr Studio 4 und die neue AVR Toolchain - So funktionierts!"

von Michael L. (eagle87)


Lesenswert?

Chandler Bing schrieb:
> Meine erste Frage bezieht sich auf das Programm AVR-Studio 4. WEnn ich
> das Programm debuggen(?) mcöhte, bedeutet es ja so viel, dass ich es in
> AVR-Studio simulieren möchte. Dann könnte ich bei I/O View ja eingänge
> setzen und sehen, wie sich welcher Ausgang verhält oder? aber immer wenn
> ich das machen möchte, stürzt AVR-Studio ab. wei einer woran das liegen
> kann?
Zum AVR Studio kann ich nichts sagen, aber Debuggen != Simulieren. Beim 
Debuggen schaust du dir zur Programmlaufzeit die Register an.

> Meine zweite Frage ist zum Programm ansich. Ich möchte ja, solange wie
> er Eingang an PA0 anliegt, dass der Ausgang PB2 ein steigendes PWM
> rausgibt. Damit möchte ich einfach nur, dass sich der Servor dreht.
> Sobald das Signal an PA0 wieder weg ist, möchte ich, dass sich der Servo
> wieder zurückdreht.

Falls es sich um ein Modellbauservo handelt brauchst du ein PWM-Signal 
mit 1...2ms Pulsweite. Als Periodendauer wird üblicherweise 20ms 
verwendet. Bei der Periodendauer sind gewisse Abweichungen zulässig.
In deinem Programm verwendest du aber einen 8Bit Timer ohne Prescaler 
bei 1MHz Taktfrequenz. Das ergibt eine Periodendauer von 0,254ms und ist 
viel zu kurz. Außerdem hällst du die Grenzen für die Pulsweite nicht 
ein. Schon die Initialisierung mit 0% Duty cycle ist falsch.

Gruß
Michael

von Werner (Gast)


Lesenswert?

Michael L. schrieb:
> Bei der Periodendauer sind gewisse Abweichungen zulässig.

"Gewisse Abweichungen" ist gut formuliert. Weder 10ms noch 100ms Periode 
stört die i.A. überhaupt nicht. Bei langer Periode sinkt allenfalls bei 
einigen Typen die Geschwindigkeit.

von Stefanus (Gast)


Lesenswert?

Kommentiere die Delays aus und deaktiviere den Optimizer (Compiler 
Option -O0). Dann funktioniert der Simulator.

von Chandler B. (chandler)


Lesenswert?

Hallo und erst einmal danke für die Tips.
Das mit dem debuggen funktioniert jetzt soweit, aber irgendwo ist da 
noch der wurm drinn, denn jetzt bewegt sich gar nichts mehr
1
#define F_CPU 1000000UL
2
#include <stdlib.h>
3
#include <stdio.h>
4
#include <stdint.h>
5
#include <avr/io.h>
6
#include <util/delay.h>
7
8
void init_timer(){
9
  // Set Fast PWM mode.
10
  TCCR0A |= (1<<WGM00) | (1<<WGM01);
11
  // Clear 0C0A on compare.
12
  TCCR0A |= (1<<COM0A1);
13
  // Start timer, no prescaling.
14
  TCCR0B |= (1<<CS00) | (1<<CS01);
15
  // Duty cycle 0% 
16
  OCR0A = 0;
17
}
18
19
void init_servo(){
20
  PORTB |= (1<<PB2);  //PB2 als Ausgang definieren 
21
  PORTB &= ~(1<<PB2);  // PB2 auf low setzen   
22
  DDRA &= ~(1<<PA0);  // PA0 als Eingang definieren
23
  PORTA |= (1<<PA0);  // Interner Pull-Up einschalten
24
}
25
26
int main(){
27
  int i=5, x;
28
  init_servo();
29
  init_timer();
30
  while(1){
31
    if(PINA&(1<<PINA0)){
32
    i = 1;
33
    while(!(PINA&(1<<PINA0))){
34
      i++;
35
    OCR0A = i;
36
    _delay_ms(20);
37
    }
38
    while(i<=5){
39
      i--;
40
    OCR0A = i;
41
    _delay_ms(20);
42
    }          
43
  }
44
  }
45
  return 0;
46
}

wenn ich den debugger laufen lasse, bleibt das programm bei
1
if(PINA&(1<<PINA0)){
stehen. Setze ich dann den PINA0 auf high, indem ich dem im I/O View 
anklicke, springt das Programm direkt auf
1
while(i<=5){
und lässt die Schleife andauernd durchlaufen.

weis noch jemand rat?

Chandler

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.