PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Cơ bản về vi điều khiển và PIC

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 19-05-2009, 02:04 PM   #16
lequocbao
Đệ tử 6 túi
 
lequocbao's Avatar
 
Tham gia ngày: Oct 2008
Nơi Cư Ngụ: HCM
Bài gửi: 137
:
Độ phân giải của trục là 1xung/vòng thì làm sao mà có thể đo được phần lẽ <1 bây giờ bạn?
ý tưởng:
-khi rc5==0 & flag ==0 --> enable timer & flag ==1 & time++.
-khi rc5==0 again --> if (flag==1) then disable timer.
{
vận tốc=1/time;
time=0;
flag=0;
}

ngoài ra chỉ còn có cách là bạn tìm cách tăng độ phân giải của trục lên thì mới được.
vậy bạn cho mình hỏi là con số 18200 ở trên là bạn tính như thế nào để ra đc 5s?bạn thử thay thằng ku thạch anh khác thử xem sao nha!
__________________
A&A

thay đổi nội dung bởi: lequocbao, 19-05-2009 lúc 02:52 PM.
lequocbao vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 19-05-2009, 02:53 PM   #17
numb2008
Nhập môn đệ tử
 
Tham gia ngày: Aug 2008
Bài gửi: 10
:
Mình nói luôn cái đồ án mình đang làm, mong các bạn ai có thể chỉ giúp mình thêm vì thật sự là mình không biết hỏi ai, cứ mò mẫm làm thôi.Thầy hướng dẫn thì cũng không hỏi được nhiều mà thời gian thì cũng sắp hết.
Đồ án của mình là "tìm hiểu lý thuyết nâng bằng từ trường và đề xuất ứng dụng"
Phần 1 của đồ án mình đã làm xong, đó là mình điều khiển 1 nam châm điện hút một vật "treo" lơ lửng.Để "treo " vật lơ lửng thì mình đã làm tàm tạm được rồi.Các vật treo dc này phải có gắn 1 nam châm vĩnh cữu để nam châm điện hút.
Phần 2 của đồ án mình đang thực hiện đó là mình thiết kế 1 trục đo gió không có ma sát(do treo lơ lửng cái trục từ phần 1).Và mình dùng 1 mạch để đo tốc độ cái trục này
Hai phần trên mình phải dùng 2 mạch khác nhau,vì mình thấy khả năng tính toán của con pic không đáp ứng nổi cho cả 2 công việc.Tuy nhiên 2 mạch này có khác nhau ở chỗ thạch anh sử dụng là 4mhz và 20 mhz(cả 2 dùng pic 16f877a). Mạch 20mhz bao gồm các port đưa ra và 3 led bảy đoạn hiển thị. Mạch thứ 2 dùng thạch anh 4mhz và có cổng com giao tiếp với máy tính.
Ban đầu mình làm phần 1 trên mạch 20mhz, tuy nhiên sau đó có mình thấy nó không làm thêm được việc gì ngoài việc "treo " vật, vì nếu thêm vào nó sẽ không chính xác và mình làm trễ chương trình.
Do đó mình sử dụng thêm 1 mạch thứ 2 với mục đích đọc xung và tính vận tốc.Tuy nhiên do mạch này sử dụng thạch anh 4mhz và không có hiển thị led cho nên mình hoán chuyển nhiệm vụ cho nó.Tuy nhiên khi cho nó thực hiện điều khiển " treo " vật thì nó chạy không được, mặc dù trong chương trình mình đã chỉnh sửa lại,tất nhiên phần cứng thì phải cắm các chân tương ứng như khi dùng mạch 20mz.Sai ở đây là nó đáp ứng chậm hơn mạch 20mhz cho nên không hút nhả nam châm kịp(phương pháp điều khiển hút nhả là điều khiển pwm nam châm).Như vậy cho mình hỏi:
-Có cách nào cho mạch 4mhz chạy tốc độ như mạch 20mhz không? Nếu sửa lại phần cứng thì phải thay tụ bao nhiêu.(Mạch 20mhz dùng tụ 22pf , mạch 4mhz dùng tụ 33pf).

-Mình kiểm tra lại,giá trị timer như mình tính trên khi dùng cho mỗi mạch là khác nhau.với giá trị 18200(mình tính chưa đúng như cũng gần con số đó, kiểm tra bằng đồng hồ bấm giây) thì mạch 4mhz delay 10s, mạch 20mhz delay 5s.
cái đề tài này mình không biết ai đã làm chưa nên cũng không biết hỏi ai, tuy nhiên theo mình thì cũng áp dụng điều khiển hồi tiếp và các kiến thức điều khiển cơ bản,và mình cũng làm được ở một mức nào đó. Chỉ còn một số vấn đề như thế các bạn góp ý giúp mình với.
numb2008 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 20-05-2009, 12:50 PM   #18
lequocbao
Đệ tử 6 túi
 
