RC-servo?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
JimmyAndersson
Inlägg: 26577
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Jag tycker du gör helt rätt i det fallet. Då tvingas man tänka lite själv och lär sig betydligt mer än om man varit bekväm och förväntat sig att få hela lösningen serverad.

Min elektronik/fysik/data-lärare i högstadiet gjorde likadant.
En del elever tyckte han var den jobbigaste läraren och andra (bl.a jag) tyckte raka motsatsen. Gissa vilka som lärde sig mest? :) Enda nackdelen var att han aldrig gav någon en 5a (högsta betyg). Lite underligt med tanke på att jag alltid hade alla rätt på läxförhören i fysik. Det som möjligen skulle kunna dra ner betyget var väl att jag inte pratade mer än nödvändigt, men man var ju inte direkt där för att prata...

Oj, nu hamnade jag lite off-topic. :)
Användarvisningsbild
oJsan
EF Sponsor
Inlägg: 1541
Blev medlem: 11 november 2005, 21:36:51
Ort: Umeå
Kontakt:

Inlägg av oJsan »

JimmyAndersson skrev:För att servot ska stå stilla så är det absolut lättaste att helt enkelt sluta skicka pulser. Fungerade iallafall fint på min kamerarobot.
Men kom ihåg att servot då inte "håller" sitt läge utan med viss kraft kan vridast manuellt.. (bra att tänka på i vissa tillämpningar)

Sodjan:
Ok, som man frågar får man svar... kan hålla med till viss del, men man borde ju kunna höja sig lite genom att i allafall _försöka_ ge ett svar.
Men men.. whatever...
sebbe
Inlägg: 120
Blev medlem: 11 februari 2004, 18:18:47

Inlägg av sebbe »

hoppas att det går bra att låna din tråd litegrann
men om man ska skicka en puls på 1.5ms var 20 ms skulle det gå att göra det så här då i mikrobasic

Kod: Markera allt

program ServoSimple

Main:

TRISB.0 = 0
PORTB = 0

start:

  SetBit(PORTB,0)
  Delay_ms(1)
  Delay_us(500)
  ClearBit(PORTB,0)
  Delay_ms(20)
  goto start

End.
det kanske inte är så snygg men funkar det?

mvh
sebbe
Användarvisningsbild
bengt-re
EF Sponsor
Inlägg: 4829
Blev medlem: 4 april 2005, 16:18:59
Skype: bengt-re
Ort: Söder om söder
Kontakt:

Inlägg av bengt-re »

Här är ett exempel på en 12F675, styr läget med två potar och välj läge med omkopplare.



list p=12F675 ; list directive to define processor
#include <p12f675.inc> ; processor specific variable definitions


__CONFIG _CP_OFF & _WDT_OFF & _MCLRE_ON & _INTRC_OSC_NOCLKOUT

temp EQU 0x20
x EQU 0x21
y EQU 0x22
i EQU 0x23
pot1 EQU 0x24
pot2 EQU 0x25
pot3 EQU 0x26
bas EQU 0x27
stat EQU 0x28
;*************************************
org 0x3FF
org 0x00
banksel TRISIO ;Select RB1
Call 0x3ff
movwf OSCCAL ;Calibrate osc
movlw b'00101111'
movwf TRISIO ;GPIO,4 output, the rest inputs
movlw b'00100000'
movwf WPU ;Mask WPU on GP1
bcf OPTION_REG,7
banksel GPIO ;Turn on WPU
movlw b'11111111'
movwf CMCON ;Turn off comparator
banksel ADCON0
movlw b'00000001'
movwf ADCON0 ;Turn on AD
banksel ANSEL
movlw b'00010111'
movwf ANSEL ;Setup AD AN0,AN1,AN2 to analog inputs
banksel GPIO
movlw b'00100000'
andwf GPIO
movwf stat
goto MAIN

