PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Thực hành (http://www.picvietnam.com/forum/forumdisplay.php?f=20)
-   -   Tìm người làm bài tập thực hành: Bộ ĐK PID động cơ DC (http://www.picvietnam.com/forum/showthread.php?t=485)

namqn 18-09-2006 07:24 PM

Trích:

Nguyên văn bởi bluepine (Post 4930)
anh Namqn ơi, có thể giải thích rõ hơn vai trò của chân sens trong mạch cầu được không ? ta đã dùng encoder để hồi tiếp tốc độ động cơ rồi thì thêm chân sens có ý nghĩa gì vậy anh. Em đọc trong datasheet của cầu LM18200 thì thấy nó nói rằng độ nhạy là 377uA/1A, để tối ưu độ chính xác và tuyến tính thì phải chọn điện trở giữa chân sens này với mas sao cho điện áp giới hạn giữa chân sens này với mas là 5V, và trong thiết kế đó thì nó chọn điện trở 2K. em mắc thử thì thấy mạch vẫn chạy tốt. mong anh giải thích thêm,
mến


Post này đọc rồi mà lại quên trả lời.

Chân sense để phản hồi giá trị dòng điện, có thể dùng để bảo vệ quá tải, ngắn mạch, cũng có thể dùng để tính toán trong một số phương pháp điều khiển, vì dòng điện qua động cơ tỷ lệ với mômen điện từ sinh ra trong động cơ.

Giải thích về chân sense của LMD18200: có 2 cảm biến dòng điện sẽ cảm nhận dòng điện qua 2 MOSFET phía cao, sau đó đưa vào mạch ổn định và tạo dòng ở chân sense của vi mạch. Chúng ta sẽ mắc một điện trở chuẩn vào giữa chân này và 0V để tạo áp rơi tỷ lệ với dòng điện (dùng cho các mạch điều khiển, giới hạn dòng).

Với LMD18200 thì chân sense của nó cho phép chúng ta chọn ngưỡng dòng để tác động, vì giá trị điện trở khác nhau sẽ tạo ra áp rơi khác nhau. Nguyên tắc cảm nhận dòng điện của LMD18200 khác với cách chúng ta làm ở đây (có lẽ nó đang dùng cảm biến Hall, do đó mới có thông số độ nhạy 377 uA/A). Nếu chúng ta dùng điện trở Rs như trong các mạch cầu H đang được thực hiện ở đây thì độ nhạy sẽ là 1A/1A (chúng ta dùng giá trị thực của dòng điện).

Giá trị 2k mà họ dùng đảm bảo điều kiện áp rơi không quá 5V so với GND, do đó mạch chạy tốt là đương nhiên.

Thân,

bluepine 19-09-2006 09:01 AM

anh trả lời rất thuyết phục. cảm ơn anh nhiều.
mến

bluepine 19-09-2006 10:28 AM

1 Attachment(s)
em đã vẽ xong phần mạch điều khiển động cơ servo dùng cầu LM18200, các anh tham khảo góp ý cho nhé.
mến

falleaf 19-09-2006 01:36 PM

Phần mạch cầu H, anh Nam sẽ comment thêm cho em nếu cần. Còn phần thiết kế, anh có mấy điểm chú ý:

1) Phần RS232, em sử dụng chuẩn bootloader của picvietnam (tìm lại bài báo cáo này do Chính cung cấp) Hồi trước Chính làm cái hình bé xíu, anh không nhớ Chính đã gửi báo cáo lên và sửa lại chưa. Em nên thiết kế theo chuẩn đó.

2) Phần nạp trình cho PIC trên board, với chuẩn đó, em cũng nên thiết kế header theo chuẩn ICSP-BLD của picvietnam, như vậy sẽ có thể phát triển và hỗ trợ công cụ một cách thống nhất.

>> Như vậy, chúng ta sẽ thống nhất chuẩn thiết kế cho mạch chạy PIC ở phần này luôn.

3) Về phần encoder, theo anh, em kô cần làm quá phức tạp, chỉ cần em cấp trực tiếp vào chân vi điều khiển là xong. Rất nhiều thiết kế dùng các con FF đưa vào để tạo xung tốt hơn, nhưng anh thấy với PIC không cần thiết phải làm vậy. Nếu em có osc, em có thể lấy quan sát thử, nó chả mất xung đâu (nhớ tính phần chu kỳ ngắt cho tốt là được).

4) Nếu để tăng độ mịn, anh nghĩ em nên dùng cả hai ngắt trên hai chân. Như vậy, lợi thế nhất là em dùng interrupt onchange trên portb. Vì như vậy, em có thể đọc được độ mịn lên gấp 4 lần, khi đọc encoder.

Chúc vui

bluepine 19-09-2006 04:28 PM

cho em hỏi về tốc độ động cơ
 
