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)
-   -   Căn bản về dsPIC33 (http://www.picvietnam.com/forum/showthread.php?t=2134)

falleaf 16-03-2008 01:44 AM

Căn bản về dsPIC33
 
Bài 1: Bộ dao động của dsPIC33

1. Giới thiệu:

- dsPIC33 có 4 nguồn dao động (xem hình)
- Bộ PLL
- Bộ DOZE chạy ở chế độ tiết kiệm điện
- Bộ giám sát lỗi dao động FSCM (Fail Safe Clock Monitor)


Một lưu ý rằng, chu kỳ máy của dsPIC33 không giống với PIC. Dao động vào của PIC sử dụng 4 dao động để thực hiện 1 lệnh, trong khi đó bộ dao động vào của dsPIC33 thông qua bộ chia (nhân tần số) PLL, sau đó dùng 2 chu kỳ để thực hiện 1 lệnh.

Thông thường PIC cho phép dùng thạch anh 20MHz và chạy ở 5MIPS, trong khi đó dsPIC33 cho phép dao động FOSC tới 80MHz và chạy ở tối đa 40MIPS.



2. Cấu hình:

Việc cấu hình cho dsPIC33 tuân thủ các nguyên tắc sau:

Tần số mã lệnh:



FCY tương đương trực tiếp với MIPS (Million Instructions Per Second). Nghĩa là nếu FCY = 40MHz thì tương đương dsPIC33 chạy ở 40MIPS. Đây là tần số cho phép tối đa của dsPIC33.

Tần số dao động:



Tần số này đạt giá trị lớn nhất là 80MHz, dù cấu hình PLL hay sử dụng nguồn dao động kiểu gì đi nữa, các bạn cũng không được phép vượt quá tần số này.

Việc cấu hình PLL được cụ thể cho từng dòng dsPIC khác nhau, ở đây chúng ta lấy thí dụ dòng MC - Motor Control:


Nguồn dao động vào có thể là thạch anh hoặc bộ dao động (thường các bạn gọi là thạch anh 4 chân) hoặc là lấy nguồn dao động được tạo ra từ con chip khác. Ta gọi là nguồn dao động vào, tần số nguồn dao động vào được ký hiệu là . Bộ PLL là phần ở giữa của hình. PLL được cấu hình bởi các thanh ghi PLLPRE, PLLPOSTPLLDIV như trên hình.

Tần số dao động có thể được viết lại cụ thể như sau:



VCO là Voltage Control Output, ta không cần quan tâm tới thành phân này.

Hình trên mô tả cho chúng ta thấy, giả sử chúng ta muốn tạo tần số dao động FOSC là 80MHz (tần số tối đa) với thạch anh sử dụng là 10MHz, thì công việc của chúng ta là phải tính toán và cân đối các hệ số M, N1, N2. Khi đó chỉ việc thay thế nó và đặt vào các giá trị của PLLDIV, PLLPRE và PLLPOST.

Nhưng vấn đề của chúng ta, đó là việc giới hạn bởi các thông số ngõ ra và ngõ vào tại từng vị trí. Cụ thể là bao nhiêu thì các bạn nhìn vào hình đã thấy rõ.

Nếu dùng thạch anh hoặc dao động ngoại, các bạn không được phép sử dụng tần số nằm ngoài khoảng 1.6MHz đến 16MHz. Qua bộ chia PLLPRE, tần số không được vượt quá 0.8MHz đến 8MHz. Ở trước bộ chia PLLPOST không được nằm ngoài khoảng 100MHz đến 200MHz.

Oh, tới đây thì mọi việc đơn giản rồi. Nếu các bạn muốn dao động FOSC là x MHz, các bạn chỉ cần nhẩm tính N2, vì nó chỉ có thể là 2, 4, 8 sao cho giá trị trước khi qua bộ chia PLLPOST nằm trong khoảng 100MHz đến 200Mhz. Vậy là các bạn có một hệ số N2.

Bộ chia với hệ số M rất rộng, nằm từ 2 đến 513, nó tương đối linh động cho các bạn thực hiện các bộ chia. N1 cũng vậy, nó nằm từ 2 đến 33. Vậy chúng ta sẽ chọn N1 sao cho tần số dao động từ thạch anh vào sau PLLPRE nằm trong khoảng 0.8MHz tới 8MHz thế là ổn. Cuối cùng thì chúng ta chọn M.

Các bạn hãy ghi nhớ hình này vì nó rất quan trọng cho việc lựa chọn thạch anh và cấu hình PLL.


3. Vấn đề khi cấu hình:

Một điểm mà chúng ta cần phải chú ý thật kỹ mà Microchip khuyến cáo đó là tần số thạch anh hoặc nguồn dao động bất kỳ trước khi vào bộ chia PLL phải nằm trong khoảng 4MHz đến 8MHz. Nếu như nằm ngoài khoảng này, các bạn phải thực hiện theo các bước sau:
  1. Không dùng bộ chia PLL hoặc dùng dao động nội ngay khi khởi tạo.
  2. Sau khi khởi tạo xong thì cho phép thay đổi nguồn dao động, tính toán các hệ số PLL hoặc chọn cấu hình nguồn dao động
  3. Đổi sang nguồn dao đồng mình muốn sử dụng với bộ chia PLL phù hợp

Vd cụ thể đó là nếu các bạn dùng nguồn dao động là thạch anh 3MHz chứ không phải thạch anh 4MHz, các bạn phải tuân thủ các bước khởi tạo này để cấu hình dao động cho dsPIC33.


4. Lưu ý thường dùng:

Dao động XT: thạch anh 3-10MHz
Dao động HS: thạch anh 10 - 40MHz
Dao động EC: bộ dao động (thạch anh 4 chân hoặc lấy từ nguồn chip khác) từ 0.8 - 64MHz.

Khi có thời gian F sẽ cung cấp cho các bạn các cấu hình mẫu để các bạn chọn lựa cho các ứng dụng của mình. Tạm thời với bài viết cơ bản này, có lẽ các bạn đã nắm được cách cấu hình dao động cho chip của mình, và biết cách lựa chọn thạch anh phù hợp.

Chúc vui


Tài liệu tham khảo:
[1] Section 07. Oscillator - dsPIC33F FRM
[2] Datasheet dsPIC33F Motor Control Family

falleaf 21-03-2008 04:46 PM

Bài 2: Delay

Khi lập trình bằng C30, hoặc các trình dịch từ gcc, chúng ta chú ý rằng gcc không cung cấp hàm delay( ). Do vậy, chúng ta phải tự viết các hàm này.

Sau đây là một thí dụ, các bạn hãy thử phân tích thí dụ này để hiểu được cách viết một hàm delay như thế nào, tất nhiên các bạn hoàn toàn có thể sử dụng luôn hàm này.

Lưu ý khi sử dụng, hãy tính toán một cách kỹ lưỡng các giá trị đặt cho cấu hình của mình.


File delay.h:
Code:

// Thay đổi giá trị FCY để phù hợp với cấu hình của chip, tính bằng MIPS
#define FCY  16000000                                        //16 MIPS

void Delay( unsigned int delay_count );
void Delay_Us( unsigned int delayUs_count );

// Những cấu hình này thường dùng để khởi tạo LCD, nên để ở đây
#define Delay200uS_count  (FCY * 0.0002) / 1080
#define Delay_1mS_Cnt    (FCY * 0.001) / 2950
#define Delay_2mS_Cnt    (FCY * 0.002) / 2950
#define Delay_5mS_Cnt    (FCY * 0.005) / 2950
#define Delay_15mS_Cnt    (FCY * 0.015) / 2950
#define Delay_1S_Cnt      (FCY * 1) / 2950


File delay.c:
Code:

#include "delay.h"

unsigned int temp_count;

void Delay( unsigned int delay_count )
{
        temp_count = delay_count +1;
        asm volatile("outer: dec _temp_count");       
        asm volatile("cp0 _temp_count");
        asm volatile("bra z, done");
        asm volatile("do #3200, inner" );       
        asm volatile("nop");
        asm volatile("inner: nop");
        asm volatile("bra outer");
        asm volatile("done:");
}
       

void Delay_Us( unsigned int delayUs_count )
{
        temp_count = delayUs_count +1;
        asm volatile("outer1: dec _temp_count");       
        asm volatile("cp0 _temp_count");
        asm volatile("bra z, done1");
        asm volatile("do #1500, inner1" );       
        asm volatile("nop");
        asm volatile("inner1: nop");
        asm volatile("bra outer1");
        asm volatile("done1:");
}


falleaf 03-04-2008 01:22 AM

Bài 3: ADC 10/12-bit

Hoạt động ADC của các chip MCHP đều được mô tả như hình sau:


Quá trình lấy mấu ADC được thực hiện thông qua 2 quá trình: Sample (Lấy mẫu) và Conversion (Biến đổi). Quá trình này được mô tả đơn giản bằng việc dsPIC sẽ đóng khóa K để điện áp bên ngoài tích đủ vào một con tụ, sau đó mở khoá K để phân cách với mạch ngoài, và bắt đầu quá trình biến đổi từ Analog thành Digital.

Quá trình biến đổi được mô tả như hình dưới đây:



Vấn đề này quá đơn giản, vậy chúng ta cần tìm hiểu gì?

Chúng ta cần tìm hiểu:
  1. Làm thế nào để cấu hình hoạt động cho Module ADC để nó hoạt động theo ý ta muốn?
  2. Khi nào thì bắt đầu quá trình Sample (lấy mẫu), khi nào thì bắt đầu quá trình Conversion (biến đổi). Có những cách nào để tác động vào quá trình này?
  3. Sau khi chuyển đổi xong, làm thế nào ta lấy được kết quả và bỏ vào một thanh ghi bất kỳ mà ta muốn?

Thực tế là chúng ta muốn thế, nhắm mắt lại và kệ xừ mọi thứ, cái quan trọng là khi kết quả nằm trong một biến nào đó là xong. Người lập trình C lúc nào cũng mong muốn điều này, bởi nếu không thì họ đã lập trình với ASM30 mất rồi. Chúng ta sẽ tìm hiểu ở đây theo kiểu tư duy của người lập trình bằng ngôn ngữ cấp cao, nhưng sẽ hiểu đủ sâu để có thể làm việc với ASM30.

F đặt ra những câu hỏi theo thứ tự tư duy như bên dưới đây:

1. Thời gian Sample (Lấy mẫu) và Conversion (Biến đổi) là bao nhiêu?

Đơn giản cực, đôi khi các bạn không để ý, nhưng nó có ngay trong datasheet. F lấy thí dụ datasheet của dòng dsPIC33FJxxxMCxxx (DS70287A-page 319)


Vậy ở đây xuất hiện thêm một số khái niệm mà sau này để đơn giản, F viết là TAD và Tcy. Mối quan hệ giữa chúng? Làm sao để đặt được? Đây là câu hỏi tiếp theo và chúng ta sẽ giải quyết ngay dưới đây.


(còn tiếp, vì F chưa có thời gian viết xong)

Chúc vui

meishun 14-04-2008 11:08 AM

Xin các anh hướng dẫn thêm về cách thiết kế mạch cho dsPIC33: điện thế ngõ vào cho pic33fj, giao tiếp ngoại vi như thế nào cho an toàn? Nếu ta đưa diện thế 5V vào chân input thì có sao ko (vì PIC33F chỉ hoạt động ở 3V-3V6 thôi). Ngoài ra, nạp cho PIC33 như thế nào? em thấy sơ đồ chân có nhiều chân PGD và PGC. Ta cho đường ICSP đến cặp chân nào cũng được phải ko?

falleaf 18-04-2008 02:37 PM

Trích:

Nguyên văn bởi meishun (Post 15544)
Xin các anh hướng dẫn thêm về cách thiết kế mạch cho dsPIC33: điện thế ngõ vào cho pic33fj, giao tiếp ngoại vi như thế nào cho an toàn? Nếu ta đưa diện thế 5V vào chân input thì có sao ko (vì PIC33F chỉ hoạt động ở 3V-3V6 thôi). Ngoài ra, nạp cho PIC33 như thế nào? em thấy sơ đồ chân có nhiều chân PGD và PGC. Ta cho đường ICSP đến cặp chân nào cũng được phải ko?

Các bạn hãy tham khảo tài liệu Explorer 16 User Guide, ở phần cuối của tài liệu có mạch nguyên lý của mạch phát triển Explorer 16. Trong đó, các phần nguồn, phần mạch nạp, các phần ngoại vi liên quan cũng có thể xem thêm các PIC Tail dành cho Exp 16.

Tài liệu tham khảo tại đây:
http://ww1.microchip.com/downloads/e...e%2051589a.pdf (từ trang 37)

Chúc vui

duc thang 11-05-2008 02:29 PM

Bạn nào có link về mô tả cụ thể các lệnh của dsP33F (intruction set decription) giới thiệu mình với. Dataheeet ghi tóm tắt quá, nhiều lệnh mình đọc không hiểu kỹ.

namqn 12-05-2008 02:23 AM

Trích:

Nguyên văn bởi duc thang (Post 16122)
Bạn nào có link về mô tả cụ thể các lệnh của dsP33F (intruction set decription) giới thiệu mình với. Dataheeet ghi tóm tắt quá, nhiều lệnh mình đọc không hiểu kỹ.

Bạn đọc tài liệu sau (dsPIC30F/33F Programmer's Reference Manual):
http://ww1.microchip.com/downloads/e...Doc/70157C.pdf

Tài liệu này được tôi đề cập đến trong các tutorial về dsPIC30F (tutorial 2 chẳng hạn).

Thân,

hopeman 16-06-2008 12:15 PM

con 33FJ256GP710 khac 33FJ256GP710 the nao?
 
em đang làm mạch với con 33FJ256GP710 nhưng khi cắm mạch nạp vào nó lại nhận là 33FJ256MC710 ? nạp thì nó vẫn nạp nhưng không biết là có đúng ko? em muốn hỏi bang chủ là như thế có gì lỗi ko? và dòng MC và GP khác nhau thế nào ko?

hopeman 16-06-2008 12:31 PM

cấu hình cho con 33FJ256PG710
 
mình đang dùng thạch anh 10M. mình cũng đã đọc data sheet nhưng mà do là mới chuyển qua dùng MPLab C30 nên mình cũng ko biết cách thiết lập cấu hình như thế nào nữa (thấy dùng CCS sướng thôi rồi lun) . có bạn nào có thể cho mình 1 mẫu thiết lập cấu hình cho con 33FJ256GP710 này để nó chạy ở 40Mips ko nhỉ? xin chân thành cảm ơn trước . mà trên diễn đàn của mình cũng ưu ai code cho các em 30F quá nhỉ, tội nghiệp mấy em 33F

namqn 16-06-2008 06:31 PM

Trích:

Nguyên văn bởi hopeman (Post 16845)
mình đang dùng thạch anh 10M. mình cũng đã đọc data sheet nhưng mà do là mới chuyển qua dùng MPLab C30 nên mình cũng ko biết cách thiết lập cấu hình như thế nào nữa (thấy dùng CCS sướng thôi rồi lun) . có bạn nào có thể cho mình 1 mẫu thiết lập cấu hình cho con 33FJ256GP710 này để nó chạy ở 40Mips ko nhỉ? xin chân thành cảm ơn trước . mà trên diễn đàn của mình cũng ưu ai code cho các em 30F quá nhỉ, tội nghiệp mấy em 33F

Các thiết lập cấu hình mẫu có trong tập tin header tương ứng của chip (vào thư mục con "support\dsPIC33F\h" của thư mục cài đặt MPLAB C30, mở tập tin "p33FJ256GP710.h", tìm đoạn chú thích "Macros for setting device configuration registers"). Code của dsPIC30F hoàn toàn tương thích với dsPIC33F, bạn tham khảo các link dưới đây, và hãy rút lại phát biểu trên:
http://techtrain.microchip.com/webse..._p1_111605.pdf
http://techtrain.microchip.com/webse..._p2_111605.pdf

Thân,

meishun 19-06-2008 08:45 PM

Trích:

Nguyên văn bởi hopeman (Post 16844)
em đang làm mạch với con 33FJ256GP710 nhưng khi cắm mạch nạp vào nó lại nhận là 33FJ256MC710 ? nạp thì nó vẫn nạp nhưng không biết là có đúng ko? em muốn hỏi bang chủ là như thế có gì lỗi ko? và dòng MC và GP khác nhau thế nào ko?

trương hợp mạch nạp nhận sai chip thì tôi chưa từng gặp nên ko biết. Nhưng ép mạch nạp nạp con chip mà phần mềm ko hỗ trợ cho mạch nó thì tôi có làm thử. Nạp chạy tốt (vdụ mạch JDM va winpic800 v3.61 với PIC18F4685)
dsPIC33FJxxMCxx là dòng dsPIC Motor Control.
dsPIC33FJxxGPxx là dòng dsPIC General Purposes.
Bạn có thể dùng phần mềm MAPS của Microchip để so sánh các chip.

piano lover 04-08-2008 04:35 PM

Có huynh nào biết con IC nào có thể chuyển đổi điện áp từ chuẩn 3.3 v lên chuẩn TTL 5 v ko? và tần số chuyển tối thiểu 40MHz để tương thích với con 33F.

namqn 04-08-2008 05:10 PM

Trích:

Nguyên văn bởi piano lover (Post 17939)
Có huynh nào biết con IC nào có thể chuyển đổi điện áp từ chuẩn 3.3 v lên chuẩn TTL 5 v ko? và tần số chuyển tối thiểu 40MHz để tương thích với con 33F.

Tôi vẫn dùng 74LVC4245:
http://www.nxp.com/acrobat_download/...LVC4245A_6.pdf

Thân,

piano lover 05-08-2008 01:08 PM

Anh Nam, em thấy con này khá giống con 74HC245, liệu có thể thay thế con 74LVC4245 bằng con 74HC245 ko?

namqn 05-08-2008 05:44 PM

Trích:

Nguyên văn bởi piano lover (Post 17957)
Anh Nam, em thấy con này khá giống con 74HC245, liệu có thể thay thế con 74LVC4245 bằng con 74HC245 ko?

Vi mạch 74LVC4245 được đặc biệt thiết kế để giao tiếp giữa các hệ thống khác mức điện áp, và chỉ là bộ đệm hai chiều về mặt chức năng. Tuy nhiên, bạn không thể dùng 74HC245 thay cho vi mạch này, vì đơn giản 74HC245 chỉ có 1 rail nguồn, trong khi 74LVC4245 có 2 rail nguồn riêng biệt.

Thân,

laiquangtuyen 29-03-2009 11:09 PM

Luồng này đang hay chỗ giới thiệu bài giảng về DSPIC33, các bác hỏi lung tung cuối cùng đứt đoạn giữa chừng không ai chỉ nữa rồi! Tiếp tục đi, còn về phần DMA tui muốn tìm hiểu nhưng hok có ai chỉ nữa!

NTVinh 20-05-2009 10:23 AM

DSP khac DSC cho nao?
Cac cao thu cho minh hoi: Digital Signal Processor (DSP) khac voi Digital Signal Controller (DSC) nhu the nao?

robotden 01-06-2009 06:10 PM

anh namqn cho em hỏi chút xíu, dspic33 và dspic30 khác nhau chỗ nào vậy anh.
con nào mạnh về dsp hơn ạ
thank a

nhamdtk4 01-06-2009 06:16 PM

Các bác ơi, cho em hỏi: Sao ko thấy ai dùng CCS viết CT cho dsPIC vậy.

hopeman 02-06-2009 11:14 AM

Trích:

Nguyên văn bởi nhamdtk4 (Post 26359)
Các bác ơi, cho em hỏi: Sao ko thấy ai dùng CCS viết CT cho dsPIC vậy.

bởi vì CCS hỗ trợ dsPIC hơi chuối
bởi vì CCS ko phải là phần mềm miễn phí mà phải trả tiền bản quyền còn mpLab và C30 cho sinh viên hoàn toàn miễn phí
bởi vì trên PicVN ko ai dạy hướng dẫn viết ct cho dsPic bằng CCS cả :D

robotden 02-06-2009 04:36 PM

anh namqn cho em hỏi chút xíu, dspic33 và dspic30 khác nhau chỗ nào vậy anh.
con nào mạnh về dsp hơn ạ
thank a

namqn 02-06-2009 07:47 PM

Trích:

Nguyên văn bởi robotden (Post 26415)
anh namqn cho em hỏi chút xíu, dspic33 và dspic30 khác nhau chỗ nào vậy anh.
con nào mạnh về dsp hơn ạ
thank a

Các webinar của Microchip giới thiệu về kiến trúc của dsPIC33F thực chất sử dụng dsPIC30F làm nền tảng so sánh, do đó bạn sẽ nắm được sự khác biệt của chúng khi đọc các webinar này. Link của chúng dưới đây:

http://techtrain.microchip.com/webse...aspx?Active=98
http://techtrain.microchip.com/webse...aspx?Active=99

Nhờ vào nhiều cải tiến trong kiến trúc (DMA, 40 MIPS so với 30 MIPS, ...), dsPIC33F có lẽ sẽ thực hiện các phép toán DSP nhanh hơn so với các dsPIC30F.

Thân,

tungnh 02-06-2009 11:45 PM

Thêm nữa dòng dsPic33F tiết kiệm nặng lượng hơn nhiều so với dòng dsPic30F nếu chạy với tất độ như nhau.

robotden 04-06-2009 01:50 AM

thank các bác nhìu

robotden 05-06-2009 09:09 AM

help
 
các bác có biết chỗ bán dspic33f256mc710 k?
em đang cần?
thank

hopeman 05-06-2009 10:13 AM

nếu mua vài con để nghiên cứu,Em có thể qua bên PNLab www.pnlabvn.com , còn mua nhiều thì liên lạc với bên R&P

robotden 10-06-2009 11:09 AM

tài liệu lập trình dspic 33. xin chỉ giáo

robotden 16-06-2009 11:42 PM

bác namqn ơi cho em hỏi cái. em cấu hình cho dsPIC33Fj256GP710 la 40 MIPS, vậy trong khi mô phỏng bằng MPLABSIM thì phần Processor Freq đặt là 40Mhz hay là 80Mhz
thank

namqn 16-06-2009 11:53 PM

Trích:

Nguyên văn bởi robotden (Post 26848)
bác namqn ơi cho em hỏi cái. em cấu hình cho dsPIC33Fj256GP710 la 40 MIPS, vậy trong khi mô phỏng bằng MPLABSIM thì phần Processor Freq đặt là 40Mhz hay là 80Mhz
thank

Bạn đặt Processor Frequency là 80 MHz.

Thân,

robotden 17-06-2009 04:17 PM

em hiểu rùi. dsPIC33 thì Fcy=Fosc/2, cái Processcor Frequency đó là Fosc.
Thank a nam nhiều

robotden 26-06-2009 08:02 AM

trời , sao lâu quá mà không có ai vào diễn đàn này vậy,

namqn 26-06-2009 10:30 AM

Trích:

Nguyên văn bởi robotden (Post 27153)
trời , sao lâu quá mà không có ai vào diễn đàn này vậy,

Chào bạn,

Tôi không biết là có câu hỏi này dành cho tôi. Hơn nữa, hình của bạn mờ quá nên tôi không theo dõi được gì cả.

Thân,

aden 27-06-2009 08:58 AM

Trích:

Nguyên văn bởi namqn (Post 27159)
Chào bạn,

Tôi không biết là có câu hỏi này dành cho tôi. Hơn nữa, hình của bạn mờ quá nên tôi không theo dõi được gì cả.

Thân,

dạ,đại loại ý em là em làm phần cứng cho con pic33fj256gp710, giữa các chân nguồn và đất của nó em có thêm tụ 104, chân Vcore cũng có 1 tụ hóa, khối nguồn 3.3v cũng có tụ lọc, em dùng XTAL8Mhz,tụ cho thạch anh là 22pF
như vậy mạch có đủ chạy ổn đi
thank a

thanhgand 25-08-2009 05:29 PM

bản đồ chân của họ 33f
 
cho em hỏi câu này mọi người ơi.sao em không thấy cấu hình chân I2C.em đã tìm trong cả hai bảng selectable input sources và output selection for remappable pin.Có phải nó được cấu hình như SPI không.nếu như vậy chọn chế độ master/slave thế nào.

JohnnyNguyen 27-08-2009 11:24 PM

cho em hỏi cái.khi điều chế sóng sin băng PWM trong dspic33 cách cập nhật duty cycle cho PWM vào thanh ghi PxDCy để xuất ra xung thì dùng công thức nào vậy.

namqn 29-08-2009 02:16 PM

Trích:

Nguyên văn bởi JohnnyNguyen (Post 29030)
cho em hỏi cái.khi điều chế sóng sin băng PWM trong dspic33 cách cập nhật duty cycle cho PWM vào thanh ghi PxDCy để xuất ra xung thì dùng công thức nào vậy.

Từ bảng 14-2 trong section "14 - Motor Control PWM" (DS70187B) của "dsPIC33F Family Reference Manual", có thể suy ra công thức tính duty cycle (cho edge-aligned PWM):

duty cycle = (PxDCy)/(2*PxTPER + 2)

Công thức trên cũng dùng được trong trường hợp có dùng prescaler, vì giá trị prescale bị triệt tiêu khi lập tỷ số.

Thân,

JohnnyNguyen 30-08-2009 03:02 PM

em cũng hiểu công thức đó.nhưng trong 1 ví dụ có viêt như sau:
Code:

#include <p33fj12mc202.h>
#include <pwm.h>
#include <pwm12.h>
#define Ts 1249
#define hs 0.5
_FOSCSEL(FNOSC_PRIPLL&IESO_OFF);//dung dao dong ngoai co bo PLL
_FOSC(FCKSM_CSDCMD&OSCIOFNC_OFF&POSCMD_XT);//chon che do XT
_FWDT(FWDTEN_OFF);//tat watchdog
_FPOR(PWMPIN_ON&HPOL_ON&LPOL_ON);//cac chan ra dieu khien boi PORT luc reset,deu co the cao
unsigned char i=0;
unsigned char j=0;
unsigned int const sin_table[40]={0,98,195,291,386,478,567,653,734,811,883,950,1010,1065,1113,1154,1188,1214,1234,1245,1249,
                                                                  1245,1234,1214,1188,1154,1113,1065,1010,950,883,811,734,653,567,478,386,291,195,98};
void Init_PWM(void);
int main(void)
{ PLLFBD = 41;
  _PLLPOST = 0;
  _PLLPRE = 0;
  while (_COSC !=0b011);//dung bo PLL tao Fosc=80MHz,cho cho dao dong on dinh
  while (_LOCK !=1);//cho PLL bat dau khoa pha
  TRISB=0X0000;
  LATB=0X0000;
  Init_PWM();
while(1);
}
void Init_PWM(void)
{
P1TCONbits.PTMOD = 0b10;//continuous up/down cout mode
P1TCONbits.PTCKPS = 0b01;//prescale 4Tcy
P1TCONbits.PTOPS = 0b0000;//postscale 1:1
P1TPER = Ts;//Fpwn = 4kHz
PWM1CON1bits.PMOD1=0;//complementary mode
PWM1CON1bits.PMOD2=0;
PWM1CON1bits.PEN2H=1;//enable for PWM output
PWM1CON1bits.PEN1H=1;
PWM1CON1bits.PEN2L=1;
PWM1CON1bits.PEN1L=1;
PWM1CON2bits.IUE=0;
PWM2CON2bits.UDIS=0;//update from duty cycle and period buffer registers are enabled
P1DTCON1bits.DTAPS=0b00;//Dead time prescale 1:1
P1DTCON1bits.DTA = 40;//deadtime = 1um
//P1DTCON1bits.DTBPS=0b00;
//P1DTCON1bits.DTB = 0;
P1DTCON2bits.DTS2A=0;//Unit A selected for PWM active transitions
P1DTCON2bits.DTS1A=0;
P1DTCON2bits.DTS1I=0;//Unit B selected for PWM inactive transitions
P1DTCON2bits.DTS2I=0;
P1OVDCONbits.POVD2H=1;//PWM I/O pin controlled by PWM generator
P1OVDCONbits.POVD1H=1;
P1OVDCONbits.POVD2L=1;
P1OVDCONbits.POVD1L=1;
P1DC1=0;
P1DC2=0;
_PWM1IF=0;
_PWM1IE=1;
P1TCONbits.PTEN=1;
}
void __attribute__((interrupt,auto_psv)) _MPWM1Interrupt(void)
{
_PWM1IF=0;
if (i==0)
{ P1DC1 = (unsigned int)(Ts - sin_table[j])*hs;
  P1DC2 = (unsigned int)(Ts + sin_table[j])*hs;
  j++;
  if (j==40) {j=0;i=1;};
}
else
{ P1DC1 = (unsigned int)(Ts + sin_table[j])*hs;
  P1DC2 = (unsigned int)(Ts - sin_table[j])*hs;
  j++;
  if (j==40) {j=0;i=0;};
}
}

em thắc mắc cái công thức tính PDC ở đây.hệ số hs=0,5 tính ra trc như thế nào ạ

namqn 30-08-2009 04:58 PM

Trích:

Nguyên văn bởi JohnnyNguyen (Post 29112)
em cũng hiểu công thức đó.nhưng trong 1 ví dụ có viêt như sau:
Code:

#include <p33fj12mc202.h>
#include <pwm.h>
#include <pwm12.h>
#define Ts 1249
#define hs 0.5
_FOSCSEL(FNOSC_PRIPLL&IESO_OFF);//dung dao dong ngoai co bo PLL
_FOSC(FCKSM_CSDCMD&OSCIOFNC_OFF&POSCMD_XT);//chon che do XT
_FWDT(FWDTEN_OFF);//tat watchdog
_FPOR(PWMPIN_ON&HPOL_ON&LPOL_ON);//cac chan ra dieu khien boi PORT luc reset,deu co the cao
unsigned char i=0;
unsigned char j=0;
unsigned int const sin_table[40]={0,98,195,291,386,478,567,653,734,811,883,950,1010,1065,1113,1154,1188,1214,1234,1245,1249,
                                                                  1245,1234,1214,1188,1154,1113,1065,1010,950,883,811,734,653,567,478,386,291,195,98};
void Init_PWM(void);
int main(void)
{ PLLFBD = 41;
  _PLLPOST = 0;
  _PLLPRE = 0;
  while (_COSC !=0b011);//dung bo PLL tao Fosc=80MHz,cho cho dao dong on dinh
  while (_LOCK !=1);//cho PLL bat dau khoa pha
  TRISB=0X0000;
  LATB=0X0000;
  Init_PWM();
while(1);
}
void Init_PWM(void)
{
P1TCONbits.PTMOD = 0b10;//continuous up/down cout mode
P1TCONbits.PTCKPS = 0b01;//prescale 4Tcy
P1TCONbits.PTOPS = 0b0000;//postscale 1:1
P1TPER = Ts;//Fpwn = 4kHz
PWM1CON1bits.PMOD1=0;//complementary mode
PWM1CON1bits.PMOD2=0;
PWM1CON1bits.PEN2H=1;//enable for PWM output
PWM1CON1bits.PEN1H=1;
PWM1CON1bits.PEN2L=1;
PWM1CON1bits.PEN1L=1;
PWM1CON2bits.IUE=0;
PWM2CON2bits.UDIS=0;//update from duty cycle and period buffer registers are enabled
P1DTCON1bits.DTAPS=0b00;//Dead time prescale 1:1
P1DTCON1bits.DTA = 40;//deadtime = 1um
//P1DTCON1bits.DTBPS=0b00;
//P1DTCON1bits.DTB = 0;
P1DTCON2bits.DTS2A=0;//Unit A selected for PWM active transitions
P1DTCON2bits.DTS1A=0;
P1DTCON2bits.DTS1I=0;//Unit B selected for PWM inactive transitions
P1DTCON2bits.DTS2I=0;
P1OVDCONbits.POVD2H=1;//PWM I/O pin controlled by PWM generator
P1OVDCONbits.POVD1H=1;
P1OVDCONbits.POVD2L=1;
P1OVDCONbits.POVD1L=1;
P1DC1=0;
P1DC2=0;
_PWM1IF=0;
_PWM1IE=1;
P1TCONbits.PTEN=1;
}
void __attribute__((interrupt,auto_psv)) _MPWM1Interrupt(void)
{
_PWM1IF=0;
if (i==0)
{ P1DC1 = (unsigned int)(Ts - sin_table[j])*hs;
  P1DC2 = (unsigned int)(Ts + sin_table[j])*hs;
  j++;
  if (j==40) {j=0;i=1;};
}
else
{ P1DC1 = (unsigned int)(Ts + sin_table[j])*hs;
  P1DC2 = (unsigned int)(Ts - sin_table[j])*hs;
  j++;
  if (j==40) {j=0;i=0;};
}
}

em thắc mắc cái công thức tính PDC ở đây.hệ số hs=0,5 tính ra trc như thế nào ạ

Công thức mà tôi đã nêu dùng để liên hệ giá trị duty cycle với giá trị của hai thanh ghi PxDCy và PxTPER. Còn vấn đề bạn đang thắc mắc ở đây lại là thuật toán điều khiển (bạn chọn quy luật điều chỉnh duty cycle để đạt ý đồ điều khiển).

Do đó, bạn nên hỏi tác giả của ví dụ đó về hệ số hs.

Thân,

JohnnyNguyen 30-08-2009 05:58 PM

đây là chương trình điều chế sóng sin.em xin nói qua về chương trình như sau:
sin_table[40] là bảng tạo sóng sin ở nửa chu kỳ.em đã hiểu hệ số 0,5 ở đây là để xét trong nửa chu kỳ.nửa chu kỳ đầu duty cycle dc cập nhật tại PDC1,nửa chu kỳ sau tại PDC2.
nếu bảng sóng sin ở trên đc viết cho cả chu kỳ, thì công thức là

P1DC1 = (unsigned int)(Ts + sin_table[j])
(vơi sin_table[j] là điện áp lấy mẫu,Ts là giá trị PTPER)
em thắc mắc ở đây là làm thế nào để có công thức như vậy ạ.

spin 01-09-2009 10:00 AM

Trích:

Nguyên văn bởi hopeman (Post 16844)
em đang làm mạch với con 33FJ256GP710 nhưng khi cắm mạch nạp vào nó lại nhận là 33FJ256MC710 ? nạp thì nó vẫn nạp nhưng không biết là có đúng ko? em muốn hỏi bang chủ là như thế có gì lỗi ko? và dòng MC và GP khác nhau thế nào ko?

hopeman ơi cho hỏi một tí, mình cũng đang dùng con này nhưng chưa biết cách nạp cho nó ra sao, cụ tỉ chân cắm thế nào, bạn có thể cho xin mạch nguyên lý để nạp 1 chương trình đơn giản không.. cảm ơn ..


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