|
|
Servo
Tester-1 แบบกดปุ่ม
Software PWM |
|
|
|
|
|
วัตถุประสงค์ |
|
|
-เพื่อศึกษาการทำงานแบบ
software PWM โดยใช้ Timer1(สามารถเพิ่ม Servo ได้อีกหลายตัว) |
|
|
-เพื่อศึกษาการทำงานเบื้องต้นของ
Servo |
|
|
|
|
|
|
|
|
|
|
|
การทดสอบการทำงานของ
Servo แบบกดปุ่ม |
|
|
|
|
|
|
|
|
|
|
|
#case
#include <16F648A.h>
//#include <16F628.h>
//#include <16F88.h>
#use delay(clock=4000000)
#fuses XT,PUT,NOBROWNOUT,NOWDT,NOPROTECT,NOLVP
//Gobal Variable
int nPluse=0;
long PWMPeriod1=1392;
#define MAX_PERIOD 20000
#define PWMOUT0 PIN_B3
//Interrupt Timer1
#int_timer1
void TIMER1_isr()
{
switch(nPluse)
{
case 0:
set_timer1(65536-PWMPeriod1);
output_high(PWMOUT0);
nPluse++;
break;
case 1:// 20ms
output_low(PWMOUT0);
set_timer1(65536-(MAX_PERIOD-PWMPeriod1));
nPluse=0;
break;
}
}
//*** mian ***
void main(void)
{
delay_ms(200);
setup_comparator(NC_NC_NC_NC); //Input Digital
set_tris_a(0B00111111);
set_tris_b(0B00000010);
enable_interrupts(GLOBAL);
enable_interrupts(INT_TIMER1);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
while(1)
{
//Turn left
if(input(PIN_A2)==0)
{
delay_ms(100);
if(input(PIN_A2)==0)
{
while(input(PIN_A2)==0);
PWMPeriod1=1000;
}
}
//Center
if(input(PIN_A3)==0)
{
delay_ms(100);
if(input(PIN_A3)==0)
{
while(input(PIN_A3)==0);
PWMPeriod1=1392;
}
}
//Turn right
if(input(PIN_A4)==0)
{
delay_ms(100);
if(input(PIN_A4)==0)
{
while(input(PIN_A4)==0);
PWMPeriod1=1800;
}
}
}
}
|
|
|
|
|
|
|
ผลการทดลอง |
|
|
-เมื่อเริ่มจ่ายไฟให้กับวงจร
Servo จะหมุนมาอยู่ที่ต่ำแหน่งกลาง |
|
|
- เมื่อกดปุ่ม
1 Servo จะหมุนไปทางซ้าย |
|
|
- เมื่อกดปุ่ม
2 Servo จะหมุนกลับมาที่ต่ำแหน่งกลาง |
|
|
- เมื่อกดปุ่ม
3 Servo จะหมุนไปทางขวา |
|
|
|
|
|
NOTE: |
|
|
- Servo บางรุ่นอาจจะหมุ่นกลับด้าน
(ซ้ายเป็นขวา-ขวาเป็นซ้าย) |
|
|
- เมื่อ Servo
ทำงานจะดึงกระแสไฟมากอาจทำให้ MCU Reset ได้ ดังนั้น C 0.1,C100U ควรต่อไว้ใกล้ๆ
ขา VDD ของ MCU |
|
|
- หาก Servo ขนาดใหญ่
จะต้องแยกแหล่งจ่ายไฟ +5V ไว้ใช้กับ Servo อย่างเดียว ไม่ควรใช้ร่วมกับ MCU |
|
|
|
|
|
Servo
Tester-2 แบบปรับ VR |
|
|
ศมิทธิ์
เอมสมบัติ |
|
|