Hallo Ich probiere bereits seit ein paar tagen meinen Servo zum funktionieren zu bringen aber ich schaffe es einfach nicht. Ich beginne erst zu programmieren und müsste eigentlich mehrere Servos gleichzeitig ansteuern. Aber ich wäre jedem sehr dankbar der mir ein funktionierendes Programm geben kann oder einfach postet. Mir reicht schon ein ganz einfaches Programm nur um den Servo in die verschiedenen Stellungen zu bringen, damit ich einmal ein Verständnis dafür bekomme. Nochmals Danke LG. Florian
:
Verschoben durch Moderator
Nur zur info: Ich habe eine Modelcraft Standard-Servo (410 Getriebe Kunststoff JR) von Conrad. Danke nochmals für jede hilfe
Florian schrieb: > Aber ich wäre jedem sehr dankbar der mir ein funktionierendes Programm > geben kann oder einfach postet. Mit G..gle findest du solche Programme unter "Servo Tester"
Für einen Servo an z.B. RC0 mit einer Auflösung 20 Schritten. Das Timing wird über delays realisiert.
1 | // Init
|
2 | TRISCbits.TRISC0=0; |
3 | LATCbits.LATC0=0; |
4 | |
5 | // Funktion zur Ansteuerung
|
6 | void Servo(unsigned char pos) |
7 | {
|
8 | if(pos>20) |
9 | pos=20; |
10 | LATCbits.LATC0=1; |
11 | __delay_ms(1); |
12 | while(pos--) |
13 | __delay_us(50); |
14 | LATCbits.LATC0=0; |
15 | }
|
Nachtrag: Vllt. sehen die Delays bei deinem Compiler anders aus.
:
Bearbeitet durch User
Danke für das Programm auch wenn ich es noch nicht ganz verstehe. Ich versuch mal es zu verstehen, da wir es in der schule immer anders programmiert haben. Wenn noch jemand ein paar Ideen hat stellt das bitte auch rein.
Florian schrieb: > da wir es in der schule immer anders > programmiert haben. Wie anders? Das ist ganz normales C...
ganz ehrlich dafür kenn ich mich noch zu wenig aus. Jedenfalls schreibt er build failed
Das ist auch kein fertiges Programm, sondern nur eine Funktion um den Servo anzusteuern und noch zwei Zeilen die irgendwo in die main müssen bevor du die Funktion aufrufst. BTW: Welchen Compiler hast du?
:
Bearbeitet durch User
kannst du bitte wenns geht einfach ein Testprogramm reinstellen Wäre dir sehr dankbar
Florian schrieb: > ich verwende das programm MPLAB IDE Das ist wie der Name schon sagt nur die IDE. Welchen Compiler verwendest du in der DIE?
1 | #define _XTAL_FREQ 8000000
|
2 | |
3 | #include <xc.h> |
4 | |
5 | #pragma config FOSC = INTRCIO // Oscillator Selection bits (INTOSCIO oscillator: I/O function on RA4/OSC2/CLKOUT pin, I/O function on RA5/OSC1/CLKIN)
|
6 | #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
|
7 | #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
|
8 | #pragma config MCLRE = ON // MCLR Pin Function Select bit (MCLR pin function is MCLR)
|
9 | #pragma config CP = OFF // Code Protection bit (Program memory code protection is disabled)
|
10 | #pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled)
|
11 | #pragma config BOREN = ON // Brown-out Reset Selection bits (BOR enabled)
|
12 | #pragma config IESO = ON // Internal External Switchover bit (Internal External Switchover mode is enabled)
|
13 | #pragma config FCMEN = ON // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is enabled)
|
14 | |
15 | #include <stdio.h> |
16 | #include <stdlib.h> |
17 | |
18 | void Servo(unsigned char pos); |
19 | void main() |
20 | {
|
21 | OSCCONbits.IRCF=0b111; // 8 MHz intosc |
22 | |
23 | |
24 | TRISCbits.TRISC0=0; // RC0 Output |
25 | PORTCbits.RC0=0; // Set RC0 to '0' |
26 | |
27 | Servo(10); |
28 | while(1); |
29 | }
|
30 | |
31 | void Servo(unsigned char pos) |
32 | {
|
33 | if(pos>20) |
34 | pos=20; |
35 | PORTCbits.RC0=0; // Set RC0 to '1' |
36 | __delay_ms(1); // Wait 1ms |
37 | while(pos--) |
38 | __delay_us(50); // Wait pos*50µs |
39 | PORTCbits.RC0=0; // Set RC0 to '0' |
40 | }
|
Der Funktion Servo() wird ein Wert zwischen 0 und 20 übergeben. 0 entspricht 1ms Impulsbreite, 20 entspricht 2ms Impulsbreite.
:
Bearbeitet durch User
Danke für das Programm, aber der Servo bewegt sich leider immer noch nicht. Ich weis nicht woran es liegt, aber langsam vermute ich das wir den Servo bereits zerstört haben. Eine Frage habe ich jedoch noch. Wieso setzt du RC0 auf Null? Setzt das nicht den Ausgang auf Null?
Max H. schrieb: > PORTCbits.RC0=0; // Set RC0 to '1' Sry, hier habe ich mich vertippt. Es sollte "PORTCbits.RC0=1;" heißen, so wie es im Kommentar steht.
Zeig doch erstmal wie deine Schaltung aussieht. Der Servo geht nicht so schnell kaputt.
Danke aber er will sich einfach nicht bewegen. In welche Richtung sollte sich der Servo überhaupt bewegen?
Ok das könnte auch das Problem sein. Wir greifen momentan das Signal direkt von RC0 ab.
Mittelstellung, vllt. ist ein Impuls zu wenig. Ersetz mal die main dadurch:
1 | void main() |
2 | {
|
3 | OSCCONbits.IRCF=0b111; // 8 MHz Intosc |
4 | |
5 | |
6 | TRISCbits.TRISC0=0; // RC0 Output |
7 | PORTCbits.RC0=0; // Set RC0 to '0' |
8 | |
9 | while(1) |
10 | {
|
11 | Servo(10); |
12 | __delay_ms(20); |
13 | }
|
14 | }
|
Wie sieht die Schaltung aus? (Schaltplan bitte nicht in Prosa)
Danke jedoch hat das nichts gebracht. Wie schon zuvor erwähnt greifen wir momentan das Signal direkt von RC0 ab
Mir wurde gesagt das wir dafür keine Schaltung benötigen. Oder benötige ich doch eine Schaltung?
Endlich er bewegt sich wenn ich ihn auf 10 stelle ist er in der mittleren Stellung wenn ich ihn auf 0 stelle ist er in der rechten Endstellung, jedoch geht er dann wieder ein kleines Stück zurück. wenn ich ihn auf 20 stelle bewegt er sich in die linke Endstellung jedoch zuckt er so komisch herum, also er bleibt nicht ruhig stehen.
Florian schrieb: > Oder benötige ich doch eine Schaltung? Ohne Hardware wird nichts funktionieren.
:
Bearbeitet durch User
aber er bewegt sich eh. Oder stabilisiert er sich dadurch(also zuckt nimma so herum)?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.