( ADC_stepper)
( R J Wilks  March 2014)
( Control of stepper by potentiometer via ADC)

( If ADC<512 go A/clock by 512-v pulses)

0 VARIABLE last_value  ( difference from 'zero' of 512)

DECIMAL

: adc_wait   ( n csec .... )  ( governs speed)
   0 TIME=
   BEGIN DUP TIME < UNTIL 
   DROP ; 

: setup_both   ( ...)
    init_motors vvfast ADCsetup_general 1 7 GPWrMode  DECIMAL ;

: ADCstepper   ( ...)
   read_adc              ( v.....)  
   DUP 512 -             ( v,v-512....)
   DUP last_value @ -    ( v,v-512,dv...)     
   DUP 0< 0=             ( v,v-512,dv,flg...)
   IF                    ( v,v-512,dv...)
    ABS 10 /             ( scaling factor of 10 - arbitrary)
    DUP 0 > IF nhc ELSE DROP ENDIF   ( v,v-512...)
   ELSE
    ABS 10 / 
    DUP 0 > IF nhac ELSE DROP ENDIF  ( v,v-512...)
   ENDIF
   last_value ! DROP
;

: ADC_servo   ( ...)
   setup_both
   read_adc DROP 5 adc_wait
   250 0 DO
    ADCstepper 5 adc_wait
   LOOP ;


DECIMAL
( vary speed)
: calc_dT
   100000 SWAP 150 * - dT ! ;

: ADC_speed
   setup_both fast
   read_adc DROP
   1000 0 DO
     read_adc  ( DUP ." v= " .)
     DUP 512 - ABS calc_dT     ( ." dT= " dT ?)
     DUP 502 522 twixt 0=
     IF
      512 > IF 
             half_step_clock
            ELSE 
             half_step_anticlock
            ENDIF
     ELSE   25 adc_wait
     ENDIF
   LOOP ;