Khi em điều rộng xung với tần số 19500Hz, dutycycle = 100% để điều khiển không tải động cơ, nhưng em đếm số vòng động cơ hồi tiếp về không ổn định.
khi chu kì lấy mẫu càng giảm thì độ dao động càng cao , đây là các giá trị tốc độ đưa về (vòng/phút) (em dùng RS232 để đưa tốc độ về hiển thị trên máy tính, chu kì láy mẫu là 0.8s, nếu giảm xuống sai lệch còn lớn hơn nhiều )
50 1750 2000 1750 2000 1750 1750 2000 1750 1750 2
000 1750 1750 2000 1750 1750 2000 1750 1750 1750 2
000 1750 1750 2000 1750 1750 1750 1750 1750 1750 1
750 1750 1750 1750 1750 1750 2000 1750 1750 1750 1
750 1750 1750 2000 1750 1750 1750 1750 1750 2000 1
750 1750 1750 1750 1750 1750 1750 2000 1750 1750 1
750 1750 1750 1750 2000 1750 1750 1750 1750 1750 1
750 1750 1750 2000 1750 1750 1750 1750 1750 1750 1
750 2000 1750 1750 1750 1750 1750 1750 1750 2000 1
750 1750 1750 1750 1750 1750 1750 1750 1750
các anh có thể giải thích được không?
mến

namqn 19-09-2006 06:00 PM

Trích:

Nguyên văn bởi bluepine (Post 5016)
Khi em điều rộng xung với tần số 19500Hz, dutycycle = 100% để điều khiển không tải động cơ, nhưng em đếm số vòng động cơ hồi tiếp về không ổn định.
khi chu kì lấy mẫu càng giảm thì độ dao động càng cao , đây là các giá trị tốc độ đưa về (vòng/phút) (em dùng RS232 để đưa tốc độ về hiển thị trên máy tính, chu kì láy mẫu là 0.8s, nếu giảm xuống sai lệch còn lớn hơn nhiều )
50 1750 2000 1750 2000 1750 1750 2000 1750 1750 2
000 1750 1750 2000 1750 1750 2000 1750 1750 1750 2
000 1750 1750 2000 1750 1750 1750 1750 1750 1750 1
750 1750 1750 1750 1750 1750 2000 1750 1750 1750 1
750 1750 1750 2000 1750 1750 1750 1750 1750 2000 1
750 1750 1750 1750 1750 1750 1750 2000 1750 1750 1
750 1750 1750 1750 2000 1750 1750 1750 1750 1750 1
750 1750 1750 2000 1750 1750 1750 1750 1750 1750 1
750 2000 1750 1750 1750 1750 1750 1750 1750 2000 1
750 1750 1750 1750 1750 1750 1750 1750 1750
các anh có thể giải thích được không?
mến

Anh không nhớ encoder của em có bao nhiêu xung, nhưng kết quả như vậy chắc chắn là có vấn đề (có nhiều khâu cần xem xét: tín hiệu encoder đưa về, thuật toán tính tốc độ).

Ngày trước sinh viên của anh làm với encoder 100 xung/vòng cũng chỉ có sai lệch 60 vòng/phút khi đọc tốc độ không tải (thời gian lấy mẫu là 100 ms thì phải, không nhớ rõ lắm).

Thân,

bluepine 20-09-2006 10:42 AM

1 Attachment(s)
Encoder của em 500 xung, còn về giải thuật đếm thì em dùng timer0 để đọc xung về (hệ số chia 2), em đặt giá trị đầu timer0 là 6, khi đếm đến 250 thì timer0 tràn (tức là 500 xung) em tăng giá trị xung lên 1.
em dùng timer1 để làm chu kì lấy mẫu, khi hết chu kì lấy mẫu (timer1 ngắt) thì em cho hiển thị giá trị đếm về máy tính.
Em cũng nghĩ có thể do tín hiệu từ encoder đưa về có vấn đề nhưng em thắc mắc sao giá trị đưa về chỉ thay đổi ở 2 giá trị thôi (như ví dụ trên là 2000 và 1750) và vài chu kì lấy mẫu thì nó mới thay đổi 1 lần (vì nhiễu thì phải gây thay đổi tín hiệu trong mỗi chu kì chứ)
em gửi kèm theo file chương trình viết trên CCsc , các anh xem hộ
mến

falleaf 20-09-2006 01:27 PM

Giá trị của timer là từ 0 đến 255. Nếu em đặt giá trị đầu là 6, thì nó chỉ đếm được đến 249 là tràn rồi, chứ không phải 250!. Vì 256 là tổng số 2^8, nhưng mà từ 0 đến 255 là 256 số.

Anh không biết em viết cụ thể thế nào, nhưng con số em đưa ra là có vấn đề rồi. Như vậy, nó chạy đến 255 là tràn, hay có nghĩa là đến 249 thì sẽ tràn.

Em có thể post chương trình đoạn đọc encoder lên đây để mọi người cùng quan sát.

Ngoài ra, khi làm các phần test về hoạt động, em cần thực hiện việc truyền số liệu ở dạng nguyên gốc. Có nghĩa là em nên truyền về dạng số xung, chứ không nên truyền về dạng đã tính toán thành vận tốc, như vậy rất khó theo dõi sự đúng sai.

Điểm thứ ba, đó là em phải hiểu, khi em điều khiển độ rộng xung như vậy, em đặt một giá trị fix nào đó của pwm để điều khiển, thì nó có sự lên xuống về tốc độ, cũng không có gì lạ. Nhưng hiện tượng mà chỉ có sai đúng 2 số như vậy, rõ ràng em lập trình sai rồi.

Em kiểm tra lại điểm thứ nhất anh nói, về con số đặt, và post chương trình lên cho mọi người cùng xem.

Chúc vui

manhdc701 20-09-2006 06:42 PM

minh thay y tuong nhu the la rat hay , nhung minh cung ban khoan ve tuong lai cua y tuong nay ?

scentoflove 20-09-2006 09:24 PM

Đọc encoder thì em xài ngắt ngoài, tác động cạnh lên, encoder 400 xung đọc sai số 25x/vòng ở PWM 100%.
Việc sai số do đọc encoder em nghĩ có nhiều nguyên nhân do đoạn code giao tiếp RS232 đặt ko tốt có thể làm trể việc đọc encoder. Em viết code đọc encoder bằng ngắt như sau.

Chương trình ngắt RB0 (pha A) -> encoder+1 khi ngắt
Chương trình ngắt RB7 (index) -> clear encoder=0, set cờ RS=1
Chương trình chính code giao tiếp RS232 khi có cờ ngắt, xuất xong set cờ RS=0

Em ko up lên code được vì hiện giờ đã sữa code đó lại cho 4331 (QEI đọc rất chỉnh xác)

hoanf 21-09-2006 08:58 AM

Trích:

Nguyên văn bởi manhdc701 (Post 5031)
minh thay y tuong nhu the la rat hay , nhung minh cung ban khoan ve tuong lai cua y tuong nay ?

Mình chỉ góp ý nhỏ thôi.
Ban có ý kiến về ý tưởng gì thì nên trích dẫn trong bài viết của mình để người khác dễ hiểu ý kiến của bạn nha
Thân
hoanf

bluepine 21-09-2006 09:34 AM

Trích:

Nguyên văn bởi falleaf (Post 5026)
Giá trị của timer là từ 0 đến 255. Nếu em đặt giá trị đầu là 6, thì nó chỉ đếm được đến 249 là tràn rồi, chứ không phải 250!. Vì 256 là tổng số 2^8, nhưng mà từ 0 đến 255 là 256 số.

Anh không biết em viết cụ thể thế nào, nhưng con số em đưa ra là có vấn đề rồi. Như vậy, nó chạy đến 255 là tràn, hay có nghĩa là đến 249 thì sẽ tràn.

Em có thể post chương trình đoạn đọc encoder lên đây để mọi người cùng quan sát.

Ngoài ra, khi làm các phần test về hoạt động, em cần thực hiện việc truyền số liệu ở dạng nguyên gốc. Có nghĩa là em nên truyền về dạng số xung, chứ không nên truyền về dạng đã tính toán thành vận tốc, như vậy rất khó theo dõi sự đúng sai.

Điểm thứ ba, đó là em phải hiểu, khi em điều khiển độ rộng xung như vậy, em đặt một giá trị fix nào đó của pwm để điều khiển, thì nó có sự lên xuống về tốc độ, cũng không có gì lạ. Nhưng hiện tượng mà chỉ có sai đúng 2 số như vậy, rõ ràng em lập trình sai rồi.

Em kiểm tra lại điểm thứ nhất anh nói, về con số đặt, và post chương trình lên cho mọi người cùng xem.

Chúc vui

Cảm ơn anh F, em sẽ kiểm tra lại chương trình. còn code em đã gửi file Picvietnam.rar ở bài trước đó,
mến

bluepine 21-09-2006 11:04 AM

1 Attachment(s)
Hi Hi, anh F đoán chính xác, em bị lỗi giải thuật, em đã sửa chương trình lại rồi
đây là kết quả số xung đếm được trong mỗi 0.1s
1720 1725 1732 1727 1746 1733 1729 1730 1730 1733 1716 1711 1730 1712 1733 1723 1723 1720 1736 1725 1715 1714 1713 1728 1734 1726 1719 1723 1719 1726 1724 1708 1722 1739 1724 1736 1737 1714 1716 1728 1714 1735 1720 1720 1734 1724 1730 1726 1718 1732 1726 1729 1716 1724 1719 1712 1733 1734 1731 1717 1722 1723 1732 1727 1724 1719 1729 1720 1727 1719 1711 1716 1722 1722 1719 1723 1724 1723 1725 1712 1716 1725 1720 1725 1721 1736 1712 1720 1716 1731 1707 1718 1711 1711 1711 1718 1711 1706 1716 1732 1717 1720 1718 1707 1722 1716 1724 1712 1711 1717 1732 1728 1728 1734 1726 1727 1720 1729 1724 1718 1727 1724 1733 1726 1718 1718 1715 1715 1722

tôi gửi chương trình viết bằng CCsc lên cho các bạn tham khảo
mến,

falleaf 21-09-2006 12:44 PM

picvietnam.c
 
Code:

#include <16F877A.h>
#fuses NOWDT,NOLVP,HS
#use delay (clock=20000000) //20Mhz

#use rs232(baud=2400, xmit=PIN_C6, rcv=PIN_C7, parity=N, bits=8)
#include <7Segments_Led_Display.c>
#include <init_timer0.c>

#byte TMR2 = 0x11
#byte PR2 = 0x92
#byte CCPR1L = 0x15
#byte CCPR1H = 0x16
#byte CCP1CON = 0x17
int16 i = 0;
int16 j = 0;
int16 counted_round_value = 0x00;
int16 update_counted_round_value = 0x00;


void convert_16bits_to_decimal_digit(int16 counted_round_value1) // calculate to display on 7_segment leg Max value 9999 or 0x270F
{
  fourth_digit = counted_round_value1 / 1000;
  third_digit = (counted_round_value1 % 1000) / 100;
  second_digit = ((counted_round_value1 % 1000) % 100) / 10;
  first_digit = ((counted_round_value1 % 1000) % 100) % 10;
}


#INT_TIMER0 // ngat timer0 tang bien dem len 1
void timer0_int()
{
      counted_round_value++;

}

#INT_TIMER1 // ngat timer0 tang bien len 1
void timer1_int() // moi lan timer1 tran la 0.02s
{
  TMR1_L = START_VALUE_TIMER1_L;
  TMR1_H = START_VALUE_TIMER1_H;


  if (j == 5){ // chu ki lay mau 0.02 * 5 = 0.1s
      j = 0;

      update_counted_round_value = counted_round_value*500 + get_timer0(); // so vong quay trong 1 phut

      counted_round_value = 0;

      printf("%ld\t",update_counted_round_value); // gui so xung cap nhat ve may tinh qua RS232
  }
  else

      j++;
}



void init_PWM(int16 frequency){

  setup_ccp1(CCP_PWM); // initiate PWM
  PR2 = 20000000/4/frequency - 1; // set PWM period

  setup_timer_2(T2_DIV_BY_1,PR2,1);  // initiate time 2  The cycle time will be (1/clock)*4*t2div*(period+1)
                                      //  (1/20000000)*4*1*(255+1) =  51.2 us( will over flow every 51.2 us, will intrup every 51.2 uS or 19.5 khz;

}

void main()
{
  int8 timer0_value;

  set_tris_a(0xff);

  init_PWM(19500);
  init_timer0();

  set_pwm1_duty(500); //set the duty cycle = 500*1/clock* T2div (T2div is in setup_timer2)

                                                //= 500/20000000*1 = 25uS (~25%)

      while(true){

  convert_16bits_to_decimal_digit(update_counted_round_value); // tinh ra tung digit de hien thi
  display_RPM_digit(); // hien thi tren led 7 doan
  }
}


falleaf 21-09-2006 12:50 PM

Code:

#include <16F877A.h>
void init_PWM(int16 frequency){

  setup_ccp1(CCP_PWM); // initiate PWM
  PR2 = 20000000/4/frequency - 1; // set PWM period
}

Anh lấy một đoạn chú thích chương trình thôi, vì anh cũng chỉ vừa mở lên và coi lướt qua, chưa xem kỹ nữa. Nhưng anh thấy ở đây em viết 20000000/4/f - 1. Công thức tính thì là như vậy, nhưng em phải nhớ rằng, cứ mỗi một lần thêm một công thức tính, thì máy sẽ phải generate lệnh để tính. Vì vậy, thay vì thực hiện chia, thì em ghi thẳng con số vào 5000000/f chẳng hạn.

Rồi với các con số khác cũng vậy, em tính toán ở đâu đó, rồi ghi thẳng vào.

Về thuật toán tính toán, mọi người xem lại coi có vấn đề gì không nhé.

Anh em chú ý là post thẳng chương trình lên ở dạng code, người khác có thể đọc được ngay, khỏi mất công phải lưu rồi mở lại. hơn nữa, từng đoạn code có thể trực quan sinh động, có thể xem và bình luận được. Như vậy sẽ có lợi hơn nhiều.

Chúc vui

bluepine 22-09-2006 09:38 AM

Chào mọi người,
1/ Phần mạch RS232 em sẽ đọc lại phần botloader để sửa.
2/ Chuẩn ICSP-BLD của picvietnam ở luồng nào vậy anh F, anh gửi cho em được không.
3/ "Nếu để tăng độ mịn, anh nghĩ em nên dùng cả hai ngắt trên hai chân. Như vậy, lợi thế nhất là em dùng interrupt onchange trên portb. Vì như vậy, em có thể đọc được độ mịn lên gấp 4 lần, khi đọc encoder." Phần này, em chưa hiểu rõ lắm, chức năng interrupt on change thì em biết, nhưng từ 2 tín hiệu xung đưa về thì làm sao tăng độ nhạy lên 4 lần, anh giải thích thêm cho em.

falleaf 22-09-2006 10:17 AM

http://www.picvietnam.com/forum//showthread.php?t=224

Em xem luồng này, xem bài số 13. Nếu như bây giờ em đọc cả cạnh lên và cạnh xuống của encoder của cả hai kênh A, B, thì như vậy em sẽ thấy rằng độ phân giải sẽ tăng lên 4 lần.

Nếu em chỉ đọc cạnh lên của kênh B chẳng hạn, thì bây giờ em đọc cạnh lên B, lên A, xuống B, xuống A. Như vậy độ phân giải sẽ tăng lên 4.

Như vậy, với encoder 500 xung/vòng, em có thể đọc lên tới 2000 xung/vòng, đây là kỹ thuật cơ bản về encoder thôi.

http://dientuvietnam.net/forums/showthread.php?t=2637
Luồng này là về chuẩn ICSP_BLD của picvietnam (bên dientuvietnam, anh quên viết bài bên picvietnam, nhưng nó có trong bài bootloader của Chính, anh sẽ bổ sung sau).

Chúc vui.

scentoflove 22-09-2006 11:08 PM

Chuẩn 5x2 em rất thích nhưng ko kiếm được header cũng như ko kiếm được cable ở Nhất Tảo (em chỉ thấy 1 lần sợi cable 5x2 của thằng bạn hỏi nó mua ở đâu, nó nói bạn nó mua dùm :) )

Em đang vẽ lại module mạch dk nên phân vân ko có link kiện để theo chuẩn 5x2.

Anh F cho em hỏi thêm mục đích của việc mịn hóa encoder, vì nếu để phân biệt chiều của encoder thì chỉ cần ngắt pha A, đọc tín hiệu pha B (0 or 1) là được -> em nghĩ đọc encoder qua kĩ sẽ dẫn đến chậm chương trình chính (tính toán PID số thực)

gà mờ 23-09-2006 07:12 PM

cac anh ơi chuyển mấy cái mạch câu h vsf encoder về dạng pdf đi đê em download với
thanks

ntc 23-09-2006 07:37 PM

Trích:

Chuẩn 5x2 em rất thích nhưng ko kiếm được header cũng như ko kiếm được cable ở Nhất Tảo (em chỉ thấy 1 lần sợi cable 5x2 của thằng bạn hỏi nó mua ở đâu, nó nói bạn nó mua dùm )

Em đang vẽ lại module mạch dk nên phân vân ko có link kiện để theo chuẩn 5x2.
Cáp và đầu bấm 5x2, bạn có thể mua tại tiệm ông Thuần trong chợ Nhật Tảo. Chỗ đó cũng có bán header 5x2.

Cũng có thể ghe qua cái cửa hàng Tương Lai (nằm trên đường 3/2, cũng gần gần khu Nhật Tảo) để xem thử nó còn không.

Bí quá thì có thể liên hệ với mình.

:D

trungkien_0914373773 26-09-2006 12:42 AM

tôi mới tìm hiểu về pic và thấy ý kiến hay đấy .

bluepine 26-09-2006 10:20 AM

Hỏi về interrupt on change
 
Trích:

Nguyên văn bởi falleaf (Post 5060)
http://www.picvietnam.com/forum//showthread.php?t=224


Em xem luồng này, xem bài số 13. Nếu như bây giờ em đọc cả cạnh lên và cạnh xuống của encoder của cả hai kênh A, B, thì như vậy em sẽ thấy rằng độ phân giải sẽ tăng lên 4 lần.

Nếu em chỉ đọc cạnh lên của kênh B chẳng hạn, thì bây giờ em đọc cạnh lên B, lên A, xuống B, xuống A. Như vậy độ phân giải sẽ tăng lên 4.

Như vậy, với encoder 500 xung/vòng, em có thể đọc lên tới 2000 xung/vòng, đây là kỹ thuật cơ bản về encoder thôi.

http://dientuvietnam.net/forums/showthread.php?t=2637
Luồng này là về chuẩn ICSP_BLD của picvietnam (bên dientuvietnam, anh quên viết bài bên picvietnam, nhưng nó có trong bài bootloader của Chính, anh sẽ bổ sung sau).

Chúc vui.


bluepine 26-09-2006 10:22 AM

Chào mọi người, cho em hỏi sao em không dùng được chức năng interrupt on change trên portb, em viết chương trình như thế này
.......
#INT_RB
void RB_int()
{
counted_round_value++;
printf("%ld\t",counted_round_value);// hiển thị giá trị số lần ngắt về máy tính

}


void main()
{
enable_interrupts(GLOBAL);
enable_interrupts(INT_RB);
port_b_pullups(true);
set_tris_b(0xf0);

output_low(PIN_B0);
while(true);
}
..... em dùng 1 phím nhấn để thay đổi tín hiệu trên 1 chân (từ b4 đến b7)
khi hiển thị về máy tính thì thấy giá trị số lần ngắt tăng liên tục mặt dù chưa nhấn phím.
dòng lệnh port_b_pullups(true); để chống nhiễu do áp trôi trên portb, em đã thử bỏ đi mà kết quả vẫn không đổi.
kiểm tra lại thì phím nhấn không vấn đề gì.

scentoflove 27-09-2006 03:02 AM

Bạn chọn ngắt cạnh lên hay cạnh xuống (điện trở kéo lên chắc là ngắt cạnh xuống). Bạn nên mắc điện trở kéo lên ở mạch ngoài như vậy ổn định hơn
Nếu nút nhấn chỉ mắc 1 chân RB0 thi bạn nên set_tris_b(0x10), chân Rb1-Rb3 ko xài
Thực ra khi lúc mới học PIC viết ngắt ngoài thì bị lỗi khác (lúc chạy đúng lúc chạy sai) làm cho mình có cảm giác RB0-RB3 ngắt ko ổn định bằng RB7.

bluepine 27-09-2006 11:01 AM

Trích:

Nguyên văn bởi scentoflove (Post 5115)
Bạn chọn ngắt cạnh lên hay cạnh xuống (điện trở kéo lên chắc là ngắt cạnh xuống). Bạn nên mắc điện trở kéo lên ở mạch ngoài như vậy ổn định hơn
Nếu nút nhấn chỉ mắc 1 chân RB0 thi bạn nên set_tris_b(0x10), chân Rb1-Rb3 ko xài
Thực ra khi lúc mới học PIC viết ngắt ngoài thì bị lỗi khác (lúc chạy đúng lúc chạy sai) làm cho mình có cảm giác RB0-RB3 ngắt ko ổn định bằng RB7.

chào bạn, mình nghĩ bạn nhầm, vì mình dùng chức năng ngắt INT_RB (interupt on change) tức là chương trình ngắt sẽ được gọi khi có sự thay đổi mức trạng thái trên bất kì chân nào trong số b4 đến b7. Còn ngắt trân chân b0 như bạn nói là ngắt ngoài INT_EXT, bạn có thể vào mục help của CCsc để xem lại.
mến

bluepine 28-09-2006 12:16 PM

hỏi về hàm truyền động cơ DC
 
1 Attachment(s)
chào mọi người, khi tham khảo địa chỉ http://www.library.cmu.edu/ctms/ctms...or/digital.htm
em thấy hàm truyền động cơ DC có dạng



với các đại lượng như sau:
electrical resistance (R) = 1 ohm
*electrical inductance (L) = 0.5 H
*electromotive force constant (Ke=Kt) = 0.01 Nm/Amp
*moment of inertia of the rotor (J) = 0.01 kg*m^2/s^2
*damping ratio of the mechanical system (b) = 0.1 Nms
*input (V): Source Voltage
*output (teta dot): Rotating speed

khi tra trong trong datasheet của động cơ em (TS3078) thì thấy các đại lượng không giống với các đại lượng trên, cụ thể là không có các đại lượng damping ratio of the mechanical system (b), electromotive force constant (Ke=Kt), moment of inertia of the rotor (J),

nhưng mà trong datasheet chỉ có các đại lượng như Rated Torque(TR), Torque Constant(KT), Armature Moment of Inertia(IR)

:)các anh cho hỏi

Rated Torque(TR) ?= Rated Torque(TR)
electromotive force constant (Ke=Kt) ?= Torque Constant(KT)
moment of inertia of the rotor (J) ?= Armature Moment of Inertia(IR)

(em chỉ so sánh thấy thứ nguyên giống nhau thôi)

ai rành về thông số động cơ chỉ giùm nhé, em pót datasheet lên cho mọi người tham khảo luôn
mến

namqn 28-09-2006 06:46 PM

Câu trả lời là Yes cho cả 3 câu hỏi của em.

Vào đọc thêm ở đây:
http://namqn.byethost7.com/Motor.php
Thân,

scentoflove 28-09-2006 10:46 PM

Trích:

Nguyên văn bởi bluepine (Post 5119)
chào bạn, mình nghĩ bạn nhầm, vì mình dùng chức năng ngắt INT_RB (interupt on change) tức là chương trình ngắt sẽ được gọi khi có sự thay đổi mức trạng thái trên bất kì chân nào trong số b4 đến b7. Còn ngắt trân chân b0 như bạn nói là ngắt ngoài INT_EXT, bạn có thể vào mục help của CCsc để xem lại.
mến

Bài đó mình viết nhầm Rb4-Rb7 chứ ko phải Rb0-Rb3, set_tris_b(0x10) chân Rb6-Rb4 ko xài:)

Bạn sử dụng ngắt INT_RB như thế nào nếu ko phải là đưa tín hiệu tử mạch ngoài vào, ngắt INT_EXT cũng ngắt dựa trên tín hiệu của mạch ngoài, như vậy trong mạch bạn sử dụng thì INT_RB và INT_EXT gần giống nhau về cách gây ra ngắt là sự thay đổi trạng thái ở ngõ vào.

Mình viết bài đó là để nói kinh nghiệm thới cùi bắp mới học PIC :D.

trungkien_0914373773 03-10-2006 11:55 AM

Bác F ơi . Tôi có 1 con Pic 16F877A và một mạch cầu H , Một động cơ 1 chiều .Tôi không biết viết chương trình trong CCS như thế nào để điều khiển được tốc độ của động cơ Bác F có thể giúp tôi ko ? cảm ơn Bác F.

falleaf 03-10-2006 02:15 PM

Trích:

Nguyên văn bởi trungkien_0914373773 (Post 5225)
Bác F ơi . Tôi có 1 con Pic 16F877A và một mạch cầu H , Một động cơ 1 chiều .Tôi không biết viết chương trình trong CCS như thế nào để điều khiển được tốc độ của động cơ Bác F có thể giúp tôi ko ? cảm ơn Bác F.

Bạn đọc lại từ đầu luồng này, sẽ rất có ích cho bạn.

tinhthanthep 06-10-2006 12:19 PM

Mạch điều khiển của mình thiết kế xong roài. Falleaf cho hỏi làm thế nào để post sơ đồ mạch vẽ bằng OrCAD10.5 lên diễn đàn? (Chuyển từ OrCAD sang ảnh JPG mà hình vẽ và các ký hiệu vẫn rõ ràng)

falleaf 06-10-2006 04:38 PM

Bạn nén tất cả thành file zip gửi lên diễn đàn bằng cách Tải file đính kèm.

Nếu bạn chỉ muốn gửi hình lên diễn đàn, thì bạn có thể dùng print screen để chụp hình màn hình lại, sau đó dán vào Paint, rồi cắt cái phần hình ra, lưu lại dạng JPEG, và gửi lên photobucket.com như gửi một hình bình thường.

Chúc vui.

tinhthanthep 09-10-2006 08:58 AM

1 Attachment(s)
Đây là sơ đồ bộ điều khiển:
http://i72.photobucket.com/albums/i1.../Schematic.jpg
Phần công suất dùng chip LMD18200
Giao tiếp với PC qua RS232.
Chuẩn ICSP và Bootloader của PICvietnam
Hiển thị thông tin trên LCD 2x16
Có nút gạt chuyển chế độ manual và auto
có nút bấm start/stop, quay trái quay phải và đèn báo tương ứng.
Mạch flip-flop dùng để tăng , giảm số xung nhận được từ encoder khi quay thuận và nghịch (vì capture của PIC chỉ theo chiều tăng). Dùng 2 chip 74HC74.
Dùng 4 biến trở để điều chỉnh hệ số Kp, Ki, Kd, tốc độ bằng tay.
Các bạn thử xem với sơ đồ mạch như vậy còn có vấn đề gì nữa không?.
file orCAD mình gửi kèm theo đây

minhcuong 09-10-2006 11:13 PM

Mạch điều khiển 6 motor đồng thời + current sensing
 
1 Attachment(s)
Các anh chị em cho ý kiến nhé. Cái này tôi đã thử với 1 motor chạy khá tốt, và ổn định.

falleaf 14-10-2006 03:28 PM

Cho hỏi là mọi người đã làm xong mạch cầu điều khiển động cơ, chạy ngon chưa? Bây giờ các bạn post mạch của mình lên mạng, và chương trình chạy thử, còn có những khúc mắc gì không?

Nhờ anh Nam tổng kết lại.

Chúc vui

bluepine 18-10-2006 03:32 PM

báo cáo sơ bộ công việc
 
1 Attachment(s)
Chào mọi người, em hiện đang chạy thử trên 1 bo mạch thí nghiệm Pic có bán ngoài chợ Nhật Tảo, phần cầu H em dùng LM18200.(lắp trên break board)
Em hiện đã đọc được tín hiệu encoder về rồi (nhưng chỉ đọc được một xung bằng chế độ đếm xung của timer0 thôi, do khi thử với ngắt on change trên port b bị ngắt liên tục).
Phần PID thì em đã tính được hàm truyền động cơ, mô phỏng trên matlab và tính được thông số PID bằng phương pháp Nychol Zisman 2, cụ thể
hàm truyền động cơ:



mô phỏng được Kgh = 6600; Tdao động = 10.7 ms
tính ra được Kp = 3960
Kd = 5.926
Ki = 740186
các anh có kinh nghiệm xem các thông số trên có hợp lý không? :)

Còn về giải thuật chương trình chung để điều khiển thì em xem trên 1 ứng dụng của Microchip nhưng vẫn chưa hiểu, các anh có tài liệu nào dễ hiểu hơn gửi lên cho mọi người cùng xem nhé.

falleaf 18-10-2006 03:44 PM

