PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   dsPIC - Bộ điều khiển tín hiệu số 16-bit (http://www.picvietnam.com/forum/forumdisplay.php?f=29)
-   -   dsPIC Tutorial 5-Module ADC và MCPWM (http://www.picvietnam.com/forum/showthread.php?t=650)

namqn 27-03-2009 06:55 PM

Trích:

Nguyên văn bởi silvadk2 (Post 24082)
Em đã đặt 1 biến vào ADCVoltage để thử rồi, chạy tốt anh ạ.

Như tôi đã nói, bạn xem lại phần đọc tín hiệu analog. Bạn đã thử một trong hai tutorial của tôi chưa? Nếu đã thử thì bạn có thể chỉnh code lại để đọc từ RB8 thay vì RB0 xem có thành công hay không.

Thân,

conglong 27-03-2009 07:04 PM

Sai ở hàm main đó bạn,
 
Trích:

Nguyên văn bởi silvadk2 (Post 24082)
Em đã đặt 1 biến vào ADCVoltage để thử rồi, chạy tốt anh ạ.


Vong lặp while(1) của bạn đặt ở cuối chương trình nên không hiện thị nhiệy độ đúng, bạn sửa lại như sau:

Code:

void main(void)
{
        int ADCVoltage;
        char Nhietdo[40];
        ADPCFG = 0xFEFF;
        SystemInit();
        Init_ADC10();
        LCD_Gotoxy(1,1);       
        LCD_WriteString("nhiet do la");       
        LCDdelayms(10);
  while(1){
        LCD_Gotoxy(3,2);
        ADCVoltage=ADCValue/2;
        sprintf(Nhietdo, "%d",ADCVoltage );
        LCD_WriteString(Nhietdo);
          };
}

Nó sẽ chạy nhưng code này vẫn chưa tối ưu.

namqn 27-03-2009 07:16 PM

Trích:

Nguyên văn bởi conglong (Post 24086)
Vong lặp while(1) của bạn đặt ở cuối chương trình nên không hiện thị nhiệy độ đúng, bạn sửa lại như sau:

Code:

void main(void)
{
        int ADCVoltage;
        char Nhietdo[40];
        ADPCFG = 0xFEFF;
        SystemInit();
        Init_ADC10();
        LCD_Gotoxy(1,1);       
        LCD_WriteString("nhiet do la");       
        LCDdelayms(10);
  while(1){
        LCD_Gotoxy(3,2);
        ADCVoltage=ADCValue/2;
        sprintf(Nhietdo, "%d",ADCVoltage );
        LCD_WriteString(Nhietdo);
          };
}

Nó sẽ chạy nhưng code này vẫn chưa tối ưu.

Bạn silvadk2 chỉ muốn thử hiển thị một giá trị nhiệt độ rồi cho dừng chương trình, do đó không hẳn là sai. Vấn đề là biến ADCValue chưa có được giá trị digital tương ứng với tín hiệu analog ở ngõ vào, theo ý của bạn silvadk2. Nguyên nhân có thể do phần cứng, cũng có thể do cách thiết lập cho module ADC của bạn ấy chưa đúng.

Thân,

silvadk2 27-03-2009 09:24 PM

Ha ha, được rồi bác ạ . Em bị lỗi tý phần cứng, giờ ngon rồi, ha ha! Thank cả nhà rất rất là nhiều.

conglong 27-03-2009 11:26 PM

Thầy Nam cho em hỏi (hơi ngoài luồng) : em đang làm đồ án muôn học là dùng vi điều khiển (dsPIC) để PID tốc độ và vị trí động cơ, em dung động cơ DC secvo 24v/60w, và encoder 504xung/vòng; về thuật toán PID thì em được học rồi nhưng khi vào làm thực tế thì em không biết cách nào để xác định được Kpgh, Ki , Kd, ?!
Trên lí thuyết : xác định Kpgh bằng cách cho ki = 0,Kd = 0, sau đó tăng từ từ Kp cho tới khi có dao động (với chu kì là Tgh) ở ngõ ra, thì đây là Kpgh, và lúc này ta có Kp = 0.6*Kpgh
còn Ki = kp / Ti , Kd = Kp*Td, với Ti = 0.5*Tgh, Td = 0.125*Tgh

Thầy nói rõ cho em hơn chố này được không thầy , ý em là viết phần mềm như thế nào để tăng Kp mà ta có thể tìm được Kgh và Tgh?
Em cảm ơn thầy nhiều lắm !.
Trân trọng !.

namqn 28-03-2009 12:11 AM

Trích:

Nguyên văn bởi conglong (Post 24096)
Thầy Nam cho em hỏi (hơi ngoài luồng) : em đang làm đồ án muôn học là dùng vi điều khiển (dsPIC) để PID tốc độ và vị trí động cơ, em dung động cơ DC secvo 24v/60w, và encoder 504xung/vòng; về thuật toán PID thì em được học rồi nhưng khi vào làm thực tế thì em không biết cách nào để xác định được Kpgh, Ki , Kd, ?!
Trên lí thuyết : xác định Kpgh bằng cách cho ki = 0,Kd = 0, sau đó tăng từ từ Kp cho tới khi có dao động (với chu kì là Tgh) ở ngõ ra, thì đây là Kpgh, và lúc này ta có Kp = 0.6*Kpgh
còn Ki = kp / Ti , Kd = Kp*Td, với Ti = 0.5*Tgh, Td = 0.125*Tgh

Thầy nói rõ cho em hơn chố này được không thầy , ý em là viết phần mềm như thế nào để tăng Kp mà ta có thể tìm được Kgh và Tgh?
Em cảm ơn thầy nhiều lắm !.
Trân trọng !.

Với câu hỏi này, xin bạn hỏi thầy hướng dẫn của bạn.

Thân,

conglong 29-03-2009 12:06 AM

Trích:

Nguyên văn bởi namqn (Post 24099)
Với câu hỏi này, xin bạn hỏi thầy hướng dẫn của bạn.

Thân,

Tại vì Thầy em đang đi công tác , trước khi đi thầy có cho em địa chỉ mail để liên lạc nhưng em mail cho thầy mà chưa thấy Thầy reply nên em suốt ruột quá ! Đành lên diễn đàn để hỏi, đây là Tutorial liên quan tới PWM mà PID lại liên quan tới PWM, nên mong Thầy Nam giúp em với ,hoặc bạn nào trong diễn đàn đã tứng làm PID thì chỉ cho mình cái nhé, hết nửa học kì rồi mà chưa làm được gì cả ! SOS!
Cảm ơn tất cả !.
Trân trọng !.

anhtuan133 12-04-2009 02:22 PM

Trích:

Nguyên văn bởi han_nang_008 (Post 21563)
vấn đề nhiếu ở trên em đã giải quyết dc rồi, do em dùng bộ dao động nội của chíp, em chuyển sang dùng thạch anh thì ko còn hiện tượng đó,
Còn về vấn đê đọc 2 đầu vào analog em em làm được rồi nhưng có 1 vấn đề thế này, em set các thanh ghi giống như bác ở trên, và bit SIMSAM = 1 để chuyển đôi dồng thời, em chon chế độ tự động chuyển đổi, và ngắt sau 1 chu kid lấy mẫu/chuyển đổi, kết quả ở chân AN6 là CH0 thì ở ADCBUF0, con AN1 là CH1 thì ở ADCBUF1, em vặn biến trở thì cũng điều chỉnh tốc độ động cơ đc, em dùng hàm ngắt timer2 mỗi 100ms để xuất ra trị của đầu vào AN6 là giá trị dòng điện ra LCD, thì em quan sát thấy giá trị này cứ dao động liên tục, ngay cả khi em chưa cho động cơ chạy và lúc động cơ chạy ở tốc độ ổn định, em dùng đồng hồ đo thì thấy giá trị ở chân này ko thay đổi, bác xem hộ em nguyên nhân tại sao nó giao động thế

Mình đã bị thế rồi. Do con L298 đểu, khi có tải nó hay bị rồ lên. Sau 1 thời gian nữa thì lúc chạy lúc kô.

anhtuan133 13-04-2009 11:40 AM

Một chú ý khi sử dụng ADC auto input scanning là buffer kết quả kô phải là tương ứng 1-1 với kênh ADC. Ví dụ bạn scan AN3,4,5 ở chế độ auto scanning
ADCON2bits.CSCNA = 1;
ADPCFGbits.PCFG3 = 0;
ADPCFGbits.PCFG4 = 0;
ADPCFGbits.PCFG5 = 0;

ADCSSLbits.CSSL3 = 1;
ADCSSLbits.CSSL4 = 1;
ADCSSLbits.CSSL5 = 1;
thì kết quả ADCBUF0 sẽ là của AN3, ADCBUF1 là của AN4....

khuenguyen 13-04-2009 04:41 PM

Help me!
 
Trích:

Nguyên văn bởi namqn (Post 5244)
Đây là tutorial 5 cho dsPIC, giới thiệu các module ADC và MCPWM. Mã nguồn được viết trong ASM30 (tập tin "Vidu5.zip") và C30 (tập tin "Vidu5C30.zip"). Các tập tin .hex đã được đính kèm.

Một ví dụ đọc ngõ vào ADC và điều chỉnh độ rộng xung một cách tương ứng, ví dụ còn lại đọc ngõ vào analog và gửi các ký tự biểu diễn giá trị đọc được(hexadecimal) ra cổng RS-232.

Chúc các bạn thành công!

Thân,

Mình muốn phát xung PWM có tần số từ 200kHz trở lên thì mình cần cấu hình mạch như thế nào? Code của chương trình thay đổi như thế nào trong tutorial 5 của anh Nam? thanks!

conglong 18-04-2009 02:13 AM

Trích:

Nguyên văn bởi khuenguyen (Post 24729)
Mình muốn phát xung PWM có tần số từ 200kHz trở lên thì mình cần cấu hình mạch như thế nào? Code của chương trình thay đổi như thế nào trong tutorial 5 của anh Nam? thanks!

Vẫn vậy thôi, bạn thay đổi dòng :
#define Fpwm 40000 //Tan so PWM = 40 kHz
Thành :
#define Fpwm 200000 //Tan so PWM = 200 kHz

Trân trọng !.

conglong 03-09-2009 11:01 AM

Giúp em về dead time của dsPIC.
 
Thầy Nam và các anh chị trong diễn đàn cho em hỏi về dead time của dsPIC cái ah.
Ở hình 15-16 trang 360 mục Motor control PWM của tài liêu dsPIC Family Reference , họ có nói là trong lúc dead time thì mức tín hiệu ở hai chân PWMxH và PWMxL đều ở mức thấp (LOW), do mạch công suất của em (đã đặt và thi công mất rồi) nếu cả hai chân này đều ở mức thấp thì sẽ kích cả 2 nửa cầu H cùng lúc và xảy ra trùng dẫn, vậy trong dsPIC có cung cấp cho mình lựa chọn mức tín hiệu của 2 chân PWMxH và PWMxL trong lúc dead time không ah ?. cụ thể là em muốn mức tín hiệu của 2 chân PWM lúc dead time là mức cao (High).

Do sự cố trên nên trước mắt , em đang điều khiển động cơ mà không set dead time (dead time = 0 ) , nó vẫn chạy được nhưng FET rất nóng (do quá trình chuyển trạng thái của 2 mức tín hiệu trên cặp chân PWM không lý tưởng) nên sau đó một lúc (hơn 3 phút) bị chết FET.

Thầy và anh chị cho em hỏi câu nữa là trong thanh ghi FBORPOR ( BOR and POR Configuration Register) mục Device Configuration trang 710 của tài liêu dsPIC Family Reference có 2 bit là HPOL và LPOL, họ có giải thích nhưng em chưa hiểu rõ lắm về mục đích của 2 bit này, liệu có phải 2 bit này dùng để set trạng thái của chân PWM khi dead time không ah ?

Em xin chân thành cảm ơn !.
Trân trọng !.

JohnnyNguyen 03-09-2009 08:52 PM

hỏi về tutorial của thầy Nam.thầy cho em hỏi,cái câu lệnh:
ADCValue = ADCBUF0 >>1 //chi lay 9 bit cao nhat
tại sao chỉ lấy 9 bit cao nhất.em chưa hiểu rõ chỗ này.em mới đang tiếp cận ADC,mong thầy chỉ rõ cho.
cho em hỏi thêm về sơ đồ mạch,cái con MAX232 có tác dụng gì a.

conglong 03-09-2009 11:12 PM

Trích:

Nguyên văn bởi JohnnyNguyen (Post 29275)
hỏi về tutorial của thầy Nam.thầy cho em hỏi,cái câu lệnh:
ADCValue = ADCBUF0 >>1 //chi lay 9 bit cao nhat
tại sao chỉ lấy 9 bit cao nhất.em chưa hiểu rõ chỗ này.em mới đang tiếp cận ADC,mong thầy chỉ rõ cho.
cho em hỏi thêm về sơ đồ mạch,cái con MAX232 có tác dụng gì a.

Để loại bỏ sai số do nhiễu thôi bạn ah.

namqn 04-09-2009 12:00 AM

Trích:

Nguyên văn bởi conglong (Post 29256)
Thầy Nam và các anh chị trong diễn đàn cho em hỏi về dead time của dsPIC cái ah.
Ở hình 15-16 trang 360 mục Motor control PWM của tài liêu dsPIC Family Reference , họ có nói là trong lúc dead time thì mức tín hiệu ở hai chân PWMxH và PWMxL đều ở mức thấp (LOW), do mạch công suất của em (đã đặt và thi công mất rồi) nếu cả hai chân này đều ở mức thấp thì sẽ kích cả 2 nửa cầu H cùng lúc và xảy ra trùng dẫn, vậy trong dsPIC có cung cấp cho mình lựa chọn mức tín hiệu của 2 chân PWMxH và PWMxL trong lúc dead time không ah ?. cụ thể là em muốn mức tín hiệu của 2 chân PWM lúc dead time là mức cao (High).

Do sự cố trên nên trước mắt , em đang điều khiển động cơ mà không set dead time (dead time = 0 ) , nó vẫn chạy được nhưng FET rất nóng (do quá trình chuyển trạng thái của 2 mức tín hiệu trên cặp chân PWM không lý tưởng) nên sau đó một lúc (hơn 3 phút) bị chết FET.

Thầy và anh chị cho em hỏi câu nữa là trong thanh ghi FBORPOR ( BOR and POR Configuration Register) mục Device Configuration trang 710 của tài liêu dsPIC Family Reference có 2 bit là HPOL và LPOL, họ có giải thích nhưng em chưa hiểu rõ lắm về mục đích của 2 bit này, liệu có phải 2 bit này dùng để set trạng thái của chân PWM khi dead time không ah ?

Em xin chân thành cảm ơn !.
Trân trọng !.

Tài liệu vẽ minh họa cho trường hợp cả hai chân PWMxH và PWMxL là active-high (tích cực mức cao), do đó trong thời gian dead-time, cả hai chân này sẽ ở mức low (tức là ở trạng thái inactive).

Các bit HPOL và LPOL trong thanh ghi cấu hình FBORPOR cho phép chọn trạng thái tích cực của các chân PWMxH và PWMxL một cách tương ứng (nếu bạn không mô tả chúng thì mặc định là các bit này ở mức cao, tương ứng với các chân PWMxH và PWMxL là active-high). Bạn có thể thiết lập xóa các bit cấu hình này để các chân PWMxH và PWMxL là tích cực mức thấp (active-low), khi đó trong khoảng deadtime các chân PWMxH và PWMxL sẽ ở mức cao. Và kiểu logic này mới tương thích với mạch công suất của bạn.

Thân,


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

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