servo ansteuerung mit einem pic16f690

Gast #3840783
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
#3840812
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.
Gast #3840839
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.
#3840899
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.
Gast #3840925
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?
#3840961
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)
Gast #3840997
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.

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