µC um Modellbauservos und DC-Motoren anzusteuern

#4247827
Lesenswert?

Waspy schrieb:
>
> 8-Bit µC, der 4 PWM-Signalausgänge hat (für DC und Servos), sowie einen
> Analog-Digital Wandler als Eingang.

Sicher, daß der eine AD-Eingang die komplette Eingabeseite ist oder hast 
Du in der Spec noch die Eingänge für Taster, RC-Signaleingänge oder eine 
serielle Schnittstelle vergessen? Dann würde nach der o.a. Spec z.B. ein 
PIC12F1840 o.ä. im 8-Pin DFN-Gehäuse entsprechen.
#4247845
Lesenswert?

Ok, der 1501 ist ggf. noch besser, da er auch schon 4 Hardware-PWMs hat. 
(naja, läuft bei mir unter "o.ä." ;))
Allerdings ist fraglich, ob die 4 PWM Einheiten zum gleichzeitigen 
Ereugen des niederfrequenten Servo PWM-Signals und der hohen 
PWM-Frequenz für den "DC" (ich nehme an, das soll wohl ein DC-Motor 
sein?) geeignet sind oder die Servo-Signale nicht ohnehin eher per 
Software erzeugt werden müssen.
Gast #4247962
Lesenswert?

Hallo
Erstmal danke für die Antworten.
Um das ganze ein wenig zu präzisieren: Ich möchte das Signal das der 
Empfänger normalerweise direkt ans Servo sendet auslesen, was dann ein 
zeitgesteuertes Programm laufen lässt. Das PWM-Signal für die Servos 
möchte ich verwenden da ich es so gelernt habe und anderweitig schon 
genug Probleme auftauchen werden.
Vielleicht noch: Programmieren möchte ich am PC also ohne irgendwelche 
Eingabegeräte (Eclipse kenne ich bis jetzt)

Grüsse Waspy
#4248056
Lesenswert?

Waspy schrieb:

> Das PWM-Signal für die Servos
> möchte ich verwenden da ich es so gelernt habe und anderweitig schon
> genug Probleme auftauchen werden.

Na ja. das ist jetzt aber nicht wirklich ein Argument.
Mehrere Servos mit nur einem einzigen Timer anzusteuern ist simpel, 
solange du einen einzigen Timer mit einem Compare Interrupt hast und das 
ganze so einstellen kannst, dass du mit den Pulszeiten hin kommst. Die 
Servos werden dann im Hintergrund angesteuert und das auf beliebigen 
Ausgabepins. Für das restliche Progamm sind die Servos einfach nur ein 
Array von Werten, in das sie die Servopositionen schreiben und um den 
Rest kümmert sich der (simple) Interrupt. Das kann praktisch jeder 
heutige µC. Und das, wenn es genügend Ausgabepins gibt, problemlos bis 
hoch zu 10 bis 12 Servos. Mit jedem weiteren Timer kommen dann wieder 
maximal 10 bis 12 Servos dazu, wobei man dann allerdings einen kleinen 
Jitter (abhängig von der Taktfrequenz des µC) wohl in Kauf nehmen muss.
Nicht so simpel ist es hingegen, einen µC zu finden der 4 PWM erzeugen 
kann, ohne dass du dir dabei die halbe µC-Hardware dadurch blockierst 
und dann auch noch die Ausgänge pinmässig dort hast, wo du dir das 
Platinendesign einfach machen kannst.

> möchte ich verwenden da ich es so gelernt habe

D.h. du hast bereits einen µC mit dem du umgehen kannst?
Wenn der 1 Timer hat mit einem Compare Interrupt, dann hast du bereits 
den Fuss in der Tür. Jetzt musst du dich nur noch von der Idee trennen, 
dass alle Servos gleichzeitig ihren Puls kriegen müssen, sondern dass es 
auch völlig ausreichend ist, wenn die reihum ihren Puls zeitversetzt 
kriegen und dass die 20ms so ziemlich das aller unwichtigste an der 
ganzen Sache ist und in 20 Minuten ist deine Servoansteuerung fertig.

am Beispiel eines 16 Bit Timers
1
volatile uint16_t ServoPosition[4];
2

3
....
4
CompareInterrupt() 
5
{
6
  static uint8_t aktuellesServo = 0;
7
  
8
  if( aktuellesServo == 0 )
9
    schalte Ausgang für Servo 0 auf 0
10
  else if( aktuellesServo == 1 )
11
    schalte Ausgang für Servo 1 auf 0
12
  else if( aktuellesServo == 2 )
13
    schalte Ausgang für Servo 2 auf 0
14
  else if( aktuellesServo == 3 )
15
    schalte Ausgang für Servo 3 auf 0
16

17
  aktuellesServo++;
18
  if( aktuellesServo == 10 )
19
    aktuellesServo = 0;
20

21
  if( aktuellesServo == 0 )
22
    schalte Ausgang für Servo 0 auf 1
23
  else if( aktuellesServo == 1 )
24
    schalte Ausgang für Servo 1 auf 1
25
  else if( aktuellesServo == 2 )
26
    schalte Ausgang für Servo 2 auf 1
27
  else if( aktuellesServo == 3 )
28
    schalte Ausgang für Servo 3 auf 1
29

30
  if( aktuellesServo < 4 )
31
    Compare Wert += ServoPosition[aktuellesServo];
32
  else
33
    Compare Wert += CompareWert für ca 2 ms;
34
}
35

36
....
37

38
// Wann immer eine Servo auf eine Position fahren soll, wird der
39
// CompareWert dafür anhand der bekannten Timertaktung ausgerechnet
40
// und das Ergebnis davon in ServoPosition geschrieben.
41
// Achtung: ev. ist dafür ein atomarer Zugriff notwendig

