Sida 1 av 2

Styra servo

Postat: 2 december 2012, 14:36:47
av filipk
Hej,
Jag har köpt två st rc-servon av modell Hitec HSR-1425CR continuous rotation. Jag hade tänkt att försöka bygga en liten robot.

Om jag har förstått det rätt så ska man styra servot med en puls på 1-2 ms med 20 ms mellanrum. Mina servon är modifierade för 360 graders rotation det finns alltså ingen potentiometer. Om man ger den en puls på över 1,5 ms ska den snurra åt ett håll och under 1,5 ms åt det andra. Mitt problem är att oavsett vilken pulslängd jag matar den med snurrar den åt samma håll. :cry:

Jag försöker kontrollera servot med en PIC16f690. Jag använder MPLAB med HI-TECH C. Vad gör jag för fel?

Kod: Markera allt

#include<pic.h>
#include<htc.h>
#define _XTAL_FREQ 8000000

void main()
{
TRISB = 1;
TRISC = 0;
RC0 = 0;

while(1)
{

RC0=1;
	__delay_ms(1.5);  //Blir samma resultat med 1 eller 2.
RC0=0;
	__delay_ms(20);

}


}
Tack på förhand, nybörjare

Re: Styra servo

Postat: 2 december 2012, 15:20:36
av Icecap
__delay_ms(1.5);
Detta är väl omöjligt! Du kan inte ha flyttal där, bara heltal!
Alltså: antingen
__delay_ms(1);
eller
__delay_ms(2);

Det finns väl en µs delay-grej och där kan du be den om 1500µs som nollställning.

Sedan hade det varit en del bättre att ha en timer-rutin som tar hand om detta.

Re: Styra servo

Postat: 2 december 2012, 15:39:40
av filipk
Det konstiga är att den snurrar åt samma håll på 1 ms som 2 ms. Provade med 1500 us men den snurrar ändå...

Har gjort endel försök med timer och interrupt men med samma resultat.

Kan man lita på att __delay_ms(2) fördröjer 2 ms? Jag har tyvärr inte något oscilloskop så jag kan inte mäta.

Re: Styra servo

Postat: 2 december 2012, 16:03:28
av Icecap
Om du har angivit kristallfrekvensen korrekt ska det väl vara ganska pålitligt.

Re: Styra servo

Postat: 3 december 2012, 22:49:50
av janbjorn
Kan du mäta signalen med Oscilloskop för att verifiera att den verkligen ändras?

edit, läste precis att du inte har oscilloskop... Jag gjorde nyligen en servostyrning i Arduino, men genererade den med timerinterrupt istället. typ såhär:

Kod: Markera allt

 
void servoIsr()
{
    if (!servoOut) {
      Timer1.setPeriod(servoUS);
    } else {
      Timer1.setPeriod(servoFrame - servoUS);
    }
    servoOut =!servoOut;
    digitalWrite( 13, digitalRead( 13 ) ^ 1 );
}
servoUS är alltså antal microsekunder som servopulsen ska vara och servoFrame är 20ms.

Re: Styra servo

Postat: 4 december 2012, 00:18:33
av ToPNoTCH
En del problem kan uppstå för att man slarvar i initieringen.

Det är god praksis att initiera allt enligt hur man tänkt använda det.

I ditt fall så borde du slå av A/D-omvandlarna (ANSEL/ANSELH) och komparatorn (CM2CON0) vilka dubblerar på RC0 pinnen.

Re: Styra servo

Postat: 4 december 2012, 17:27:51
av ylle
Ett fult sätt att göra delay är att räkna ut hur länge en NOP på din pic är,
sedan anropa en procedure som gör x antal nopar som ger en fördröjning på t.ex 0,1ms

Re: Styra servo

Postat: 6 december 2012, 10:48:53
av nibl
Jag har för mig att PIC16F690 arbetar i 4 Mhz som default (så det kan kanske hjälpa att ändra _XTAL_FREQ till 4000000). Och för att styra servot ska signal+paus vara 20ms dvs om du har en signal på 1.5ms så ska pausen vara 18.5ms.
filipk skrev:Hej,
Jag har köpt två st rc-servon av modell Hitec HSR-1425CR continuous rotation. Jag hade tänkt att försöka bygga en liten robot.

