PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   điều chế độ rộng xung ra sin (SPWM) (http://www.picvietnam.com/forum/showthread.php?t=1487)

tienminh 04-09-2008 09:34 PM

Với dutycycle từ 5-95% thì tôi cũng đã lọc ra sin gần như hoàn hảo rồi, không bị méo chút nào nữa .
Từ PWM của PIC đưa qua IC driver đến cầu H dùng MOSFET sau đó dùng LC để lọc.
Tuy nhiên lúc thực nghiệm tôi lấy đại một cặp LC ra để thử chứ cũng chưa tính toán gì, kết quả là ra sin quá đẹp(chắc là gặp may).
Bác nào cho tôi hỏi, tính toán LC như thế nào để đạt được chất lượng dạng sóng cũng như biên độ đầu ra , đảm bảo hiệu suất cao nhất?
(tần số PWM=20KHz và V=+310Vdc, Tải tiêu thụ=200W mắc song song với tụ điện)

namqn 05-09-2008 04:49 PM

Trích:

Nguyên văn bởi tuoitrequaypha (Post 18617)
...
Khi muốn đảm bảo dạng sóng sine không bị biến dạng thì giá trị cực đại và cực tiểu của duty cycle được tính từ công thức sau:

max(dutycycle)= 1-6*td/T
min(dutycycle)=6*td/T

với td= dead time, T=chu kỳ PWM

Mỗ lấy ví dụ: chú dùng td=1us thì:
- Ở 20kHz PWM --> T=50us --> max(dutycycle)= 88%; min(dutycycle)=12%
- Ở 10kHz PWM --> T=100us --> max(dutycycle)= 94%; min(dutycycle)=6%

Các giá trị lớn hơn max hoặc nhỏ hơn min đều làm biến dạng sóng sine của chú. Đến đây chú thấy kết quả có phù hợp với phần đo đạc của chú chửa? :) Ở tần số PWM cao hơn, chẳng hạn 50kHz thì tình hình còn thê thảm hơn nữa với con PIC của chú :). Chú đã bắt đầu thấy hạn chế của con PIC trong giải thuật SPWM chưa? :)
...

Theo tôi, ý của datasheet như sau:

max(dutycycle) = 1 - 3*td/T
min(dutycycle) = 3*td/T

với td = dead time, T = chu kỳ PWM.

Thân,

cipralos 14-09-2008 10:59 PM

1 Attachment(s)
Anh namqn hỏi chút về pcpwm của pic18f4431. Trong chế độ hoạt động của complementary PWM, trong datasheet viết: "PDC0 register controls PWM1/PWM0 outputs", cái này có phải là trong một chu kỳ PWM, PWM0 sẽ ở mức cao trong suốt thời gian của duty cycle, sau đó chuyển xuống mức thấp, tiếp theo là khoảng thời gian deadtime, rồi PWM1 sẽ chuyển lên mức cao trong khoảng thời gian còn lại của chu kỳ?
Giả sử em muốn tạo ra dạng sóng sinpwm điều khiển cầu H, trong nửa đầu của chu kỳ sin, tín hiệu điều khiển lấy từ PWM0 (gồm nhiều chu kỳ xung pwm mang tín hiệu sin, trong suốt khoảng thời gian này PWM1 ở mức 0), sau đó đến deadtime, rồi đến bán kỳ sau của sin thì PWM0 ở mức 0, còn PWM 1 sẽ là tín hiệu điều khiển gồm nhiều chu kỳ xung PWM mang tín hiệu sin.. Em chưa rõ là pic18f4431 có hỗ trợ nào khác so với pic16f877A không?

namqn 15-09-2008 06:28 PM

Trích:

Nguyên văn bởi cipralos (Post 18827)
Anh namqn hỏi chút về pcpwm của pic18f4431. Trong chế độ hoạt động của complementary PWM, trong datasheet viết: "PDC0 register controls PWM1/PWM0 outputs", cái này có phải là trong một chu kỳ PWM, PWM0 sẽ ở mức cao trong suốt thời gian của duty cycle, sau đó chuyển xuống mức thấp, tiếp theo là khoảng thời gian deadtime, rồi PWM1 sẽ chuyển lên mức cao trong khoảng thời gian còn lại của chu kỳ?
Giả sử em muốn tạo ra dạng sóng sinpwm điều khiển cầu H, trong nửa đầu của chu kỳ sin, tín hiệu điều khiển lấy từ PWM0 (gồm nhiều chu kỳ xung pwm mang tín hiệu sin, trong suốt khoảng thời gian này PWM1 ở mức 0), sau đó đến deadtime, rồi đến bán kỳ sau của sin thì PWM0 ở mức 0, còn PWM 1 sẽ là tín hiệu điều khiển gồm nhiều chu kỳ xung PWM mang tín hiệu sin.. Em chưa rõ là pic18f4431 có hỗ trợ nào khác so với pic16f877A không?

