|
Tài trợ cho PIC Vietnam |
PIC - Thiết kế và Ứng dụng Ý tưởng cho các sản phẩm sử dụng PIC/dsPIC và các sản phẩm của Microchip |
|
Ðiều Chỉnh | Xếp Bài |
|
10-04-2010, 10:58 AM | #1 |
Đệ tử 2 túi
|
Xử lý nhiễu này thế nào?
Hi,
Mình vừa viết thử một đoạn code để điều khiển bipolar stepper motor sử dụng chip 18F4550. Chương trình chạy rất tốt nếu như được nối với máy tính ở bất kỳ vị trí nào và đường tín hiệu nào. Chỉ cần có đụng một chút gì vào máy tính thì nó chạy, cách ly hoàn toàn với máy tính thì chương trình đứng. Nếu muốn chương trình chạy khi cách ly với máy tính thì phải lấy tay đụng vào một vị trí nào đó trên mạch hoặc cầm ngoài vỏ bọc của dây cấp nguồn (từ biến áp), nếu bỏ tay ra thì chương trình đứng. Mình đã thử thay 3 bộ nguồn khác nhau kết quả vẫn không đổi. Chỗ mình làm kế bên cột anten của mobifone hay viettel gì đó, không biết có ảnh hưởng gì không? Anh em có ai gặp tình trạng như mình và có cách khắc phục thì xin chia sẽ cho mình nhé, xin cảm ơn. Thân ái. |
10-04-2010, 05:49 PM | #2 |
Đệ tử 6 túi
Tham gia ngày: Jul 2007
Bài gửi: 146
: |
thông tin bạn đưa ra quá it để tôi có thể giúp bạn. nếu có thể bạn hãy đưa mạch của mình lên để mọi người có thể dễ dàng giúp bạn hơn.
__________________
mạch nạp - kit phát triển - linh kiện điện tử www.PNLabvn.com |
10-04-2010, 05:50 PM | #3 |
Đệ tử 4 túi
Tham gia ngày: Nov 2008
Bài gửi: 84
: |
tách nguồn của pic với nguồn motor ra là ổn ah, kích mở công sất cách ly luôn đi ah
b.r |
12-04-2010, 09:39 AM | #4 |
Đệ tử 2 túi
|
Thêm cái ảnh cho các bạn dễ hình dung
|
12-04-2010, 04:54 PM | #5 |
Đệ tử 2 túi
|
Hi,
Mình đã thử loại bỏ nhiễu từ testboard bằng cách chạy trên testkit của mình. Mạch chạy ổn định hơn cho dù cách ly với PC tuy nhiên thỉnh thoảng chạy không chính xác. Cái led mình cho chớp theo chu kỳ 2s thỉnh thoảng bị khựng lại trong khi động cơ vẫn quay bình thường. Có nghĩa là bị lỗi cục bộ chổ nào chăng? task chớp led và chạy động cơ đều ngang mức ưu tiên với nhau, tại sao một task lại bị bỏ qua? Vẫn là câu hỏi đầu tiên, tại sao khi tiếp xúc với máy tính thì nhiễu do testboard (điện dung ký sinh) bị loại bỏ? Thân ái. Nhân tiện mình post luôn cái ảnh khi dùng testkit. |
12-04-2010, 09:20 AM | #6 |
Đệ tử 2 túi
|
Hi,
Thực ra stepper nhỏ xíu chẳng hút dòng bao nhiêu nên chẳng cần cách ly nguồn làm gì, nếu nó bị nhiễu thì đã bị khi có tiếp xúc với máy tính rồi. Nhiễu ở đây nó kiểu như làm chậm clock của CPU nên chương trình chạy rất chậm, thỉnh thoảng bị khựng lại (test qua 1 đèn nháy dễ dàng nhận thấy điều này). Nếu cách ly với máy tính mà đưa tay đến gần PIC thì nó lại hoạt động bình thường, nếu bỏ tay ra xa thì lại bị chậm clock lại. Mạch điện thì quá đơn giản nên chẳng cần post lên làm gì, những cách xử lý nhiễu nguồn cơ bản như tụ lọc 100nF tại chân nguồn đều đã được áp dụng. Thân ái. |
12-04-2010, 09:53 AM | #7 |
Đệ tử 2 túi
Tham gia ngày: Mar 2007
Bài gửi: 44
: |
Đo thử và kiểm tra nguồn của biến thế và nguồn ra tại PIC,
Ngắt những gì dính liếu đến cái motor ra để cô lập lại hiện tượng, Nếu vẫn bị vụ chậm clock gì đó thì lỗi ko phải tại cái motor, Tiếp tục thay hai cái tụ cho thạch anh, tốt nhất là hàn hiếc gì đó cho dính chắc ăn, thạch anh có 2-3 ngàn cục mà chắc ko sao đâu, nếu vẫn sợ nhiễu clock gì đó mua luôn con thạch anh bốn chân cấp nguồn nữa là chắc ăn, Còn con PIC thì khỏi thay rồi. Nhưng qua tất cả những việc trên tớ nghĩ bạn chỉ cần lấy mạch ra hàn dây nhợ đàng hoàn là ko bị gì nữa đâu, cấm cấm này dễ bị ảnh hưởng này nọ lắm. |
12-04-2010, 10:58 AM | #8 | |
Trưởng lão PIC bang
|
Trích:
Bạn nên xem lại mạch nguồn, reset, và mạch dao động. Hiện tượng đưa tay đến gần làm cho PIC chạy khác đi đã được đề cập nhiều lần trên diễn đàn này, và nhiều diễn đàn khác. Thân,
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 |
|
12-04-2010, 10:02 AM | #9 |
Đệ tử 2 túi
|
Mã nguồn:
[CODE] #include <18F4550.h> #fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CP UDIV1,VREGEN #use delay(clock=48000000) #use fast_io(all) #priority rtcc, rb #byte FocusStepper = 0x0F81 // Port B #byte TwoWiresStepper = 0x0F84 // Port E // Control data for Wave Drive (1 phase on) mode //BYTE const WaveDrive[4] = {0x01, 0x02, 0x04, 0x08}; // Control data for Full Step Drive (2 phases on) mode //BYTE const FullStepDrive[4] = {0x03, 0x06, 0x0C, 0x09}; // Control data for Full Step Drive using 2 wire //BYTE const FullSetpDrive2Wire[4] = {0x01, 0x03, 0x02, 0x00}; // Control data for Half Step Drive (1 & 2 phases on) mode //BYTE const HalfStepDrive[8] = {0x01, 0x03, 0x02, 0x06, 0x04, 0x0C, 0x08, 0x09}; // Two wires drive BYTE const TwoWiresDrive[4] = {0x00, 0x01, 0x03, 0x02}; // Control data for Bipolar stepper BYTE const BipolarDrive[4] = {0x0A, 0x06, 0x05, 0x09}; #define COUNTER_MAX 1000 #define FOCUS_DELAY_TIMEOUT 20 #define TWO_WIRES_DELAY_TIMEOUT 10 volatile int1 FocusRun, FocusDirection; volatile int1 TwoWiresRun, TwoWiresDirection; #int_rtcc void rtcc_isr(void) { unsigned int16 Counter; static unsigned char focus_step, two_wires_step; static unsigned char focus_delay, two_wires_delay; set_rtcc(-2500); // reset interval 1ms if(Counter++ >= COUNTER_MAX) { Counter = 0; output_toggle(PIN_A0); } if(FocusRun) { if(focus_delay++ >= FOCUS_DELAY_TIMEOUT) { focus_delay = 0; focus_step %= 4; FocusStepper = BipolarDrive[focus_step]; if(FocusDirection) focus_step++; else focus_step--; } } else FocusStepper |= 0x0F; if(TwoWiresRun) { if(two_wires_delay++ >= TWO_WIRES_DELAY_TIMEOUT) { two_wires_delay = 0; two_wires_step %= 4; TwoWiresStepper = TwoWiresDrive[two_wires_step]; if(TwoWiresDirection) two_wires_step++; else two_wires_step--; } } } #int_rb void port_b_isr(void) { static unsigned char last_b; unsigned char changes; changes = last_b ^ input_b(); last_b = input_b(); if (bit_test(changes, 4)&& !bit_test(last_b, 4)) { //b4 went low FocusDirection = !FocusDirection; TwoWiresDirection = !TwoWiresDirection; } if (bit_test(changes, 5)&& !bit_test (last_b, 5)) { //b5 went low FocusRun = !FocusRun; TwoWiresRun = !TwoWiresRun; } delay_ms (20); //debounce } void main(void) { setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); set_rtcc(-2500); // interval 1ms enable_interrupts(INT_RTCC); enable_interrupts(INT_RB); enable_interrupts(GLOBAL); set_tris_a(0x00); set_tris_b(0xF0); // pin 0:3 out, pin 4:7 in set_tris_c(0x00); set_tris_d(0x00); set_tris_e(0x00); FocusRun = 1; FocusDirection = 0; TwoWiresRun = 0; TwoWiresDirection = 0; while(1) { } } [\CODE] |
12-04-2010, 10:06 AM | #10 |
Đệ tử 2 túi
|
Tại sao việc đụng chạm tới máy tính nó có thể xử hết những cái tạo ra nhiễu trên? Nếu giải thích được thì đó chính là nguyên nhân. Nhưng mà mình nghĩ mãi không hiểu được.
|
12-04-2010, 11:57 AM | #11 |
Đệ tử 2 túi
|
Code trên có nhầm một chỗ set Timer0 interval, giá trị chính xác để được tick 1ms là -6000 vì clock lúc này là 48MHz (qua PLL) không còn là 20MHz. Tuy nhiên vấn đề nhiễu không liên quan, tình trạng vẫn như cũ.
|
12-04-2010, 05:48 PM | #12 |
Đệ tử 6 túi
Tham gia ngày: Jul 2007
Bài gửi: 146
: |
việc bạn không cách ly đã là một vấn đề khá lớn để gây ra các bất ổn trên mạch của bạn. bạn cung nên xem lại phần reset mạch vì phần này cũng có thể dẫn tới việc chip chạy chập chờn
__________________
mạch nạp - kit phát triển - linh kiện điện tử www.PNLabvn.com |
03-05-2010, 12:53 AM | #13 |
Đệ tử 2 túi
|
Có lẽ nào chân Reset lại lợi hại đến thế? Chân Reset của PIC tui lại nối với Vpp của ICD2 nên nó chỉ có thêm 1 điện trở 10K nối với Vcc, cái tụ 10uF đã bị loại bỏ (vì có cái tụ này thì không program chip được).
|
03-05-2010, 08:59 PM | #14 | |
...Damned...
Tham gia ngày: Apr 2006
Nơi Cư Ngụ: Hồ Chí Minh
Bài gửi: 522
: |
Trích:
|
|
03-05-2010, 09:34 PM | #15 |
Banned
Tham gia ngày: Nov 2006
Bài gửi: 107
: |
Có 2 con tụ nối với 2 chân của thạch anh có giá thị từ 20p-33p, bạn nên sử dụng tụ 33p, nó sẽ giúp mạch của bạn chạy ổn định hơn, tuy nhiên khởi động thì chậm hơn khi sử dụng tụ có giá nhỏ hơn.
|
|
|