Om jag har förstått det rätt så ska man styra servot med en puls på 1-2 ms med 20 ms mellanrum. Mina servon är modifierade för 360 graders rotation det finns alltså ingen potentiometer. Om man ger den en puls på över 1,5 ms ska den snurra åt ett håll och under 1,5 ms åt det andra. Mitt problem är att oavsett vilken pulslängd jag matar den med snurrar den åt samma håll. :cry:

Jag försöker kontrollera servot med en PIC16f690. Jag använder MPLAB med HI-TECH C. Vad gör jag för fel?

Kod: Markera allt

#include<pic.h>
#include<htc.h>
#define _XTAL_FREQ 8000000

void main()
{
TRISB = 1;
TRISC = 0;
RC0 = 0;

while(1)
{

RC0=1;
	__delay_ms(1.5);  //Blir samma resultat med 1 eller 2.
RC0=0;
	__delay_ms(20);

}


}
Tack på förhand, nybörjare

Re: Styra servo

Postat: 6 december 2012, 10:51:11
av Icecap
En sak jag undrar: använder du
__delay_ms(1.0); //Blir samma resultat med 1 eller 2.
och
__delay_ms(2.0); //Blir samma resultat med 1 eller 2.

Eller gör du som man ska göra:
__delay_ms(1);
__delay_ms(2);

Re: Styra servo

Postat: 6 december 2012, 14:52:50
av filipk
Tack för alla svar! :)
ToPNoTCH skrev:En del problem kan uppstå för att man slarvar i initieringen.

Det är god praksis att initiera allt enligt hur man tänkt använda det.

I ditt fall så borde du slå av A/D-omvandlarna (ANSEL/ANSELH) och komparatorn (CM2CON0) vilka dubblerar på RC0 pinnen.
Hur gör jag detta? Så här?

Kod: Markera allt

ANSEL = 0;
ANSELH = 0;
CM2CON0 = 0;
ylle skrev:Ett fult sätt att göra delay är att räkna ut hur länge en NOP på din pic är,
sedan anropa en procedure som gör x antal nopar som ger en fördröjning på t.ex 0,1ms
Hur räknar man hur lång tid en NOP() tar?

Min kod ser nu ut så här, servot snurrar fortfarande åt samma håll och i samma hastighet som innan oavsett vilken delay jag sätter in.

Kod: Markera allt

#include<pic.h>
#include<htc.h>
#define _XTAL_FREQ 4000000

void main()
{
ANSEL = 0;
ANSELH = 0;
CM2CON0 = 0; //Har jag gjort rätt här?

TRISC = 0;
RC0 = 0;

while(1)
{

RC0=1;
	__delay_ms(2); //blir samma med 1, 2, eller __delay_us(1500)
RC0=0;
	__delay_ms(18);

}
}

Re: Styra servo

Postat: 6 december 2012, 17:29:57
av ylle
En NOP tar 1sekund / klockfrekvensen. Om den går i 4MHz så tar den 0,25/1.000.000 sekund eller 0.25us (tänkte jag rätt nu?)

http://www.phanderson.com/PIC/PICC/CCS_PCM/bar.html
här finns lite C kod för pic som använder NOP fördröjning.

Re: Styra servo

Postat: 6 december 2012, 17:37:34
av Icecap
Ett steg du bör ta, inte för att jag tror att det har speciell betydelse just här men bara för att vara säker är att se till att initiera alla portpinnar som inte används som input som output! Då är du säker på att det inte är störningar den vägen iaf. Och såklart har du avkopplingskondensator på strömmen så det ska inte heller vara ett problem - för det har du väl?

* Kan du mäta på PORTC0? Du har inget oscilloskop men ett multimeter har du väl? Mät spänningen vetja, den bör ligga runt 0,5V vid 2ms puls och 0,25V vid 1ms puls. Fladdrar spänningen får du göra en bedömning om det ser mindre fel ut.
* Kan ditt evt. multimeter mäta frekvens? Om det kan ska du mäta den. Bör ligga runt 50Hz med de värden du anger.
* Har du testat att bara ha en LED på (med strömbegränsermotstånd såklart)? Kan du programledes styra PORTC0 av och på precis som du vill?

Re: Styra servo

Postat: 7 december 2012, 15:38:50
av nibl
Har du testat servot så det inte är där som felet ligger?

Re: Styra servo

Postat: 8 december 2012, 23:22:22
av filipk
Tack så mycket för all hjälp! Nu fungerar det :D

Re: Styra servo

Postat: 9 december 2012, 15:47:10
av Bola
Vad gjorde du för att det skulle fungera?