; =========================================
MAIN
movlw 0x14
movwf i
clrf temp
Call longwait
Call getPot
banksel GPIO
movlw 0x90
movwf bas
btfss GPIO,5
call pos1
btfsc GPIO,5
call pos2
call wait
goto MAIN
; =========================================
longwait
decfsz temp
goto longwait
decfsz i
goto longwait
return
; =========================================
pos1
banksel GPIO
bsf GPIO,4
baswait1
decfsz bas,1
goto baswait1
delay1
nop
decfsz pot1,1
goto delay1
bcf GPIO,4
RETURN
; =========================================
pos2
banksel GPIO
bsf GPIO,4
baswait2
decfsz bas,1
goto baswait2
delay2
nop
decfsz pot2,1
goto delay2
bcf GPIO,4
RETURN
; =========================================
wait
nop
decfsz i,1
goto wait
RETURN
; =========================================
getPot
banksel ADCON0
movlw b'00000001'
movwf ADCON0 ;Start conversion on AN0
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
bsf ADCON0,1
getAN0
btfsc ADCON0,1
goto getAN0
banksel ADRESH
movfw ADRESH
movwf pot1 ;Put result in pot1
banksel ADCON0
movlw b'00000101'
movwf ADCON0 ;Start conversion on AN1
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
bsf ADCON0,1
getAN1
btfsc ADCON0,1
goto getAN1
banksel ADRESH
movfw ADRESH
movwf pot2 ;Put result in pot1
banksel ADCON0
movlw b'00001001'
movwf ADCON0 ;Start conversion on AN2
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
bsf ADCON0,1
getAN2
btfsc ADCON0,1
goto getAN2
banksel ADRESH
movfw ADRESH
movwf pot3 ;Put result in pot1
retlw 0x23
END
Senast redigerad av bengt-re 8 januari 2007, 21:03:39, redigerad totalt 1 gång.
Användarvisningsbild
JimmyAndersson
Inlägg: 26577
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

bengt-re: Trevligt med lite asm-kod så man får lite fler idéer. :)

sebbe: Ungefär sådär gjorde jag med min fläktstyrning till servern. Fungerar fortfarande felfritt, så man *kan* göra så, men det finns noggrannare sätt. Timer t.ex.

Fast du behöver inte ha två delayrader (1ms + 500µs) efter varandra. Det fungerar fint med enbart:
Delay_us(1500)
MikroBasic har lite problem med tider som är ca 1-40ms när man kör med delay_ms(). Då är det bättre att använda delay_us() istället.
sodjan
EF Sponsor
Inlägg: 43249
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

En detalj, men ändå... :-)

Så som bengt-re's kod ser ut *här* fungerar den inte.
Eftersom code-taggarna inte verkar vara använda, så ligger
allt i pos 1 på varje rad och MPASM kommer att ge en massa
varningar/errors. Det blir också lite svårläst.

Äh, va f-n, när vi ändå är på gång.... :-)

> "bcf OPTION_REG,7"

"bcf OPTION_REG, NOT_GPPU"
är bättre så vet man vad bit 7 är utan att slå upp det.
"NOT_GPPU" är definierad i p12f675.inc.

> retlw 0x23

Varför inte bara "return" ?
Return värdet h'23' används ju i alla fall inte i main. Betyder h'23' något speciellt ?

Sebbes kodexempel fungerar säkert/kanske, men problemet är att det
är väldigt sällan som koden *bara* ska göra det där, och då kommer
det att bli problem. Så pass långa hårdkodade delays är sällan
riktigt bra. Men som en snabb test, visst.
Användarvisningsbild
bengt-re
EF Sponsor
Inlägg: 4829
Blev medlem: 4 april 2005, 16:18:59
Skype: bengt-re
Ort: Söder om söder
Kontakt:

Inlägg av bengt-re »

Det blev fult när jag copy/pastade, det ligger i olika tablägen i filen...

retlw var en rest ifrån ett tidigare program och fyller aboult ingen funktion nu... ;)

Jo, har nog en del gamla synder i koden, det är lite fånigt att brhöva slå upp databladet för att veta vilken bit som gör vad...

Och när vi ändå är inne på "osnygghet" så är ju alla dessa nop ar lite fåniga för att få acq-time till A/D, men äää.. fann ju gott om minne kvar ;)
sodjan
EF Sponsor
Inlägg: 43249
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> så är ju alla dessa nop ar lite fåniga

Tja, de fyller ju en funktion... :-)

Men visst, 10 st "NOP" kan ersättas av 5 st "GOTO $+1"... :-)
D.v.s 5x2 cykler istället för 10x1 cykler. Och halva programminnet...
Användarvisningsbild
bengt-re
EF Sponsor
Inlägg: 4829
Blev medlem: 4 april 2005, 16:18:59
Skype: bengt-re
Ort: Söder om söder
Kontakt:

Inlägg av bengt-re »

Yepp eller kanske en decsz runda.... men, men.... ;)

Jo, antalet är dock väl valt, acq-time är kortare än enligt databladet, men då jag bara använder 8-bitar så räcker 10us för att de 8 MSB skall vara på rätt nivå.
Skriv svar