Shop OBEX P1 Docs P2 Docs Learn Events
Fixed Servo Repeat Object — Parallax Forums

Fixed Servo Repeat Object

RubrChickenRubrChicken Posts: 39
edited 2009-03-22 05:06 in Propeller 1
Travis' Simple Capture and repeat to servo was very jerky, so I decided to fix it. I kind of stabbed in the dark and got it right! Instead of pushing pulsins to servo 32v3, I made them go directly to pulsout and it fixed the jerkiness.


The new code :

NOTE: I took out the original debug code, because 1) I didn't need it for my project, and 2) I have a Mac, which currently doesn't have a serial terminal (that I can get working)



{{
Origional Code: Travis
Modded By: Forrest (rubrchicken)

}}


CON

  _CLKMODE = XTAL1 + PLL16X
  _XINFREQ = 5_000_000

  'Pin on Prop Chip for LED Indicator
  PIN_LED = 15

  'Pins on Prop Chip for Servo Input/Output
  PIN_SERVO_IN = 0
  PIN_SERVO_OUT = 1


var
  long us

OBJ
  'Debug  : "FullDuplexSerial"           'standard from propeller library
  SERVO  : "Servo32v3"                  'standard from propeller library

PUB Begin(in,out) | x,y,z
  us := clkfreq / 1_000_000                  ' Clock cycles for 1 us

  'SERVO.Set(out,1422)
  'SERVO.Start
  y := PULSIN(in,1)

  'SERVO.Set(out,(y * 2))
   PULSOUT(out,y)
  'waitcnt(clkfreq / 4 + cnt) '0.25 seconds


PUB PULSIN (Pin, State) : Duration | usa
   usa :=   clkfreq / 1_000_000                  ' Clock cycles for 1 us

   Duration := PULSIN_Clk(Pin, State) / usa / 2 + 1         ' Use PulsinClk and calc for 2uS increments \

PUB PULSIN_Clk(Pin, State) : Duration

  DIRA[noparse][[/noparse]pin]~
  ctra := 0
  if state == 1
    ctra := (%11010 << 26 ) | (%001 << 23) | (0 << 9) | (PIN) ' set up counter, A level count
  else
    ctra := (%10101 << 26 ) | (%001 << 23) | (0 << 9) | (PIN) ' set up counter, !A level count
  frqa := 1
  waitpne(|< Pin, |< Pin, 0)                         ' Wait for opposite state ready
  phsa:=0                                                  ' Clear count
  waitpeq(|< Pin, |< Pin, 0)                         ' wait for pulse
  waitpne(|< Pin, |< Pin, 0)                         ' Wait for pulse to end
  Duration := phsa                                         ' Return duration as counts
  ctra :=0                                                 ' stop counter

PUB PULSOUT(Pin,Duration)  | clkcycles
{{
   Produces an opposite pulse on the pin for the duration in 2uS increments
   Smallest value is 10 at clkfreq = 80Mhz
   Largest value is around 50 seconds at 80Mhz.
     BS2.Pulsout(500)   ' 1 mS pulse
}}
  ClkCycles := (Duration * us * 2 - 1250) #> 400        ' duration * clk cycles for 2us
                                                           ' - inst. time, min cntMin
  dira[noparse][[/noparse]pin]~~                                              ' Set to output
  !outa[noparse][[/noparse]pin]                                               ' set to opposite state
  waitcnt(clkcycles + cnt)                                 ' wait until clk gets there
  !outa[noparse][[/noparse]pin]


Comments

Sign In or Register to comment.