Forum: Mikrocontroller und Digitale Elektronik servo ansteuerung mit einem pic16f690


von Florian (Gast)


Lesenswert?

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
von Florian (Gast)


Lesenswert?

Nur zur info:
Ich habe eine Modelcraft Standard-Servo (410 Getriebe Kunststoff JR) von 
Conrad.
Danke nochmals für jede hilfe

von Max H. (hartl192)


Lesenswert?

In welcher Sprache programmierst du?

von Mike A. (Gast)


Lesenswert?

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"

von Mike A. (Gast)


Lesenswert?

*Google

von Florian (Gast)


Lesenswert?

ich programmiere in c

von Max H. (hartl192)


Lesenswert?

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
von Florian (Gast)


Lesenswert?

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.

von Max H. (hartl192)


Lesenswert?

Florian schrieb:
> da wir es in der schule immer anders
> programmiert haben.
Wie anders? Das ist ganz normales C...

von Florian (Gast)


Lesenswert?

ganz ehrlich dafür kenn ich mich noch zu wenig aus.
Jedenfalls schreibt er build failed

von Max H. (hartl192)


Lesenswert?

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
von Florian (Gast)


Lesenswert?

ich verwende das programm MPLAB IDE

von Florian (Gast)


Lesenswert?

kannst du bitte wenns geht einfach ein Testprogramm reinstellen
Wäre dir sehr dankbar

von Max H. (hartl192)


Lesenswert?

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?

von Florian (Gast)


Lesenswert?

microchip mplab xc8 compiler

von Max H. (hartl192)


Lesenswert?

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
von Florian (Gast)


Lesenswert?

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?

von Max H. (hartl192)


Lesenswert?

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.

von Michael (Gast)


Lesenswert?

Zeig doch erstmal wie deine Schaltung aussieht. Der Servo geht nicht so 
schnell kaputt.

von Florian (Gast)


Lesenswert?

Danke aber er will sich einfach nicht bewegen. In welche Richtung sollte 
sich der Servo überhaupt bewegen?

von Florian (Gast)


Lesenswert?

Ok das könnte auch das Problem sein. Wir greifen momentan das Signal 
direkt von RC0 ab.

von Max H. (hartl192)


Lesenswert?

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)

von Florian (Gast)


Lesenswert?

Danke jedoch hat das nichts gebracht. Wie schon zuvor erwähnt greifen 
wir momentan das Signal direkt von RC0 ab

von Florian (Gast)


Lesenswert?

Mir wurde gesagt das wir dafür keine Schaltung benötigen.
Oder benötige ich doch eine Schaltung?

von Florian (Gast)


Lesenswert?

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.

von Max H. (hartl192)


Lesenswert?

Florian schrieb:
> Oder benötige ich doch eine Schaltung?
Ohne Hardware wird nichts funktionieren.

: Bearbeitet durch User
von Florian (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.