abhängig von den Pin-Positionen bzw. der Verteilung der Pins auf Ports, 
sind da noch Vereinfachungen möglich, zb im setzen der Servoausgänge auf 
0 das als 'Rundumschlagaktion' dann einfach alle 4 Ausgänge auf einmal 
auf 0 setzen kann.
Ich lass die Servo Anzahl bis 10 hochlaufen, damit sich eine 
Pulswiederholung für ein einzelnes Servo von ca. 20ms ergibt. Aber wie 
gesagt: die 20ms sind nicht kritisch. Ob das jetzt 15 oder 18 oder 20ms 
sind, ist den Servos ziemlich gleichgültig. Das muss nicht genau sein 
und wenn die Zeit so ungefähr stimmt, dann passt das schon.
Gast #4248092
Lesenswert?

Mitlesa schrieb:
> Waspy schrieb:
>> Vielleicht noch: Programmieren möchte ich am PC also ohne irgendwelche
>> Eingabegeräte (Eclipse kenne ich bis jetzt)
>
> Das dürfte schwierig werden, so ohne Tastatur, Maus, Tablet,
> Touchscreen, Touchpad ....

Man kann auch überall das Haar in der Suppe finden
Sry aber nächstes mal bevor du so ne Antwort gibst überlegst du dir 
bitte nochmals ob mir das hilft oder nicht
Gast #4248110
Lesenswert?

Sry für den Doppelpost

@ Karl Heinz
ja ich hab ein bischen schon mit Mikrocontroller gearbeitet aber ich 
würde meine Kenntnisse jetzt nicht als ausreichend einschätzen um so was 
ohne Anleitung hinzukriegen und um mich noch gross in etwas 
reinzuarbeiten fehlt mir eigentlich das Interesse am Mikrocontroller.

Bei deinem Code sehe ich jetzt nicht wie du jedes Servo einzel 
ansteuerst. So wie ich dich jetzt verstanden habe erzeugst du ein PWM 
Signal und verteilst das auf unterschiedliche Ausgänge oder?
#4248122
Lesenswert?

Waspy schrieb:
> Sry für den Doppelpost
>
> @ Karl Heinz
> ja ich hab ein bischen schon mit Mikrocontroller gearbeitet aber ich
> würde meine Kenntnisse jetzt nicht als ausreichend einschätzen um so was
> ohne Anleitung hinzukriegen und um mich noch gross in etwas
> reinzuarbeiten fehlt mir eigentlich das Interesse am Mikrocontroller.
>
> Bei deinem Code sehe ich jetzt nicht wie du jedes Servo einzel
> ansteuerst. So wie ich dich jetzt verstanden habe erzeugst du ein PWM
> Signal und verteilst das auf unterschiedliche Ausgänge oder?

Man könnte es so sagen.
Aber viel simpler ist es, zu sagen, dass der Compare Interrupt so 
eingestellt wird, das er auslöst wenn die Pulszeit für ein bestimmtes 
Servo abgelaufen ist. Dann wird der zugehörige Ausgang für dieses Servo 
auf 0 geschaltet und der Ausgang für das nächste Servo auf 1. Dessen 
Pulszeit beginnt dann zu laufen und der Compare Wert vom Timer wird so 
eingestellt, dass der Timer sich mittels Interrupt wiedder meldet wenn 
diese Pulszeit abgelaufen ist. Und so geht das immer weiter. Der 
Timerinterrupt kommt immer dann, wenn die Pulszeit für ein Servo zu Ende 
ist und dann beginnt der Puls für das nächste Servo.
1
                    +------+
2
                    |      |
3
  Servo 0      -----+      +----------------------------------
4

5
                           +----+
6
                           |    |
7
  Servo 1      ------------+    +-----------------------------
8

9
                                +--------+
10
                                |        |
11
  Servo 2      -----------------+        +--------------------
12

13
                                         +------+
14
                                         |      |
15
  Servo 3      --------------------------+      +-------------
16

17
                   ^
18
                   | Interrupt
19

20
                           ^
21
                           | Interrupt
22

23
                                ^
24
                                | Interrupt
25
 
26
                                         ^
27
                                         | Interrupt
28

29
                                                ^
30
                                                | Interrupt

Der Timer-Interrupt findet an den Pulsflanken statt. D.h. eigentlich 
umgekehrt: Der Interrupt findet statt wenn Zeiten abgelaufen sind. Die 
Flanken an den entsprechenden Pins sind dann die Reaktion des Programms 
darauf.
Gast #4248303
Lesenswert?

was neues lernen heisst ja nicht das man das was man bereits weiss nicht 
auch anders anwenden kann...
danke trotzdem das dus versucht hast
an die anderen: bin mir ja einiges gewohnt von Foren aber wenn 50% der 
Posts einfach Bullshit ist da einfach nicht genau gelesen oder was weiss 
ich und mir nur einer wirklich zu helfen versucht sry dann ists wirklich 
das schlechteste Forum in dem ich war
#4248339
Lesenswert?

In dem Forum hier ist halt die Qualität der Antworten noch stärker als 
üblich von der Qualität der Frage abhängig.

Waspy schrieb:
> ohne Anleitung hinzukriegen und um mich noch gross in etwas
> reinzuarbeiten fehlt mir eigentlich das Interesse am Mikrocontroller.

Und damit macht man sich hier keine Freunde, die meisten Leute hier 
wollen etwas lernen oder den Leuten beim lernen helfen. Jemand anders 
die Arbeit abnehmen tut nunmal mehr oder weniger niemand freiwillig für 
einen Fremden.

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