lequocbao's Avatar
 
Tham gia ngày: Oct 2008
Nơi Cư Ngụ: HCM
Bài gửi: 137
:
phần đo tốc độ bạn tham khảo lại post #16 ,còn phần thạch anh thì mình mù tịt, chắc nhờ pác namqn giúp hộ một tay!
__________________
A&A

thay đổi nội dung bởi: lequocbao, 20-05-2009 lúc 12:55 PM.
lequocbao vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 21-05-2009, 11:13 PM   #19
numb2008
Nhập môn đệ tử
 
Tham gia ngày: Aug 2008
Bài gửi: 10
:
Mình vẫn chưa giả qứyt6 được chỗ đếm xung, đó là do trục quay chậm( khoảng >0.5s/vòng) nên xảy ra trường hợp là khi có tín hiệu 0 tồn tại khoảng vài trăm ms(có lẽ vậy) nên số xung đếm không đúng, vị dụ mình xuất ra led giá trị xung đếm được, thì khi có tín hiệu xung thì giá trị xuất ra rất lớn.Mình muốn viết sao cho khi giá trị xung xuống 0 thì chỉ tăng biến đếm lên 1 giá trị, nhưng vẫn chưa ổn.Mình đã dùng timer0 ở chế độ counter, timer1 định thì nhưng giá trị biến đếm vẫn tăng liên tục.
Chương trình sau mình viết để hiển thị giá trị của biến đếm của timer0 sau mỗi 5s, tuy nhiên giá trị hiển thị lớn hơn giá trị thực rất nhiều, không hiểu tại sao.Mình dùng chân RA4 để đọc xung :


#include <16F877A.h>
#priority EXT,TIMER1,timer0
#fuses NOWDT,PUT,XT,NOPROTECT,NOLVP,HS
#device *=16
#use delay(clock=20000000)
#use fast_io(b)
#use fast_io(d)
#byte porta=0x05
#byte portb=0x06
#byte portd=0x08


unsigned char led1,led2,led3;
int16 count=0 ;
int16 int_count1;
int32 x=0;
int32 sovong;
void convert_bcd(int32 x);

#define INTS_PER_SECOND1 95 //ngat sau moi 5s
#int_timer0
void interrupt_timer0()
{
++count;

}
#INT_TIMER1 // Chuong trinh ngat Timer 1
void Timer11_isr() // Ham duoc goi khi TImer1 tran (65535->0)
{ // Xap xi 19 lan / giay
if(--int_count1==0)
{
int_count1 = INTS_PER_SECOND1;
sovong = get_timer0();
count = 0;
set_timer0(0);
}

}
void init()
{
int_count1 = INTS_PER_SECOND1;//19 lan 1 giay
setup_timer_0 (RTCC_DIV_1|RTCC_EXT_H_TO_L); // Timer0 is Counter
set_timer0(0);
set_timer1(0);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_4); // Timer1 is Timer
enable_interrupts(INT_RTCC);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
count = 0;
}

void convert_bcd(int32 x)
{
led1 = x / 100;
x = x %100;
led2 = x / 10;
led3 = x % 10;

{
char maled7[] = {0x7e,0x18,0xec,0xe6,0xd2,0xb6,0xbe,0x62,0xfe,0xf6 };


portb = (maled7[led3]); output_low(PIN_D5); delay_us(90); output_high(pin_D5);
portb = (maled7[led2]); output_low(PIN_D6); delay_us(90); output_high(pin_D6);
portb = (maled7[led1]); output_low(PIN_D7); delay_us(90); output_high(pin_D7);
}
}

void main(void)
{
init();
set_tris_a(0xFf);
set_tris_b(0x00);
set_tris_d(0x00);

// khoi tao gia tri
sovong=0;
while(true)
{
x=sovong;
convert_bcd(x);


}}
numb2008 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 22-05-2009, 10:14 AM   #20
hopeman
Đệ tử 6 túi
 
hopeman's Avatar
 
Tham gia ngày: Jul 2007
Bài gửi: 146
:
TÔi nghĩ là bạn vẫn bị nhầm khá căn bản, nếu đếm ko ai lại đếm bằng mức cả mà phải đếm bằng chuyển mức (tức là đếm số lần chuyển mức) tôi giả định như sau :

#define dau_vao_truc input(pin_c5)
int1 luu_trang_thai=0;
int16 so_vong_quay=0;
#int_timer0
void interrupt_timer0()
{
if(dau_vao_truc!=luu_trang_thai)
{ luu_trang_thai=dau_vao_tru;
if(luu_trang_thai==0)so_vong_quay++;
}
}

doan code tren se tang so dem vong quay len 1 moi khi co chuyen muc tu 1 ve 0; ban thu suy nghi them xem sao nhe.
__________________
mạch nạp - kit phát triển - linh kiện điện tử www.PNLabvn.com
hopeman vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 03:57 AM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam