PDA

View Full Version : Xin hướng dẫn chi tiết cách điều khiển servo bằng 16f877a


lvdinh_tvtsth
02-10-2012, 10:05 PM
Chào mọi người, em có tìm trong diễn đàn thấy nhiều bài nói về PWM nhưng đọc khó hiểu quá, em lập topic xin được hướng dẫn chi tiết cách điều khiển 1 servo bằng PWM ạ. Cụ thể em cần biết những điều sau:
--cách nối servo như thế nào? (Nó có 3 dây (đỏ-đen-vàng), các dây đó làm việc gì? Dây nào nối với chân số mấy của PIC?)
--hàm điều khiển nó trong PIC cụ thể và ví dụ đi liền cách nối dây.
--em muốn nó quay theo 1 góc theo ý muốn thì phải làm thế nào? Góc quay tối đa mà nó thực hiện được là bao nhiêu?
----------------------
Rất mong được mọi người giúp ạ. Em xin cám ơn!

lvdinh_tvtsth
02-10-2012, 10:07 PM
À nếu bác nào có bài này rồi thì cho em xin link ạ, em tìm google mãi không ra.

lvdinh_tvtsth
03-10-2012, 12:45 PM
Cuối cùng cũng mày mò ra cách dùng ngắt TIMER0. Trong đoạn code này chỉ cần thay đổi thông số Center là nó sẽ quay theo những góc khác nhau. Ở hàm Main có thay đổi Center bằng cách gán lần lượt với 3 biến. Nó sẽ quay trái-giữa-phải-giữa-...

Cách nối dây rất đơn giản, chỉ cần nối dây đỏ của Servo với (+) nguồn, dây đen với (-) nguồn, còn dây vàng nối với chân RA0 của PIC. Nếu bạn muốn nối dây vàng với chân khác của PIC thì chỉ cần thay đổi trong hàm ngắt và thiết lập chân đó thành chân xuất là ok.


#include <16F877A.H>
#include <def_877a.h>
#device *=16 ADC=8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, BROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
#define MAX_VALUE 200

#define Right MAX_VALUE-35 //quay phai -23

#define Center MAX_VALUE-17 // quay trai -17

#define Left MAX_VALUE-1 //o giua -11

unsigned char pulse_max=0;
unsigned char pulse_top=0;
unsigned char top_value=0;
#INT_TIMER0
void interrupt_timer0()
{
set_timer0(56);
pulse_max++;
pulse_top++;
if (pulse_max >= MAX_VALUE)
{
pulse_max=0;
pulse_top=0;
RA0=0; // Turn off RC2
}
if (pulse_top == top_value)
{
RA0=1; // Turn On RC2
}
}
/* TIMER0 period = [(TMR0 + 1)] x 4 x Tosc x (TIMER0 prescaler value) second
Init TIMER0: Period: Fosc/4 x Prescaler x TMR0
*/
void main()
{
trisa=0x00;
trisd=0xff;
portC = 0x00;
//trisd=0x00;
//portd=0;
top_value = Center;

enable_interrupts(global);
enable_interrupts(int_timer0);

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);

set_timer0(156);

top_value=Center;/*
while(1)
{
switch(portd){
case 1: top_value=Right; delay_ms(100); top_value=Center; break;
case 2: top_value=Left; delay_ms(100); top_value=Center; break;
case 4: top_value=Center; break;
default: break;
}*/
while(1){
top_value=Right; delay_ms(1000);
top_value=Center; delay_ms(1000);
top_value=Left; delay_ms(1000);
top_value=Center; delay_ms(1000);
}

}

toancdt
03-10-2012, 09:09 PM
bạn này tự biên tự diễn hay nhỉ :D

lvdinh_tvtsth
04-10-2012, 05:37 PM
Sao trong diễn đàn thấy nhiều người đặt câu hỏi mà chả có ai trả lời. Mình gặp khó khăn và tự mày mò trên mạng ra được nên muốn những ai đi sau tìm được nhanh chóng hơn.

congbinh
04-10-2012, 07:37 PM
ae ơi giúp mình về đồng hồ số sử dụng pic 16F877A
AE ƠI ! hiện tại mình đang làm một đề tài về pic 16F877A. cụ thê là hiện tại mình đang làm một đề tài đồng hồ số hiển thị giờ phút giây va ngày tháng năm phải sử dụng PIC 16F877A mà tài liệu mình tìm kiếm chưa đầy đủ lắm do đó mình k thể thực hiện đc đề tài.cho mình hỏi có ae nào đã làm qua loại nay chưa xin chỉ giáo giúp mình với. hoặc ae nào có tư liệu cho mình xin với hiện tại minh rất cần mình rất mong đc sự giúp đỡ nhiệt tình từ ae rất mong và rất mong.thank ae nhìu lắm.
phamcongbinh.binh@yahoo.com
0908962269 bình