PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   PIC - Thiết kế và Ứng dụng (http://www.picvietnam.com/forum/forumdisplay.php?f=23)
-   -   Xử lý nhiễu này thế nào? (http://www.picvietnam.com/forum/showthread.php?t=6113)

Hard 10-04-2010 10:58 AM

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.

hopeman 10-04-2010 05:49 PM

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.

nhatson.elec 10-04-2010 05:50 PM

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

Hard 12-04-2010 09:20 AM

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.

Hard 12-04-2010 09:39 AM

1 Attachment(s)
Thêm cái ảnh cho các bạn dễ hình dung

ngocthanh07 12-04-2010 09:53 AM

Đ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.

Hard 12-04-2010 10:02 AM

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]

Hard 12-04-2010 10:06 AM

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.

namqn 12-04-2010 10:58 AM

Trích:

Nguyên văn bởi Hard (Post 35024)
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.

Test board tại VN có chất lượng không ổn định. Các mạch có xung clock cỡ 10 MHz trở lên không nên thử trên test board (có thể vẫn chạy chứ không nhất thiết là sẽ không chạy). Với loại mạch mà bạn đang thử, từ lâu rồi tôi không tin tưởng vào test board nữa.

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,

Hard 12-04-2010 11:57 AM

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ũ.

Hard 12-04-2010 04:54 PM

1 Attachment(s)
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.

hopeman 12-04-2010 05:48 PM

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

Hard 03-05-2010 12:53 AM

Trích:

Nguyên văn bởi hopeman (Post 35050)
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

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).

bien_van_khat 03-05-2010 08:59 PM

Trích:

Nguyên văn bởi Hard (Post 35630)
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).

Bạn nên kiếm cái oscilloscope đo để coi lỗi do phần nào!

Trích:

Nguyên văn bởi namqn (Post 35035)
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.


herrtien 03-05-2010 09:34 PM

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.


Múi giờ GMT. Hiện tại là 11:27 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam