In the previous example, I show a simple method to rotate the angle of a servo motor using delay() function in CCS PICC.
Controlling a servo motor with PIC16F84A |
In this example I use three potentiometers to adjust the three corresponding servo motor simultaneously.
A simple pot can generate variable analog voltage output, fed to the MCU analog input. |
The overall process is to convert the 8-bit analog value reading from pot to PIC16F716. Then converting the 8-bit analog data to time value in microseconds.
The 8-bit data have 256 value. This 256 value map the 1000 microsecond high time.
The PIC16F716 CPU clocks at 20 Mhz, giving a precise timing for delay() function. Three pots connect to RA0, RA1 and RA3. Three servo output connect to RB0, RB1 and RB2. |
Source code is written in CCS PICC, and could be download here:
#include<16F716.h>
#fuses HS
#use delay(clock=20M)
void main(){
int32 adcResult_1;
int32 adcResult_2;
int32 adcResult_3;
int32 _h_1=0,_l_1=0;
int32 _h_2=0,_l_2=0;
int32 _h_3=0,_l_3=0;
output_B(0x00);
set_tris_a(0xFF);
set_tris_b(0x00);
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(AN0_AN1_AN3);
delay_ms(2000);
while(1){
//Servo 1
set_adc_channel(0);
adcResult_1=read_adc();
while(!adc_done());
_h_1=1000+((1000*adcResult_1)/255);
_l_1=20000-_h_1;
output_high(pin_b0);
delay_us(_h_1);
output_low(pin_b0);
delay_us(_l_1);
//Servo 2
set_adc_channel(1);
adcResult_2=read_adc();
while(!adc_done());
_h_2=1000+((1000*adcResult_2)/255);
_l_2=20000-_h_2;
output_high(pin_b1);
delay_us(_h_2);
output_low(pin_b1);
delay_us(_l_2);
//Servo 3
set_adc_channel(3);
adcResult_3=read_adc();
while(!adc_done());
_h_3=1000+((1000*adcResult_3)/255);
_l_3=20000-_h_3;
output_high(pin_b2);
delay_us(_h_3);
output_low(pin_b2);
delay_us(_l_3);
}
}
No comments:
Post a Comment