Arizona Chris
Joined: 20 Dec 2014 Posts: 69 Location: Arizona
|
Servo Position Test Box for Robotics |
Posted: Fri Jan 23, 2015 6:19 am |
|
|
This is a handy tool for your robotics work. It allows you to turn a knob on a pot and adjust the servo pulse output from .5 to 2.5mS, more than enough for the full range of servo movements. The LCD display is a Scott Edwards type and displays four digits of about 10 bit resolution on the pulse width. Very handy since you can use this exact number for a micro controller in a robot or other project to set it in that same spot
I have posted a write up with schematics on my web page as well, for furthur info.
http://www.schursastrophotography.com/PICprojects/Servo011415.html
Code: | //****************************************************************************
//Chris Schur
//Servoboard Knob test box: 12F675
//Date: 1/4/15
//****************************************************************************
/*Description of this Program: This program Will take the push button controlled
servo test board, add a pot and use that instead to vary the pulse output from
.5ms to 2.5ms
*/
//I/O Designations ---------------------------------------------------
// A0 (GPIO0): (An0) POT INPUT
// A1 (GPIO1): (An1) LCD & LED OUT
// A2 (GPIO2): (An2) SERVO PULSE OUTPUT -or- LCD OUT
// A3 (GPIO3): X (can ONLY be input)
// A4 (GPIO4): XTAL OUT (An3)
// A5 (GPIO5): XTAL IN
//--------------------------------------------------------------------
//Include Files:
#include <12F675.h> //Normally chip, math, etc. used is here.
//Directives and Defines:
#device ADC=10 //This directive will only work if put RIGHT HERE first...
#fuses NOPROTECT,NOMCLR
#use delay(crystal=10MHz)
#use fast_io(A)
#use rs232(baud = 9600, xmit=Pin_A1, bits=8, parity=N, INVERT, stream = SERIAL)
//****************************************************************************
//Global Variables:
//******************************************/
//Functions/Subroutines, Prototypes:
//****************************************************************************
//-- Main Program
//****************************************************************************
void main(void) {
// Set TRIS I/O directions, define analog inputs, compartors:
set_tris_A(0b101001); //sets port directions
//(analog inputs digital by default)
setup_adc_ports(sAN0);
setup_adc(ADC_CLOCK_DIV_32);
set_adc_channel(0);
//Initialize variables and Outputs: --------------------------------------
int16 result; //0 - 1023 out of ADC
int16 on_pulse; //servo high pulse width in uS
output_low(PIN_A1); //turn off status led
//----------------------------------------------------------------
//MAIN LOOP:
while (true) {
//First read ADC
result = read_adc();
//calculate pulse width:
on_pulse = (2*result) +500; //for a range of .5mS to 2.5mS
//next send pulse to servo output:
output_high(PIN_A2); //servo out = 1
delay_us(on_pulse); //high time
output_low(PIN_A2); //turn off pulse
delay_ms(4); //space between pulses=20 with lcd serial delays
fputc(12,SERIAL); //Clear screen
delay_ms(1);
fprintf(SERIAL,"%Lu"on_pulse);
delay_ms(1);
fputs(" uS",SERIAL);
delay_ms(2);
}
}
//********* Functions which have prototypes at top of program ****************
|
|
|