Styra servo

Robot, CNC, Pneumatik, Hydraulik, mm
filipk
Inlägg: 5
Blev medlem: 2 december 2012, 13:50:51
Ort: Växjö

Styra servo

Inlägg 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
Användarvisningsbild
Icecap
Inlägg: 26645
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Styra servo

Inlägg 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.
filipk
Inlägg: 5
Blev medlem: 2 december 2012, 13:50:51
Ort: Växjö

Re: Styra servo

Inlägg 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.
Användarvisningsbild
Icecap
Inlägg: 26645
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Styra servo

Inlägg av Icecap »

Om du har angivit kristallfrekvensen korrekt ska det väl vara ganska pålitligt.
janbjorn
Inlägg: 271
Blev medlem: 3 december 2008, 16:22:39
Ort: Trollhättan

Re: Styra servo

Inlägg 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.
ToPNoTCH
Inlägg: 5147
Blev medlem: 21 december 2009, 17:59:48

Re: Styra servo

Inlägg 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.
Användarvisningsbild
ylle
Inlägg: 669
Blev medlem: 5 oktober 2006, 20:18:27
Ort: örebro

Re: Styra servo

Inlägg 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
nibl
Inlägg: 149
Blev medlem: 23 november 2012, 13:19:33

Re: Styra servo

Inlägg 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
Användarvisningsbild
Icecap
Inlägg: 26645
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Styra servo

Inlägg 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);
filipk
Inlägg: 5
Blev medlem: 2 december 2012, 13:50:51
Ort: Växjö

Re: Styra servo

Inlägg 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);

}
}
Användarvisningsbild
ylle
Inlägg: 669
Blev medlem: 5 oktober 2006, 20:18:27
Ort: örebro

Re: Styra servo

Inlägg 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.
Användarvisningsbild
Icecap
Inlägg: 26645
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Styra servo

Inlägg 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?
nibl
Inlägg: 149
Blev medlem: 23 november 2012, 13:19:33

Re: Styra servo

Inlägg av nibl »

Har du testat servot så det inte är där som felet ligger?
filipk
Inlägg: 5
Blev medlem: 2 december 2012, 13:50:51
Ort: Växjö

Re: Styra servo

Inlägg av filipk »

Tack så mycket för all hjälp! Nu fungerar det :D
Bola
Inlägg: 133
Blev medlem: 16 november 2009, 10:28:41
Ort: Göteborg

Re: Styra servo

Inlägg av Bola »

Vad gjorde du för att det skulle fungera?
Skriv svar