em có thể gửi hình ảnh mô phỏng, hoặc file mô phỏng của em lên đây để mọi người cùng tham khảo được không?

Chúc vui.

bluepine 19-10-2006 03:09 PM

Mô phỏng Matlab
 
2 Attachment(s)
Đây là chưong trình mô phỏng

function MophongPID(Kp,Ki,Kd);

J=5.5e-4;
b=0.29;
K=0.11;
R=2.1;
L=3.3e-3;

num=K;
den=[(J*L) ((J*R)+(L*b)) ((b*R)+K^2) (0)];

numcf=[Kd Kp Ki];
dencf=[1 0];

numf=conv(numcf,num);
denf=conv(dencf,den);

[numc,denc]=cloop(numf,denf,-1);
t=0:0.0005:0.08;
step(numc,denc,t);

em lần lượt gọi hàm MophongPID, với các thông số Kp, Ki, Kd thay đổi theo phương pháp NycholZisman2,

Đây là đáp ứng ứng với Kgh = 6600; (xem hinh mophong1), ta đo được Tdaođộng = 10,7ms
Từ pp Nycholzisman2, ta tính được Kp= 0.6*Kgh = 3960, Ki = Kp/Ti = Kp/(0.5*Tdđ) = 740186; Kd = Kp*Td = Kp*(0.125*Tdđ) = 5.3965
Đáp ứng của hệ ứng với Kp,Ki,Kd vừa tính được : xem hình 2

HaiAu2005 19-10-2006 04:39 PM

Tôi nghĩ những người tham gia mục ứng dụng thực hành này nên viết lại các phần ứng dụng thực hành của mình thành một bản báo cáo khoa học (scientific report). Các bác admin cũng nên tổ chức một tạp chí điện tử cho diễn đàn chẳng hạn, trong tạp chí điện tử đó tập hợp những bài viết, bài báo cáo có tính học thuật khá tốt rồi tập hợp lại thành một số. Ví dụ định kỳ một năm 1, 2 số chẳng hạn. Cũng có thể lựa chọn trong các mods thành một ban biên tập để đóng góp ý kiến cho bài viết có chất lượng tốt.

Hải Âu

ntc 19-10-2006 06:14 PM

Trích:

Tôi nghĩ những người tham gia mục ứng dụng thực hành này nên viết lại các phần ứng dụng thực hành của mình thành một bản báo cáo khoa học (scientific report). Các bác admin cũng nên tổ chức một tạp chí điện tử cho diễn đàn chẳng hạn, trong tạp chí điện tử đó tập hợp những bài viết, bài báo cáo có tính học thuật khá tốt rồi tập hợp lại thành một số. Ví dụ định kỳ một năm 1, 2 số chẳng hạn. Cũng có thể lựa chọn trong các mods thành một ban biên tập để đóng góp ý kiến cho bài viết có chất lượng tốt.
Em ủng hộ ý kiến của anh.

Hiện nay các thành viên chưa có thói quen viết, vì có thể cho rằng đó là một công việc mất thời gian, tốn công sức. Nhưng cái gì cũng có cái giá của nó. Bỏ ra một chút thời gian và công sức sẽ thu lại được sự vững vàng trong các kiến thức, các vấn đề đã từng giải quyết.

Hơn nữa, đã gọi là dự án mở, thì không thể thiếu một hai bài viết được. Làm tới đâu viết tới đó, củng cố lại tới đó, dễ theo dõi, dễ hướng dẫn, làm việc có định hướng và tập trung hơn.

Bữa giờ em cứ chờ đợi ở luồng này một bài báo có tính chất học thuật, để học và biết thêm (em chưa sờ tới cái động cơ bao giờ cả :D). Nhưng chờ hoài không thấy, mà thấy hơi lung tung thế nào ấy. Lúc thì nói về sơ đồ nguyên lí, lúc thì nói về mô phỏng, ... Các anh hướng dẫn cũng vất vả theo.

Được một thời gian sôi động, thành quả thực hiện như thế nào, tiến độ tới đâu, em cũng chịu.

Bản thân em thì viết chương trình cho con LED nó sáng em cũng viết lại. Đấy, cũng có được một cái tutorial coi được. Cũng không thể nói là thiếu thời gian để viết. Anh Nam bận đến bao nhiêu cũng bỏ công sức và thời gian viết các tutorial về dsPIC.

Em nghĩ mỗi người chia ra viết một đoạn, ai mô phỏng rồi thì viết cái báo cáo về mô phỏng, ai test mạch thành công rồi thì viết một chút để giải thích về sơ đồ nguyên lý và nguyên lí hoạt động, ai viết chương trình thành công rồi thì viết một chút về chương trình của mình. Form chuẩn đã có rồi. Cuối cùng tổng hợp lại, mọi vấn đề về PID sẽ được giải quyết, ai bị kẹt phần nào, thì thma khảo của người đã giải quyết được rồi, cuối cùng ai cũng làm được, đõ tốn thời gian và công sức.


Múi giờ GMT. Hiện tại là 06:52 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