Cũng trong đoạn đó của datasheet, có đoạn văn sau: "PWM1/3/5/7 are the main PWMs that are controlled by the PDCx registers and PWM0/2/4/6 are the complemented outputs." Như vậy PWM1 mới là tín hiệu chính trong cặp PWM1/PWM0 chứ không phải là PWM0 như bạn đã mô tả.

Hình 17-18 trong datasheet đã minh họa rõ ràng dead-time được thêm vào như thế nào.

Với dạng sóng tín hiệu điều khiển cho PWM1 và PWM0 mà bạn đặt yêu cầu, tôi cho là chế độ complementary không phù hợp.

Câu hỏi về sự khác nhau trong hỗ trợ của PIC18F4431 và PIC16F877A của bạn chưa rõ ràng. Không rõ bạn muốn so sánh về sự hỗ trợ cho những tính năng gì.

Thân,

cuongthinh 24-02-2009 03:31 PM

Trích:

Nguyên văn bởi tmtm (Post 18418)
Bác đừng nặng lời vậy. Em cũng chưa giải quyết được bài toán này, nhưng em có được đọc một tài liệu có liên quan mà vấn đề phức tạp hơn đã được giải quyết. Do vấn đề bản quyền nên em ko tiện up lên diễn đàn. Bác có thể vào link sau:
http://www2.hcmut.edu.vn/~nxbac/data/
tìm đến tài liệu có tên: QUANG_LVTN_hoanchinh.pdf

Bác tmtm ơi sao cái trang này giờ không vao được vậy? Em đang làm đồ án tốt nghiệp về món này mà kô có tài liệu. Bác có thể cho em link khác được không ạ?

truongqt 21-04-2009 11:29 PM

Bảng Sin
 
Bảng Sin được nêu trong bài này là làm thế nào mà có được vậy các bạn, ai biết ko chỉ giúp mình với, hay là chỉ cóp rồi sửa lại cái có sẵn. Ví dụ như ở trang 1, trong chuơng trình CCS có bảng sin 800 phần tử, vậy cách tìm ra chúng theo đúng yêu cầu, chẳng hạn với tuơng ứng tần số fx nào đó của sóng sin, thì thế nào? Mong các cao thủ chỉ giáo. Thanks. // ý mình là cách tìm ra các giá trị của bảng đó, 1 cách chính xác (vì nếu ko chính xác thì e...).

namqn 21-04-2009 11:51 PM

Trích:

Nguyên văn bởi truongqt (Post 25083)
Bảng Sin được nêu trong bài này là làm thế nào mà có được vậy các bạn, ai biết ko chỉ giúp mình với, hay là chỉ cóp rồi sửa lại cái có sẵn. Ví dụ như ở trang 1, trong chuơng trình CCS có bảng sin 800 phần tử, vậy cách tìm ra chúng theo đúng yêu cầu, chẳng hạn với tuơng ứng tần số fx nào đó của sóng sin, thì thế nào? Mong các cao thủ chỉ giáo. Thanks. // ý mình là cách tìm ra các giá trị của bảng đó, 1 cách chính xác (vì nếu ko chính xác thì e...).

Bạn có thể dùng MS Excel để tạo ra bảng dữ liệu trên. Cách làm đơn giản như sau:

- Chọn giá trị đỉnh, ví dụ là 400, khi đó bạn sẽ cộng thêm offset bằng giá trị đỉnh để các giá trị trong bảng luôn luôn không âm.

- Chọn số phần tử trong bảng, ví dụ là 1000

- Trong bảng tính, tạo ra một cột với các giá trị chỉ số chạy từ 0 đến 999 (1000 hàng, tương ứng với 1000 phần tử).

- Ở cột bên cạnh, nhập công thức tính giá trị = 400*sin(giá trị của ô bên trái*2*pi/1000) + 400. Chẳng hạn, giả thiết cột A chứa các chỉ số từ 0 đến 999, ô B1 sẽ có công thức = 400*sin(A1*2*pi/1000) + 400

Sau đó xuất cột B ra một tập tin văn bản, rồi cắt/dán vào mã nguồn, và thêm các dấu "," vào những vị trí cần thiết. Nếu dùng MATLAB thì có thể tự động xử lý toàn bộ phần định dạng, rồi xuất ra tập tin văn bản, sau đó chỉ cần cắt/dán vào mã nguồn.

Lập trình khéo hơn một chút thì chỉ cần lưu 1/4 bảng trên vào flash/ROM là đủ.

Thân,

truongqt 22-04-2009 12:14 AM

Hi
 
Thanks trưởng lão.

truongqt 22-04-2009 12:30 AM

Trích:

Nguyên văn bởi namqn (Post 25085)
Bạn có thể dùng MS Excel để tạo ra bảng dữ liệu trên. Cách làm đơn giản như sau:

- Chọn giá trị đỉnh, ví dụ là 400, khi đó bạn sẽ cộng thêm offset bằng giá trị đỉnh để các giá trị trong bảng luôn luôn không âm.

- Chọn số phần tử trong bảng, ví dụ là 1000

- Trong bảng tính, tạo ra một cột với các giá trị chỉ số chạy từ 0 đến 999 (1000 hàng, tương ứng với 1000 phần tử).

- Ở cột bên cạnh, nhập công thức tính giá trị = 400*sin(giá trị của ô bên trái*2*pi/1000) + 400. Chẳng hạn, giả thiết cột A chứa các chỉ số từ 0 đến 999, ô B1 sẽ có công thức = 400*sin(A1*2*pi/1000) + 400

Sau đó xuất cột B ra một tập tin văn bản, rồi cắt/dán vào mã nguồn, và thêm các dấu "," vào những vị trí cần thiết. Nếu dùng MATLAB thì có thể tự động xử lý toàn bộ phần định dạng, rồi xuất ra tập tin văn bản, sau đó chỉ cần cắt/dán vào mã nguồn.

Lập trình khéo hơn một chút thì chỉ cần lưu 1/4 bảng trên vào flash/ROM là đủ.

Thân,

Như vậy các giá trị ta đang tìm chính là giá trị tức thời của hàm
u=400+400*sin(2*pi*f_dieuche*t)
tại các thời điểm t = {0,1,2,....,998,999}
phải ko anh Nam.
Em băn khoăn vì sao biểu thức trong hàm sin anh viết: sin(A1*2*pi/1000), chia cho 1000 là sao vậy anh? Như vậy có phải tần số điều chế là (1/1000). Em chưa hiểu chỗ này.
Đáng lẽ phải thế này chứ: T_dieuche=sophantubangsin*T_pwm =1000*T_pwm
--> f_dieuche=1/T_dieuche = 1/(1000*T_pwm)= f_pwm/1000
Như vậy biểu thức trên phải là: công thức = 400*sin(A1*2*pi*f_pwm/1000) + 400
Anh coi giùm em với.

namqn 22-04-2009 12:44 AM

Trích:

Nguyên văn bởi truongqt (Post 25087)
Như vậy các giá trị ta đang tìm chính là giá trị tức thời của hàm
u=400+400*sin(2*pi*f_dieuche*t)
tại các thời điểm t = {0,1,2,....,998,999}
phải ko anh Nam.
Em băn khoăn vì sao biểu thức trong hàm sin anh viết: sin(A1*2*pi/1000), chia cho 1000 là sao vậy anh? Như vậy có phải tần số điều chế là (1/1000). Em chưa hiểu chỗ này.

Gọi f_sw là tần số chuyển mạch, tín hiệu được điều chế sẽ có tần số là f_sw/1000. Như vậy, các giá trị được tính toán là giá trị được lấy mẫu tại các khoảng đều nhau của hàm (trong ví dụ này một chu kỳ của tín hiệu được điều chế được chia thành 1000 khoảng lấy mẫu đều nhau):

u = 400 + 400*sin(2*pi*(f_sw/1000)*t)

Vì các giá trị của cột A chạy từ 0 đến 999, các giá trị của cột B sẽ chạy từ 400 + 400*sin(0) đến 400 + 400*sin(999*2*pi/1000), tức là vừa đúng một chu kỳ sóng sin (chú ý là sin(1000*2*pi/1000) = sin (0) = 0).

Thân,

truongqt 01-05-2009 03:17 PM

Điều chế Sin
 
3 Attachment(s)
1). Chương trình bác Nam sửa ở trang 1,#11, mình mô phỏng bằng proteus 7.4, code viết trong CCS 4.0.., kết quả mô phỏng chạy ra đúng như tính toán:
Tpwm=20us --> Fpwm=50KHz
Tsin = 16ms --> Fsin=62,5Hz.
Trong đó, mình dùng thẳng thạch anh 40MHz để tần số clock=40MHz. Mình gửi kèm file đã làm (tên file: PWM-truonglao.rar).

2). Thế nhưng khi mình điều chế sin Fsin= 50Hz:
Chọn: Fpwm=20KHz hay Tpwm=50us, theo cthuc Tpwm=4*(PTPER+1)/Fosc
suy ra: PTPER=49. (Thach anh Fosc = 4MHz)
Sóng sin có Fsin=50Hz --> so ptu bang sin = Fpwm:Fsin=20000:50=400 phần tử.
Như vậy:
Tpwm = 50us
Tsin = 20ms
Nhưng kết quả mô phỏng được:
Tpwm=50us ( tức Fpwm=20KHZ -> Fpwm đúng theo tính toán)
Tsin = 40ms --> Fsin = 25Hz (--> cái này như vậy là sai mất rồi)
Mình gửi kèm file đã làm các bạn xem (20KHzPWM-sin50Hz.rar).

3). Vì theo câu (2), khi mình điều chế Fsin=50Hz mà kết quả ra là 25Hz, nên mình đã đi điều chế Fsin=100Hz xem thử nó có ra tần số 50Hz ko. --> kết quả mô phỏng: điều chế Fsin=100Hz thì kết quả mô phỏng ra là 50Hz.
Gửi kèm file (20KHzPWM-sin100Hz.rar).

*** Mong các bạn xem và sớm giải thích giùm mình, ngày hnay mất 1 ngày mà vẫn chưa tìm ra cause.
// bổ sung thông tin CCS: mình cài CCS trong ổ đĩa G, nên nếu các bạn cài CCS trong ổ C thì phải chọn lại đường dẫn file devices và drivers cho chương trình thì mới complie được đó.

truongqt 01-05-2009 08:36 PM

Bảng sin
 
2 Attachment(s)
Gửi kèm luôn file excel tính bảng sin.
Bảng sin 200 tuơng ứng Fsin=100Hz
''' 400 ''' Fsin=50Hz

truongqt 02-05-2009 06:49 PM

Ủa sao ko thấy ai nói j zậy ta. Mọi người nghỉ lễ kĩ thế.

truongqt 02-05-2009 10:24 PM

Pwm
 
1 Attachment(s)
Thôi ko làm phiền các bác nữa nha. Mình nâng tần số thạch anh trong bài của mình lên 40MHz (bằng bài của anh Nam), đồng thời tính lại bảng sin cho khớp với thạch anh 40MHz này thì kết quả mô phỏng đã đúng rồi. Hi. Nhưng ko hiểu vì sao với thạch anh 4MHz thì kq mô phỏng ko đúng, với thạch anh 40MHz thì lại đúng, mà chắc ko cần quan tâm điều này làm j cho tốn calo. Hi. Sắp tới làm mạch thực rồi kiếm cái oscillo đo xem thế nào.
Chúc cả nhà vui.

//PS; nhân tiện cho mình hỏi: trong datasheet 18F4431 (hình dưới) ko đưa ra việc dùng thạch anh 40MHz, ko biết mình lắp mạch với 40MHz có được ko?

Trích:

Theo anh Nam:
Tôi dùng thạch anh 10 MHz và PLL, do đó tần số clock của PIC là 40 MHz
Cho em hỏi khai báo trong CCS để sử dụng đựoc tần số này anh Nam nha.

namqn 03-05-2009 01:38 AM

Trích:

Nguyên văn bởi truongqt (Post 25436)
...
Cho em hỏi khai báo trong CCS để sử dụng đựoc tần số này anh Nam nha.

Tôi không dùng CCS C, mà tài liệu hướng dẫn của trình dịch này cũng không đề cập đến chế độ HSPLL của một số PIC18. Dựa vào tập tin header của PIC18F4431, tôi đoán là bạn sẽ dùng giá trị H4 khi thiết lập cấu hình bộ dao động cho PIC trong CCS C. Bạn cũng có thể đọc thêm phần ví dụ của directive #use delay về một cách mô tả khác cho chế độ HSPLL.

Thân,


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