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)

tuananh_852003 08-09-2007 10:17 AM

điều chế độ rộng xung ra sin (SPWM)
 
các bác ơi giúp em với.em mới tìm hiểu về pic và em đang mắc ở chỗ làm sao điều chế pwm có dạng sỏng ra là sin.nếu bác nào có tài liệu về nó hoặc có đoạn ma chương trinh hướng dẫn em với. em đang làm việc với pic18f4431.
Em cảm ơn các bác !

tienminh 25-08-2008 07:16 PM

Trích:

Nguyên văn bởi tuananh_852003 (Post 11222)
các bác ơi giúp em với.em mới tìm hiểu về pic và em đang mắc ở chỗ làm sao điều chế pwm có dạng sỏng ra là sin.nếu bác nào có tài liệu về nó hoặc có đoạn ma chương trinh hướng dẫn em với. em đang làm việc với pic18f4431.
Em cảm ơn các bác !

Tôi nghĩ đây là kiểu chương trình bạn cần .
Tôi cũng tranh thủ hỏi luôn các bạn thành thạo về PWM của PIC8F4431:
- Chương trình này dùng cặp PWM0-1 của chip, tra bảng sin để đặt dutycycle .
- Khi chạy chương trình thì dạng sóng đầu ra biến đổi độ rộng theo chu kỳ sine , tuy nhiên sau khi chạy 1-2 phút thì nó tịt, không phát xung nữa, không biết tại sao??????????

sau đây là code viết trong C18


Code:

#include<p18f4431.h>
#include<delays.h>

#pragma config        OSC=HS
/*
#pragma config        FCMEN = ON
#pragma config        PWRTEN = ON
#pragma config        BOREN = ON
#pragma config        BORV = 42
#pragma config        WDTEN = OFF
#pragma config        WINEN = OFF
#pragma config        WDPS = 64
#pragma config        T1OSCMX = OFF
#pragma config        STVREN = OFF
#pragma config        LVP = OFF
#pragma config        CP3 = ON
*/
const rom unsigned int  sine[800]={
400 , 403 , 406 , 409 , 412 , 415 , 418 , 421 , 425 , 428 , 431 , 434 , 437 , 440 , 443 ,
447 , 450 , 453 , 456 , 459 , 462 , 465 , 468 , 471 , 474 , 478 , 481 , 484 , 487 , 490 ,
493 , 496 , 499 , 502 , 505 , 508 , 511 , 514 , 517 , 520 , 523 , 526 , 529 , 532 , 535 ,
538 , 541 , 544 , 547 , 550 , 553 , 555 , 558 , 561 , 564 , 567 , 570 , 573 , 575 , 578 ,
581 , 584 , 587 , 589 , 592 , 595 , 598 , 600 , 603 , 606 , 608 , 611 , 614 , 616 , 619 ,
622 , 624 , 627 , 630 , 632 , 635 , 637 , 640 , 642 , 645 , 647 , 650 , 652 , 654 , 657 ,
659 , 662 , 664 , 666 , 669 , 671 , 673 , 676 , 678 , 680 , 682 , 685 , 687 , 689 , 691 ,
693 , 695 , 697 , 700 , 702 , 704 , 706 , 708 , 710 , 712 , 714 , 716 , 717 , 719 , 721 ,
723 , 725 , 727 , 729 , 730 , 732 , 734 , 736 , 737 , 739 , 741 , 742 , 744 , 745 , 747 ,
748 , 750 , 752 , 753 , 754 , 756 , 757 , 759 , 760 , 761 , 763 , 764 , 765 , 767 , 768 ,
769 , 770 , 771 , 773 , 774 , 775 , 776 , 777 , 778 , 779 , 780 , 781 , 782 , 783 , 784 ,
784 , 785 , 786 , 787 , 788 , 788 , 789 , 790 , 791 , 791 , 792 , 792 , 793 , 794 , 794 ,
795 , 795 , 796 , 796 , 796 , 797 , 797 , 797 , 798 , 798 , 798 , 799 , 799 , 799 , 799 ,
799 , 799 , 799 , 799 , 799 , 800 , 799 , 799 , 799 , 799 , 799 , 799 , 799 , 799 , 799 ,
798 , 798 , 798 , 797 , 797 , 797 , 796 , 796 , 796 , 795 , 795 , 794 , 794 , 793 , 792 ,
792 , 791 , 791 , 790 , 789 , 788 , 788 , 787 , 786 , 785 , 784 , 784 , 783 , 782 , 781 ,
780 , 779 , 778 , 777 , 776 , 775 , 774 , 773 , 771 , 770 , 769 , 768 , 767 , 765 , 764 ,
763 , 761 , 760 , 759 , 757 , 756 , 754 , 753 , 752 , 750 , 748 , 747 , 745 , 744 , 742 ,
741 , 739 , 737 , 736 , 734 , 732 , 730 , 729 , 727 , 725 , 723 , 721 , 719 , 717 , 716 ,
714 , 712 , 710 , 708 , 706 , 704 , 702 , 700 , 697 , 695 , 693 , 691 , 689 , 687 , 685 ,
682 , 680 , 678 , 676 , 673 , 671 , 669 , 666 , 664 , 662 , 659 , 657 , 654 , 652 , 650 ,
647 , 645 , 642 , 640 , 637 , 635 , 632 , 630 , 627 , 624 , 622 , 619 , 616 , 614 , 611 ,
608 , 606 , 603 , 600 , 598 , 595 , 592 , 589 , 587 , 584 , 581 , 578 , 575 , 573 , 570 ,
567 , 564 , 561 , 558 , 555 , 553 , 550 , 547 , 544 , 541 , 538 , 535 , 532 , 529 , 526 ,
523 , 520 , 517 , 514 , 511 , 508 , 505 , 502 , 499 , 496 , 493 , 490 , 487 , 484 , 481 ,
478 , 474 , 471 , 468 , 465 , 462 , 459 , 456 , 453 , 450 , 447 , 443 , 440 , 437 , 434 ,
431 , 428 , 425 , 421 , 418 , 415 , 412 , 409 , 406 , 403 , 399 , 396 , 393 , 390 , 387 ,
384 , 381 , 378 , 374 , 371 , 368 , 365 , 362 , 359 , 356 , 352 , 349 , 346 , 343 , 340 ,
337 , 334 , 331 , 328 , 325 , 321 , 318 , 315 , 312 , 309 , 306 , 303 , 300 , 297 , 294 ,
291 , 288 , 285 , 282 , 279 , 276 , 273 , 270 , 267 , 264 , 261 , 258 , 255 , 252 , 249 ,
246 , 244 , 241 , 238 , 235 , 232 , 229 , 226 , 224 , 221 , 218 , 215 , 212 , 210 , 207 ,
204 , 201 , 199 , 196 , 193 , 191 , 188 , 185 , 183 , 180 , 177 , 175 , 172 , 169 , 167 ,
164 , 162 , 159 , 157 , 154 , 152 , 149 , 147 , 145 , 142 , 140 , 137 , 135 , 133 , 130 ,
128 , 126 , 123 , 121 , 119 , 117 , 114 , 112 , 110 , 108 , 106 , 104 , 102 , 99 , 97 , 95 ,
93 , 91 , 89 , 87 , 85 , 83 , 82 , 80 , 78 , 76 , 74 , 72 , 70 , 69 , 67 , 65 , 63 , 62 , 60 ,
58 , 57 , 55 , 54 , 52 , 51 , 49 , 47 , 46 , 45 , 43 , 42 , 40 , 39 , 38 , 36 , 35 , 34 , 32 ,
31 , 30 , 29 , 28 , 26 , 25 , 24 , 23 , 22 , 21 , 20 , 19 , 18 , 17 , 16 , 15 , 15 , 14 , 13 ,
12 , 11 , 11 , 10 , 9 , 8 , 8 , 7 , 7 , 6 , 5 , 5 , 4 , 4 , 3 , 3 , 3 , 2 , 2 , 2 , 1 , 1 , 1 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 2 , 2 , 2 , 3 , 3 , 3 ,
4 , 4 , 5 , 5 , 6 , 7 , 7 , 8 , 8 , 9 , 10 , 11 , 11 , 12 , 13 , 14 , 15 , 15 , 16 , 17 , 18 ,
19 , 20 , 21 , 22 , 23 , 24 , 25 , 26 , 28 , 29 , 30 , 31 , 32 , 34 , 35 , 36 , 38 , 39 ,
40 , 42 , 43 , 45 , 46 , 47 , 49 , 51 , 52 , 54 , 55 , 57 , 58 , 60 , 62 , 63 , 65 , 67 ,
69 , 70 , 72 , 74 , 76 , 78 , 80 , 82 , 83 , 85 , 87 , 89 , 91 , 93 , 95 , 97 , 99 , 102 ,
104 , 106 , 108 , 110 , 112 , 114 , 117 , 119 , 121 , 123 , 126 , 128 , 130 , 133 ,
135 , 137 , 140 , 142 , 145 , 147 , 149 , 152 , 154 , 157 , 159 , 162 , 164 , 167 ,
169 , 172 , 175 , 177 , 180 , 183 , 185 , 188 , 191 , 193 , 196 , 199 , 201 , 204 ,
207 , 210 , 212 , 215 , 218 , 221 , 224 , 226 , 229 , 232 , 235 , 238 , 241 , 244 ,
246 , 249 , 252 , 255 , 258 , 261 , 264 , 267 , 270 , 273 , 276 , 279 , 282 , 285 ,
288 , 291 , 294 , 297 , 300 , 303 , 306 , 309 , 312 , 315 , 318 , 321 , 325 , 328 ,
331 , 334 , 337 , 340 , 343 , 346 , 349 , 352 , 356 , 359 , 362 , 365 , 368 , 371 ,
374 , 378 , 381 , 384 , 387 , 390 , 393 , 396  };
unsigned int index=0;
void set_duty0(unsigned int duty);

void setupPWM(void)
{
PTCON0=0x00; //Postscale 1:1, Prescale 1:1, Free Running
PTCON1=0xC0;//PWM time base is on, count up
PWMCON0=0x20;//Enable PWM0-1, Complementary
PWMCON1=0x40;
DTCON=0x00;

PTMRH=0;
PTMRL=0;

PTPERH=0;
PTPERL=0xC7; // 20KHz PWM

PDC0H=0x00;
PDC0L=0x00;//duty
/*
PDC1H=0;
PDC1L=0;
PDC2H=0;
PDC2L=0;
PDC3H=0;
PDC3L=0;
OVDCOND=0;
OVDCONS=0;
FLTCONFIG=0;
SEVTCMPH=0;
SEVTCMPL=0;
*/
}
void set_duty0(unsigned int duty)
{
PTCON1=0x00;
PDC0H=duty/256;
PDC0L=duty%256;
PTCON1=0xC0;
}
void main()
{
TRISA=0x00;
ANSEL0=0x00;
setupPWM();

while(1)
{

        set_duty0(sine[index]);
        index++;
        if(index==800)index=0;
        Delay1KTCYx(1);

}
}


tienminh 27-08-2008 12:50 PM

Với chương trình cấu trúc như trên tôi chạy trên AT90PWM2 thì thấy chạy tốt , ra sine hoàn hảo. Còn trên PIC18F4431 thì có vấn đề gì đó trong update dutycycle làm cho độ rộng xung ra chỉ chạy được một chút rồi nó cố định duty cycle luôn không biết đổi nữa.
Có thể đây thể hiện sự yếu kém của 18F4431 chăng?

namqn 27-08-2008 07:38 PM

Trích:

Nguyên văn bởi tienminh (Post 18407)
Với chương trình cấu trúc như trên tôi chạy trên AT90PWM2 thì thấy chạy tốt , ra sine hoàn hảo. Còn trên PIC18F4431 thì có vấn đề gì đó trong update dutycycle làm cho độ rộng xung ra chỉ chạy được một chút rồi nó cố định duty cycle luôn không biết đổi nữa.
Có thể đây thể hiện sự yếu kém của 18F4431 chăng?

Code của bạn chỉ đặt mỗi cấu hình HS cho bộ dao động, còn những phần cấu hình khác đã bị chú thích.

Có thể kết luận gì khi nhiều người làm thành công và một người không thành công?

Thân,

tienminh 27-08-2008 09:49 PM

Trích:

Nguyên văn bởi namqn (Post 18414)
Code của bạn chỉ đặt mỗi cấu hình HS cho bộ dao động, còn những phần cấu hình khác đã bị chú thích.

Có thể kết luận gì khi nhiều người làm thành công và một người không thành công?

Thân,

Có chú thích cấu hình hay không cũng chẳng khác gì, vẫn chỉ chạy được một chút rồi nó cố định luôn độ rộng xung không biến đổi nữa.
Tôi không thích cách gợi ý xỏ xiên của người được mệnh danh là bang chủ PIC, đây là cách lôi kéo người khác đến với PIC của picvietnam?

tmtm 27-08-2008 10:07 PM

Trích:

Nguyên văn bởi tienminh (Post 18417)
Có chú thích cấu hình hay không cũng chẳng khác gì, vẫn chỉ chạy được một chút rồi nó cố định luôn độ rộng xung không biến đổi nữa.
Tôi không thích cách gợi ý xỏ xiên của người được mệnh danh là bang chủ PIC, đây là cách lôi kéo người khác đến với PIC của picvietnam?

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

tienminh 27-08-2008 10:34 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

Cảm ơn bạn đã cung cấp thông tin, trong LV này tôi đã xem trước đây và thấy rằng nó chưa thật giống với mục đích của tôi, tôi muốn tạo ra tín hiệu sine chuẩn có độ mịn cao nên cần một bộ tạo PWM có thời gian update nhanh, số bit lớn, và kèm theo tính năng tạo deadtime cho cầu H.
Hiện nay chỉ thấy có PIC và AVR là tạo deadtime tin cậy mà lại phổ biến .
Tôi làm mạch thực tế và thấy thời gian update dutycycle của hai loại là khác nhau, với PIC4431 thời gian update 50us là chạy không ổn định lắm , sau một lúc sẽ đứng im không phát xung nữa.
Một chút so sánh của tôi trong trường hợp tạo SPWM giữa hai loại:
- PIC18F4431 có 4 kênh PWM , AT90PWM có 2 hoặc 3 bộ
- Clock đầu vào cực đại PWM của PIC4431 là 10MHz (PLLx4) và của AT90 là 60MHz
- Đều có tạo deadtime linh động
Tôi thực sự rất muốn dùng PIC4431 trong trường hợp này, và tôi nghĩ rằng chương trình tôi viết cơ bản là đúng, có bác nào nhìn thấy sai sót mong các bác chỉ bảo trên cơ sở giúp đỡ thực sự .thanks

namqn 27-08-2008 10:59 PM

Trích:

Nguyên văn bởi tienminh (Post 18417)
Có chú thích cấu hình hay không cũng chẳng khác gì, vẫn chỉ chạy được một chút rồi nó cố định luôn độ rộng xung không biến đổi nữa.
Tôi không thích cách gợi ý xỏ xiên của người được mệnh danh là bang chủ PIC, đây là cách lôi kéo người khác đến với PIC của picvietnam?

Bạn tham gia diễn đàn cách đây gần 2 năm mà vẫn không hiểu được ý của tôi.

Nếu nhiều người đã làm thành công mà một người nào đó làm không thành công thì khả năng rất lớn là người không thành công đó làm chưa đúng, và khả năng rất nhỏ là chip được dùng có sự yếu kém về vấn đề đó.

Tôi sẽ rất vô lý nếu tôi kết luận rằng một vi điều khiển nào đó là yếu kém, vì chương trình của tôi viết cho nó không chạy đúng ý đồ của tôi, trong khi nhiều người khác đã làm được việc đó.

Nếu bạn thích làm việc với PIC, hoan nghênh bạn gia nhập PICVietnam, nếu bạn không thích làm việc với PIC, chúng tôi không hề ghét bạn.

Về vấn đề của bạn, tôi không có sẵn PIC18F4431 để kiểm tra code mà tôi đã sửa lại (và tôi có thói quen chỉ post những code đã được thử nghiệm), do đó bạn hãy chờ một vài ngày để tôi tìm con PIC18F4431 và mạch thử nghiệm trong đống linh kiện lộn xộn của tôi.

Thân,

namqn 28-08-2008 12:15 AM

Trích:

Nguyên văn bởi tienminh (Post 18419)
...
Một chút so sánh của tôi trong trường hợp tạo SPWM giữa hai loại:
- PIC18F4431 có 4 kênh PWM , AT90PWM có 2 hoặc 3 bộ
- Clock đầu vào cực đại PWM của PIC4431 là 10MHz (PLLx4) và của AT90 là 60MHz
- Đều có tạo deadtime linh động
Tôi thực sự rất muốn dùng PIC4431 trong trường hợp này, và tôi nghĩ rằng chương trình tôi viết cơ bản là đúng, có bác nào nhìn thấy sai sót mong các bác chỉ bảo trên cơ sở giúp đỡ thực sự .thanks

Nếu bạn muốn nói đến duty cycle thì clock của PIC18F4431 là 40 MHz nếu tần số xung nhịp cho CPU là 40 MHz. Clock cho bộ timer tạo chu kỳ thì được lấy từ clock thực thi lệnh (có tần số = tần số xung nhịp/4), nhưng thanh ghi xác định duty cycle lại được so sánh với số đếm của timer kết hợp với các Q-bit. Do đó, độ phân giải của duty cycle cao hơn độ phân giải của bộ đếm timer 4 lần. Bạn hãy xem hình 17-11 trong datasheet của PIC18F4431.

Chương trình bạn viết có những chỗ sai cơ bản, tôi thử nghiệm code sửa đổi xong sẽ post lên cho bạn xem.

Thân,

tienminh 28-08-2008 02:23 PM

Nếu được bác ra tay giúp đỡ, tôi xin cảm ơn nhiều.

namqn 28-08-2008 09:56 PM

Chào bạn tienminh,

Dưới đây là code đã được tôi thử nghiệm trong hơn 1 giờ đồng hồ. Tôi dùng thạch anh 10 MHz và PLL, do đó tần số clock của PIC là 40 MHz. Giá trị duty cycle được cập nhật vào giữa mỗi chu kỳ PWM (chu kỳ dài 20 us). Do đó, tần số PWM là 50 kHz, và tần số lặp lại bảng sine là 62,5 Hz.

Code:

#include<p18cxxx.h>

#pragma config OSC = HSPLL
#pragma config FCMEN = OFF
#pragma config IESO = OFF
#pragma config PWRTEN = ON
#pragma config BOREN = ON
#pragma config BORV = 27
#pragma config WDTEN = OFF
#pragma config WINEN = OFF
#pragma config WDPS = 32768
#pragma config T1OSCMX = OFF
#pragma config HPOL = HIGH
#pragma config LPOL = HIGH
#pragma config PWMPIN = ON
#pragma config MCLRE = ON
#pragma config EXCLKMX = RD0
#pragma config PWM4MX = RD5
#pragma config SSPMX = RD1
#pragma config FLTAMX = RD4
#pragma config STVREN = ON
#pragma config LVP = OFF
#pragma config DEBUG = OFF
#pragma config CP0 = OFF
#pragma config CP1 = OFF
#pragma config CP2 = OFF
#pragma config CP3 = OFF
#pragma config CPB = OFF
#pragma config CPD = OFF
#pragma config WRT0 = OFF
#pragma config WRT1 = OFF
#pragma config WRT2 = OFF
#pragma config WRT3 = OFF
#pragma config WRTB = OFF
#pragma config WRTC = OFF
#pragma config WRTD = OFF
#pragma config EBTR0 = OFF
#pragma config EBTR1 = OFF
#pragma config EBTR2 = OFF
#pragma config EBTR3 = OFF
#pragma config EBTRB = OFF

const rom unsigned int  sine[800]={
400 , 403 , 406 , 409 , 412 , 415 , 418 , 421 , 425 , 428 , 431 , 434 , 437 , 440 , 443 ,
447 , 450 , 453 , 456 , 459 , 462 , 465 , 468 , 471 , 474 , 478 , 481 , 484 , 487 , 490 ,
493 , 496 , 499 , 502 , 505 , 508 , 511 , 514 , 517 , 520 , 523 , 526 , 529 , 532 , 535 ,
538 , 541 , 544 , 547 , 550 , 553 , 555 , 558 , 561 , 564 , 567 , 570 , 573 , 575 , 578 ,
581 , 584 , 587 , 589 , 592 , 595 , 598 , 600 , 603 , 606 , 608 , 611 , 614 , 616 , 619 ,
622 , 624 , 627 , 630 , 632 , 635 , 637 , 640 , 642 , 645 , 647 , 650 , 652 , 654 , 657 ,
659 , 662 , 664 , 666 , 669 , 671 , 673 , 676 , 678 , 680 , 682 , 685 , 687 , 689 , 691 ,
693 , 695 , 697 , 700 , 702 , 704 , 706 , 708 , 710 , 712 , 714 , 716 , 717 , 719 , 721 ,
723 , 725 , 727 , 729 , 730 , 732 , 734 , 736 , 737 , 739 , 741 , 742 , 744 , 745 , 747 ,
748 , 750 , 752 , 753 , 754 , 756 , 757 , 759 , 760 , 761 , 763 , 764 , 765 , 767 , 768 ,
769 , 770 , 771 , 773 , 774 , 775 , 776 , 777 , 778 , 779 , 780 , 781 , 782 , 783 , 784 ,
784 , 785 , 786 , 787 , 788 , 788 , 789 , 790 , 791 , 791 , 792 , 792 , 793 , 794 , 794 ,
795 , 795 , 796 , 796 , 796 , 797 , 797 , 797 , 798 , 798 , 798 , 799 , 799 , 799 , 799 ,
799 , 799 , 799 , 799 , 799 , 800 , 799 , 799 , 799 , 799 , 799 , 799 , 799 , 799 , 799 ,
798 , 798 , 798 , 797 , 797 , 797 , 796 , 796 , 796 , 795 , 795 , 794 , 794 , 793 , 792 ,
792 , 791 , 791 , 790 , 789 , 788 , 788 , 787 , 786 , 785 , 784 , 784 , 783 , 782 , 781 ,
780 , 779 , 778 , 777 , 776 , 775 , 774 , 773 , 771 , 770 , 769 , 768 , 767 , 765 , 764 ,
763 , 761 , 760 , 759 , 757 , 756 , 754 , 753 , 752 , 750 , 748 , 747 , 745 , 744 , 742 ,
741 , 739 , 737 , 736 , 734 , 732 , 730 , 729 , 727 , 725 , 723 , 721 , 719 , 717 , 716 ,
714 , 712 , 710 , 708 , 706 , 704 , 702 , 700 , 697 , 695 , 693 , 691 , 689 , 687 , 685 ,
682 , 680 , 678 , 676 , 673 , 671 , 669 , 666 , 664 , 662 , 659 , 657 , 654 , 652 , 650 ,
647 , 645 , 642 , 640 , 637 , 635 , 632 , 630 , 627 , 624 , 622 , 619 , 616 , 614 , 611 ,
608 , 606 , 603 , 600 , 598 , 595 , 592 , 589 , 587 , 584 , 581 , 578 , 575 , 573 , 570 ,
567 , 564 , 561 , 558 , 555 , 553 , 550 , 547 , 544 , 541 , 538 , 535 , 532 , 529 , 526 ,
523 , 520 , 517 , 514 , 511 , 508 , 505 , 502 , 499 , 496 , 493 , 490 , 487 , 484 , 481 ,
478 , 474 , 471 , 468 , 465 , 462 , 459 , 456 , 453 , 450 , 447 , 443 , 440 , 437 , 434 ,
431 , 428 , 425 , 421 , 418 , 415 , 412 , 409 , 406 , 403 , 399 , 396 , 393 , 390 , 387 ,
384 , 381 , 378 , 374 , 371 , 368 , 365 , 362 , 359 , 356 , 352 , 349 , 346 , 343 , 340 ,
337 , 334 , 331 , 328 , 325 , 321 , 318 , 315 , 312 , 309 , 306 , 303 , 300 , 297 , 294 ,
291 , 288 , 285 , 282 , 279 , 276 , 273 , 270 , 267 , 264 , 261 , 258 , 255 , 252 , 249 ,
246 , 244 , 241 , 238 , 235 , 232 , 229 , 226 , 224 , 221 , 218 , 215 , 212 , 210 , 207 ,
204 , 201 , 199 , 196 , 193 , 191 , 188 , 185 , 183 , 180 , 177 , 175 , 172 , 169 , 167 ,
164 , 162 , 159 , 157 , 154 , 152 , 149 , 147 , 145 , 142 , 140 , 137 , 135 , 133 , 130 ,
128 , 126 , 123 , 121 , 119 , 117 , 114 , 112 , 110 , 108 , 106 , 104 , 102 , 99 , 97 , 95 ,
93 , 91 , 89 , 87 , 85 , 83 , 82 , 80 , 78 , 76 , 74 , 72 , 70 , 69 , 67 , 65 , 63 , 62 , 60 ,
58 , 57 , 55 , 54 , 52 , 51 , 49 , 47 , 46 , 45 , 43 , 42 , 40 , 39 , 38 , 36 , 35 , 34 , 32 ,
31 , 30 , 29 , 28 , 26 , 25 , 24 , 23 , 22 , 21 , 20 , 19 , 18 , 17 , 16 , 15 , 15 , 14 , 13 ,
12 , 11 , 11 , 10 , 9 , 8 , 8 , 7 , 7 , 6 , 5 , 5 , 4 , 4 , 3 , 3 , 3 , 2 , 2 , 2 , 1 , 1 , 1 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 2 , 2 , 2 , 3 , 3 , 3 ,
4 , 4 , 5 , 5 , 6 , 7 , 7 , 8 , 8 , 9 , 10 , 11 , 11 , 12 , 13 , 14 , 15 , 15 , 16 , 17 , 18 ,
19 , 20 , 21 , 22 , 23 , 24 , 25 , 26 , 28 , 29 , 30 , 31 , 32 , 34 , 35 , 36 , 38 , 39 ,
40 , 42 , 43 , 45 , 46 , 47 , 49 , 51 , 52 , 54 , 55 , 57 , 58 , 60 , 62 , 63 , 65 , 67 ,
69 , 70 , 72 , 74 , 76 , 78 , 80 , 82 , 83 , 85 , 87 , 89 , 91 , 93 , 95 , 97 , 99 , 102 ,
104 , 106 , 108 , 110 , 112 , 114 , 117 , 119 , 121 , 123 , 126 , 128 , 130 , 133 ,
135 , 137 , 140 , 142 , 145 , 147 , 149 , 152 , 154 , 157 , 159 , 162 , 164 , 167 ,
169 , 172 , 175 , 177 , 180 , 183 , 185 , 188 , 191 , 193 , 196 , 199 , 201 , 204 ,
207 , 210 , 212 , 215 , 218 , 221 , 224 , 226 , 229 , 232 , 235 , 238 , 241 , 244 ,
246 , 249 , 252 , 255 , 258 , 261 , 264 , 267 , 270 , 273 , 276 , 279 , 282 , 285 ,
288 , 291 , 294 , 297 , 300 , 303 , 306 , 309 , 312 , 315 , 318 , 321 , 325 , 328 ,
331 , 334 , 337 , 340 , 343 , 346 , 349 , 352 , 356 , 359 , 362 , 365 , 368 , 371 ,
374 , 378 , 381 , 384 , 387 , 390 , 393 , 396  };

#define        _PTIF        PIR3bits.PTIF

unsigned int index = 0;
void set_duty0(unsigned int duty);

void setupPWM(void)
{
        PTCON0 = 0x00;        //Postscale 1:1, Prescale 1:1, Free Running
        PTCON1 = 0x80;        //PWM time base is on, count up!
        PWMCON0 = 0x20;        //Enable PWM0-1, Complementary
        PWMCON1 = 0x40;
        DTCON = 0x00;        //No dead-time
       
        PTMRH=0;
        PTMRL=0;
       
        PTPERH=0;
        PTPERL=0xC7;        // 20KHz PWM
       
        PDC0H=0x00;
        PDC0L=0x00;                //0% duty
        /*
        PDC1H=0;
        PDC1L=0;
        PDC2H=0;
        PDC2L=0;
        PDC3H=0;
        PDC3L=0;
*/
        OVDCOND = 0xFF;                //Override disabled
        OVDCONS = 0;
        FLTCONFIG = 0;                //Fault condition disabled
        SEVTCMPH = 0;
        SEVTCMPL = 0;
}

void set_duty0(unsigned int duty)
{
        PDC0H = duty>>8;
        PDC0L = duty&0xFF;
}

void main()
{
//        TRISA=0x00;
//        ANSEL0=0x00;
        setupPWM();

        while (1)
        {
                if (_PTIF == 1 && PTMRL >= 100)
                {
                        set_duty0(sine[index]);
                        index++;
                        _PTIF = 0;
                        if (index >= 800) index = 0;
                }
        }
}

Bạn hãy so sánh với code của bạn để thấy những điểm được thay đổi. Nếu có chỗ nào thắc mắc, bạn cứ đặt câu hỏi ở đây.

Thân,

tienminh 29-08-2008 01:14 AM

Tôi xin cảm ơn sự nhiệt tình của bác,
cho tôi hỏi, bây giờ ta lọc thông thấp đầu ra của PWM thì sẽ được sine 62.5Hz phải không bác nhỉ?

namqn 29-08-2008 01:43 AM

Trích:

Nguyên văn bởi tienminh (Post 18450)
Tôi xin cảm ơn sự nhiệt tình của bác,
cho tôi hỏi, bây giờ ta lọc thông thấp đầu ra của PWM thì sẽ được sine 62.5Hz phải không bác nhỉ?

Đúng vậy. Với tần số PWM là 50 kHz thì bạn sẽ dễ dàng lọc thông thấp để có được tín hiệu đã được điều chế.

Thân,

tmtm 29-08-2008 06:49 PM

Trích:

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

Dưới đây là code đã được tôi thử nghiệm trong hơn 1 giờ đồng hồ. Tôi dùng thạch anh 10 MHz và PLL, do đó tần số clock của PIC là 40 MHz. Giá trị duty cycle được cập nhật vào giữa mỗi chu kỳ PWM (chu kỳ dài 20 us). Do đó, tần số PWM là 50 kHz, và tần số lặp lại bảng sine là 62,5 Hz.

Code:

#include<p18cxxx.h>

#pragma config OSC = HSPLL
#pragma config FCMEN = OFF
#pragma config IESO = OFF
#pragma config PWRTEN = ON
#pragma config BOREN = ON
#pragma config BORV = 27
#pragma config WDTEN = OFF
#pragma config WINEN = OFF
#pragma config WDPS = 32768
#pragma config T1OSCMX = OFF
#pragma config HPOL = HIGH
#pragma config LPOL = HIGH
#pragma config PWMPIN = ON
#pragma config MCLRE = ON
#pragma config EXCLKMX = RD0
#pragma config PWM4MX = RD5
#pragma config SSPMX = RD1
#pragma config FLTAMX = RD4
#pragma config STVREN = ON
#pragma config LVP = OFF
#pragma config DEBUG = OFF
#pragma config CP0 = OFF
#pragma config CP1 = OFF
#pragma config CP2 = OFF
#pragma config CP3 = OFF
#pragma config CPB = OFF
#pragma config CPD = OFF
#pragma config WRT0 = OFF
#pragma config WRT1 = OFF
#pragma config WRT2 = OFF
#pragma config WRT3 = OFF
#pragma config WRTB = OFF
#pragma config WRTC = OFF
#pragma config WRTD = OFF
#pragma config EBTR0 = OFF
#pragma config EBTR1 = OFF
#pragma config EBTR2 = OFF
#pragma config EBTR3 = OFF
#pragma config EBTRB = OFF

const rom unsigned int  sine[800]={
400 , 403 , 406 , 409 , 412 , 415 , 418 , 421 , 425 , 428 , 431 , 434 , 437 , 440 , 443 ,
447 , 450 , 453 , 456 , 459 , 462 , 465 , 468 , 471 , 474 , 478 , 481 , 484 , 487 , 490 ,
493 , 496 , 499 , 502 , 505 , 508 , 511 , 514 , 517 , 520 , 523 , 526 , 529 , 532 , 535 ,
538 , 541 , 544 , 547 , 550 , 553 , 555 , 558 , 561 , 564 , 567 , 570 , 573 , 575 , 578 ,
581 , 584 , 587 , 589 , 592 , 595 , 598 , 600 , 603 , 606 , 608 , 611 , 614 , 616 , 619 ,
622 , 624 , 627 , 630 , 632 , 635 , 637 , 640 , 642 , 645 , 647 , 650 , 652 , 654 , 657 ,
659 , 662 , 664 , 666 , 669 , 671 , 673 , 676 , 678 , 680 , 682 , 685 , 687 , 689 , 691 ,
693 , 695 , 697 , 700 , 702 , 704 , 706 , 708 , 710 , 712 , 714 , 716 , 717 , 719 , 721 ,
723 , 725 , 727 , 729 , 730 , 732 , 734 , 736 , 737 , 739 , 741 , 742 , 744 , 745 , 747 ,
748 , 750 , 752 , 753 , 754 , 756 , 757 , 759 , 760 , 761 , 763 , 764 , 765 , 767 , 768 ,
769 , 770 , 771 , 773 , 774 , 775 , 776 , 777 , 778 , 779 , 780 , 781 , 782 , 783 , 784 ,
784 , 785 , 786 , 787 , 788 , 788 , 789 , 790 , 791 , 791 , 792 , 792 , 793 , 794 , 794 ,
795 , 795 , 796 , 796 , 796 , 797 , 797 , 797 , 798 , 798 , 798 , 799 , 799 , 799 , 799 ,
799 , 799 , 799 , 799 , 799 , 800 , 799 , 799 , 799 , 799 , 799 , 799 , 799 , 799 , 799 ,
798 , 798 , 798 , 797 , 797 , 797 , 796 , 796 , 796 , 795 , 795 , 794 , 794 , 793 , 792 ,
792 , 791 , 791 , 790 , 789 , 788 , 788 , 787 , 786 , 785 , 784 , 784 , 783 , 782 , 781 ,
780 , 779 , 778 , 777 , 776 , 775 , 774 , 773 , 771 , 770 , 769 , 768 , 767 , 765 , 764 ,
763 , 761 , 760 , 759 , 757 , 756 , 754 , 753 , 752 , 750 , 748 , 747 , 745 , 744 , 742 ,
741 , 739 , 737 , 736 , 734 , 732 , 730 , 729 , 727 , 725 , 723 , 721 , 719 , 717 , 716 ,
714 , 712 , 710 , 708 , 706 , 704 , 702 , 700 , 697 , 695 , 693 , 691 , 689 , 687 , 685 ,
682 , 680 , 678 , 676 , 673 , 671 , 669 , 666 , 664 , 662 , 659 , 657 , 654 , 652 , 650 ,
647 , 645 , 642 , 640 , 637 , 635 , 632 , 630 , 627 , 624 , 622 , 619 , 616 , 614 , 611 ,
608 , 606 , 603 , 600 , 598 , 595 , 592 , 589 , 587 , 584 , 581 , 578 , 575 , 573 , 570 ,
567 , 564 , 561 , 558 , 555 , 553 , 550 , 547 , 544 , 541 , 538 , 535 , 532 , 529 , 526 ,
523 , 520 , 517 , 514 , 511 , 508 , 505 , 502 , 499 , 496 , 493 , 490 , 487 , 484 , 481 ,
478 , 474 , 471 , 468 , 465 , 462 , 459 , 456 , 453 , 450 , 447 , 443 , 440 , 437 , 434 ,
431 , 428 , 425 , 421 , 418 , 415 , 412 , 409 , 406 , 403 , 399 , 396 , 393 , 390 , 387 ,
384 , 381 , 378 , 374 , 371 , 368 , 365 , 362 , 359 , 356 , 352 , 349 , 346 , 343 , 340 ,
337 , 334 , 331 , 328 , 325 , 321 , 318 , 315 , 312 , 309 , 306 , 303 , 300 , 297 , 294 ,
291 , 288 , 285 , 282 , 279 , 276 , 273 , 270 , 267 , 264 , 261 , 258 , 255 , 252 , 249 ,
246 , 244 , 241 , 238 , 235 , 232 , 229 , 226 , 224 , 221 , 218 , 215 , 212 , 210 , 207 ,
204 , 201 , 199 , 196 , 193 , 191 , 188 , 185 , 183 , 180 , 177 , 175 , 172 , 169 , 167 ,
164 , 162 , 159 , 157 , 154 , 152 , 149 , 147 , 145 , 142 , 140 , 137 , 135 , 133 , 130 ,
128 , 126 , 123 , 121 , 119 , 117 , 114 , 112 , 110 , 108 , 106 , 104 , 102 , 99 , 97 , 95 ,
93 , 91 , 89 , 87 , 85 , 83 , 82 , 80 , 78 , 76 , 74 , 72 , 70 , 69 , 67 , 65 , 63 , 62 , 60 ,
58 , 57 , 55 , 54 , 52 , 51 , 49 , 47 , 46 , 45 , 43 , 42 , 40 , 39 , 38 , 36 , 35 , 34 , 32 ,
31 , 30 , 29 , 28 , 26 , 25 , 24 , 23 , 22 , 21 , 20 , 19 , 18 , 17 , 16 , 15 , 15 , 14 , 13 ,
12 , 11 , 11 , 10 , 9 , 8 , 8 , 7 , 7 , 6 , 5 , 5 , 4 , 4 , 3 , 3 , 3 , 2 , 2 , 2 , 1 , 1 , 1 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 2 , 2 , 2 , 3 , 3 , 3 ,
4 , 4 , 5 , 5 , 6 , 7 , 7 , 8 , 8 , 9 , 10 , 11 , 11 , 12 , 13 , 14 , 15 , 15 , 16 , 17 , 18 ,
19 , 20 , 21 , 22 , 23 , 24 , 25 , 26 , 28 , 29 , 30 , 31 , 32 , 34 , 35 , 36 , 38 , 39 ,
40 , 42 , 43 , 45 , 46 , 47 , 49 , 51 , 52 , 54 , 55 , 57 , 58 , 60 , 62 , 63 , 65 , 67 ,
69 , 70 , 72 , 74 , 76 , 78 , 80 , 82 , 83 , 85 , 87 , 89 , 91 , 93 , 95 , 97 , 99 , 102 ,
104 , 106 , 108 , 110 , 112 , 114 , 117 , 119 , 121 , 123 , 126 , 128 , 130 , 133 ,
135 , 137 , 140 , 142 , 145 , 147 , 149 , 152 , 154 , 157 , 159 , 162 , 164 , 167 ,
169 , 172 , 175 , 177 , 180 , 183 , 185 , 188 , 191 , 193 , 196 , 199 , 201 , 204 ,
207 , 210 , 212 , 215 , 218 , 221 , 224 , 226 , 229 , 232 , 235 , 238 , 241 , 244 ,
246 , 249 , 252 , 255 , 258 , 261 , 264 , 267 , 270 , 273 , 276 , 279 , 282 , 285 ,
288 , 291 , 294 , 297 , 300 , 303 , 306 , 309 , 312 , 315 , 318 , 321 , 325 , 328 ,
331 , 334 , 337 , 340 , 343 , 346 , 349 , 352 , 356 , 359 , 362 , 365 , 368 , 371 ,
374 , 378 , 381 , 384 , 387 , 390 , 393 , 396  };

#define        _PTIF        PIR3bits.PTIF

unsigned int index = 0;
void set_duty0(unsigned int duty);

void setupPWM(void)
{
        PTCON0 = 0x00;        //Postscale 1:1, Prescale 1:1, Free Running
        PTCON1 = 0x80;        //PWM time base is on, count up!
        PWMCON0 = 0x20;        //Enable PWM0-1, Complementary
        PWMCON1 = 0x40;
        DTCON = 0x00;        //No dead-time
       
        PTMRH=0;
        PTMRL=0;
       
        PTPERH=0;
        PTPERL=0xC7;        // 20KHz PWM
       
        PDC0H=0x00;
        PDC0L=0x00;                //0% duty
        /*
        PDC1H=0;
        PDC1L=0;
        PDC2H=0;
        PDC2L=0;
        PDC3H=0;
        PDC3L=0;
*/
        OVDCOND = 0xFF;                //Override disabled
        OVDCONS = 0;
        FLTCONFIG = 0;                //Fault condition disabled
        SEVTCMPH = 0;
        SEVTCMPL = 0;
}

void set_duty0(unsigned int duty)
{
        PDC0H = duty>>8;
        PDC0L = duty&0xFF;
}

void main()
{
//        TRISA=0x00;
//        ANSEL0=0x00;
        setupPWM();

        while (1)
        {
                if (_PTIF == 1 && PTMRL >= 100)
                {
                        set_duty0(sine[index]);
                        index++;
                        _PTIF = 0;
                        if (index >= 800) index = 0;
                }
        }
}

Bạn hãy so sánh với code của bạn để thấy những điểm được thay đổi. Nếu có chỗ nào thắc mắc, bạn cứ đặt câu hỏi ở đây.

Thân,

Em chưa hiểu trong đoạn code trên, tham số nào quyết định tần số lặp lại bảng sine là 62,5 Hz? Nếu ta muốn tần số này bằng 50Hz thì phải làm thế nào? Mong anh giúp đỡ!

namqn 29-08-2008 07:43 PM

Trích:

Nguyên văn bởi tmtm (Post 18481)
Em chưa hiểu trong đoạn code trên, tham số nào quyết định tần số lặp lại bảng sine là 62,5 Hz? Nếu ta muốn tần số này bằng 50Hz thì phải làm thế nào? Mong anh giúp đỡ!

Tần số PWM là 50 kHz, có nghĩa là sẽ có 50000 chu kỳ PWM được tạo ra trong 1 giây. Bảng sine có độ dài 800, và sau mỗi chu kỳ PWM thì một giá trị mới trong bảng sine sẽ được dùng để cập nhật duty cycle. Như vậy, trong 1 giây sẽ có 50000/800 = 62,5 lần bảng sine được lặp lại, tức là tần số của tín hiệu điều chế là 62,5 Hz.

Để tần số là 50 Hz, bạn tạo bảng sine có 1000 giá trị cho một chu kỳ của tín hiệu được điều chế.

Thân,

tienminh 29-08-2008 08:12 PM

Đoạn code của bác , Tôi về thử đã chạy tốt.
Tôi xin hỏi bác câu hỏi cuối cùng trong topic này, mong bác bớt chút thời gian trả lời cụ thể giúp cho tôi và các anh em quan tâm:
*Mục đích:
-Tạo sóng sine với tần số 50Hz chuẩn, dùng cho Inverter DC-AC (hoặc mục đích khác)
-Có tạo deadtime để điều khiển cầu H
*Phương pháp thực hiện:
-Sử dụng khối công suất PWM của PIC18F4431 để thực hiện việc đặt dutycycle theo quy luật sine.
*Tính toán thông số:
-Chọn tần số sóng mang PWM là 20Khz ---> Tpwm=50uS
-Chọn Thạch Anh là 16MHz.
-Có công thức Tpwm=(1+PTPER)/(Fosc:4)--->PTPER=199---->Dutycycle=0-199
-Tần số sóng sin là 50Hz--->Tsin=20ms
-Thời gian update dutycycle là Tu=20E-3 / sizeof(sine_table)

Bác cho em hỏi,
- bảng sin như thế nào là hợp lý trong trường hợp này?
- Thời gian update có vấn đề gì liên quan không?vì trong code của bác em chưa thấy đề cập đến nó.
Hợac bác có một giải pháp nào khác cho bài toán tạo sin này không?
xin cảm ơn Bác

namqn 29-08-2008 08:32 PM

Trích:

Nguyên văn bởi tienminh (Post 18487)
Đoạn code của bác , Tôi về thử đã chạy tốt.
Tôi xin hỏi bác câu hỏi cuối cùng trong topic này, mong bác bớt chút thời gian trả lời cụ thể giúp cho tôi và các anh em quan tâm:
*Mục đích:
-Tạo sóng sine với tần số 50Hz chuẩn, dùng cho Inverter DC-AC (hoặc mục đích khác)
-Có tạo deadtime để điều khiển cầu H
*Phương pháp thực hiện:
-Sử dụng khối công suất PWM của PIC18F4431 để thực hiện việc đặt dutycycle theo quy luật sine.
*Tính toán thông số:
-Chọn tần số sóng mang PWM là 20Khz ---> Tpwm=50uS
-Chọn Thạch Anh là 16MHz.
-Có công thức Tpwm=(1+PTPER)/(Fosc:4)--->PTPER=199---->Dutycycle=0-199
-Tần số sóng sin là 50Hz--->Tsin=20ms
-Thời gian update dutycycle là Tu=20E-3 / sizeof(sine_table)

Bác cho em hỏi,
- bảng sin như thế nào là hợp lý trong trường hợp này?
- Thời gian update có vấn đề gì liên quan không?vì trong code của bác em chưa thấy đề cập đến nó.
Hợac bác có một giải pháp nào khác cho bài toán tạo sin này không?
xin cảm ơn Bác

Những vấn đề mà bạn hỏi cần được xem xét với khả năng hiện thực của PIC18F4431. Trong hình 17-12 của datasheet của PIC18F4431, với PWM đồng bộ ở cạnh, duty cycle chỉ được module PCPWM cập nhật một lần vào cuối mỗi chu kỳ PWM. Nghĩa là nếu bạn thay đổi duty cycle 2 lần trong mỗi chu kỳ PWM thì chỉ có 1 thay đổi sau được phản ánh vào duty cycle của tín hiệu ra.

Do đó, chúng ta không có nhiều sự lựa chọn với thời gian cập nhật duty cycle. Cách tốt nhất mà chúng ta có thể làm trong trường hợp này là cập nhật duty cycle sau mỗi chu kỳ PWM.

Với cách làm này, chúng ta sẽ có kích thước bảng sin = 20 ms/Tpwm. Như tôi đã giải thích ở một post trước đó, với tần số clock 40 MHz, tần số PWM là 50 kHz, và bảng sin có 800 giá trị, bạn sẽ có tần số của tín hiệu được điều chế là 62,5 Hz. Nếu muốn có tần số tín hiệu được điều chế là 50 Hz, bạn thay đổi độ dài bảng sin, tăng lên thành 1000 giá trị.

Cuối cùng, bạn thử nghĩ xem làm thế nào để có nhiều giá trị duty cycle trong một chu kỳ PWM!

Thân,

tmtm 29-08-2008 09:52 PM

Trích:

Nguyên văn bởi namqn;

Cuối cùng, bạn thử nghĩ xem làm thế nào để có nhiều giá trị duty cycle trong một chu kỳ PWM!

Thân,

Thôi thì bác đã giúp thì giúp cho chót, thực sự em chưa hiểu vấn đề này lắm, bác có thể giải thích kỹ hơn được ko?
Với Inverter 3 pha, ta phải giải quyết vấn đề như thế nào? Với vấn đề được đề cập trong topic này thì giải quyết bằng Pic18F4431 và dsPIC30F6010A thì ưu nhược điểm của từng cách như thế nào ah? (Độ phức tạp của chương rình, phần cứng..)

namqn 29-08-2008 11:18 PM

Trích:

Nguyên văn bởi tmtm (Post 18490)
Thôi thì bác đã giúp thì giúp cho chót, thực sự em chưa hiểu vấn đề này lắm, bác có thể giải thích kỹ hơn được ko?
Với Inverter 3 pha, ta phải giải quyết vấn đề như thế nào? Với vấn đề được đề cập trong topic này thì giải quyết bằng Pic18F4431 và dsPIC30F6010A thì ưu nhược điểm của từng cách như thế nào ah? (Độ phức tạp của chương rình, phần cứng..)

À, tôi chỉ nhắc để các bạn chú ý định nghĩa của duty cycle của tín hiệu PWM. Trong một chu kỳ PWM, bạn chỉ có 1 giá trị duty cycle.

Luồng này bàn về việc tạo tín hiệu sine PWM bằng PIC. Nếu bạn muốn hỏi về nghịch lưu 3 pha, đề nghị bạn mở luồng mới.

Với vấn đề tạo sine PWM ở đây, dùng dsPIC có lợi hơn đôi chút về mặt thời gian thực hiện các lệnh, vì dsPIC xử lý dữ liệu 16-bit một cách tự nhiên, còn PIC18 thì chỉ xử lý tự nhiên các dữ liệu 8-bit.

Về bản chất thì module PCPWM của PIC18F4431 và MCPWM của dsPIC6010A là giống nhau. dsPIC chỉ cho phép tần số PWM và độ phân giải duty cycle cao hơn so với PIC18. Do đó, ở những trường hợp PIC18 đáp ứng được tần số và độ phân giải thì dsPIC không có ưu thế đặc biệt gì. Chỉ khi yêu cầu về tần số và/hay độ phân giải vượt quá khả năng của PIC18 thì mới cần dùng dsPIC.

Thân,

tienminh 31-08-2008 09:35 PM

Đầu ra của PWM,tôi đưa ra lọc thì thu được tín hiệu sin rất tốt,tần số ổn định ở 50Hz.
Tôi thay đổi các thông số dựa trên hướng dẫn của bác, với Thạch anh 10MHz, dao động HS chưa cần PLL, kích thước bảng sine là 400, cập nhật dutycycle khi PTMR>=10(đầu chu kỳ).
Bây giờ tới phần deadtime vì nó không thể thiếu phải không bác?
trong datasheet có nói, khoảng thời gian kích hoạt của PWM ít nhất phải lớn hơn 3 lần deadtime để tránh méo tín hiệu.
tôi chọn deadtime=1us thì tín hiệu sine đầu ra bị méo dạng tại gần đỉnh của sine(tại sườn lên của sin, chưa tới đỉnh).
Nếu không có deadtime thì lại không sao, tuy nhiên khi thử dutycycle tại các giá trị cực đại hoặc cực tiểu trong bảng sin thì thấy độ rộng vẫn ra đúng, và điều vô lý là tín hiệu bị méo tại sườn của sine chứ lại không méo tại đỉnh hoặc tại điểm 0.
Đầu ra em lọc dùng R=1K và C=1uF.

Mong bác gợi ý giúp em trường hợp này.

namqn 01-09-2008 08:41 PM

Trích:

Nguyên văn bởi tienminh (Post 18529)
Đầu ra của PWM,tôi đưa ra lọc thì thu được tín hiệu sin rất tốt,tần số ổn định ở 50Hz.
Tôi thay đổi các thông số dựa trên hướng dẫn của bác, với Thạch anh 10MHz, dao động HS chưa cần PLL, kích thước bảng sine là 400, cập nhật dutycycle khi PTMR>=10(đầu chu kỳ).
Bây giờ tới phần deadtime vì nó không thể thiếu phải không bác?
trong datasheet có nói, khoảng thời gian kích hoạt của PWM ít nhất phải lớn hơn 3 lần deadtime để tránh méo tín hiệu.
tôi chọn deadtime=1us thì tín hiệu sine đầu ra bị méo dạng tại gần đỉnh của sine(tại sườn lên của sin, chưa tới đỉnh).
Nếu không có deadtime thì lại không sao, tuy nhiên khi thử dutycycle tại các giá trị cực đại hoặc cực tiểu trong bảng sin thì thấy độ rộng vẫn ra đúng, và điều vô lý là tín hiệu bị méo tại sườn của sine chứ lại không méo tại đỉnh hoặc tại điểm 0.
Đầu ra em lọc dùng R=1K và C=1uF.

Mong bác gợi ý giúp em trường hợp này.

Datasheet cũng nói rằng khoảng thời gian không kích hoạt của PWM cũng phải ít nhất lớn hơn 3 lần dead-time, để giảm thiểu tối đa ảnh hưởng của dead-time. Do đó, bạn nên thay đổi phạm vi giá trị duty cycle của bạn khi có thêm dead-time, để không vi phạm những khuyến cáo trên.

Thử nghiệm của tôi cho thấy ở những giá trị duty cycle quá lớn thì dạng sóng ở các ngõ ra hoàn toàn thay đổi (PWM1 và PWM0 thay phiên nhau 'on' trong suốt 1 chu kỳ PWM). Do đó hiện tượng mà bạn đã quan sát được là hợp lý.

Mạch lọc của bạn tạo ra một độ lệch pha khoảng 17 độ, sớm pha (chỗ này viết sai, chậm pha mới đúng, xác định tại tần số 50 Hz).

Với trường hợp cụ thể của bạn, tần số PWM là 20 kHz, dùng 1 us dead-time, bạn thử giảm giá trị duty tối đa trong bảng xuống còn khoảng 95% thử xem.

Tuy nhiên, bạn nên suy nghĩ thêm: Tại sao phải đưa dead-time vào? Nếu có dead-time thì việc đo dạng sóng sau mạch lọc RC của bạn có ý nghĩa gì không? Nếu bạn là sinh viên đang làm đề tài, bạn nên trao đổi với người hướng dẫn.

Thân,

tienminh 01-09-2008 10:15 PM

Cảm ơn bác đã gợi ý, em bắt buộc phải đưa deadtime vào bởi vì 2 tín hiệu PWM sẽ được dùng để điều khiển cầu H MOSFET.Đây là một phần quan trọng của DC-AC converter.
Nhân đây em hỏi luôn bác, nếu dùng cầu H và PIC như trên để convert sau đó dùng LC để lọc ra sine thì hiệu suất được khoảng bao nhiêu và deadtime khoảng 1us có là đủ với các loại MOSFET thông dụng hiện nay không?

namqn 01-09-2008 11:24 PM

Trích:

Nguyên văn bởi tienminh (Post 18550)
Cảm ơn bác đã gợi ý, em bắt buộc phải đưa deadtime vào bởi vì 2 tín hiệu PWM sẽ được dùng để điều khiển cầu H MOSFET.Đây là một phần quan trọng của DC-AC converter.
Nhân đây em hỏi luôn bác, nếu dùng cầu H và PIC như trên để convert sau đó dùng LC để lọc ra sine thì hiệu suất được khoảng bao nhiêu và deadtime khoảng 1us có là đủ với các loại MOSFET thông dụng hiện nay không?

Tất nhiên rất nên dùng dead-time khi kích các nửa cầu dùng MOSFET, nhưng dạng sóng PWM thực ở đầu ra cầu H có giống với dạng sóng đưa vào các gate của một nửa cầu hay không? Dạng sóng đầu ra cầu H sau khi lọc có giống dạng sóng ở ngõ ra mạch lọc RC mà bạn đang dùng để đánh giá hay không?

Tôi không thể trả lời câu hỏi về hiệu suất của bạn, vì nó phụ thuộc vào tần số chuyển mạch, chất lượng mạch kích, tổn hao trong mạch lọc LC, linh kiện công suất được dùng, ... mà những thông tin này bạn không hề đưa ra. Tuy nhiên, đề nghị bạn không trao đổi thêm về điện tử công suất ở đây, vì đây là diễn đàn dành cho PIC.

Nếu MOSFET thông dụng bạn muốn nói đến là IRF840 hay tương tự thì dead-time 1 us là thừa

Thân,

tienminh 02-09-2008 12:19 AM

OK.Tôi nghĩ vấn đề này nên dừng ở đây vì nó đã được giải quyết xong, cảm ơn bác một lần nữa.

tuoitrequaypha 02-09-2008 01:01 AM

Trưởng lão namqn nói sai
 
Hôm nay lại nhảy vào PIC đọc tí chút thì thấy trưởng lão namqn lại chỉ dẫn sai cho các chú đồng chí rồi! Hahahaha.... Ngứa nghề cho nên Mỗ lại phải ra tay đây :)

Mỗ hoảng hồn khi nghe namqn nói là mạch lọc RC lại tạo được tín hiệu ra "sớm pha", lại còn tính ra được sớm đúng 17 độ mới ghê chứ! :) Học điện tử công suất như trưởng lão thì vất rồi. Sai cơ bản, sai cơ bản. Thiện tai! Thiện tai!

Trưởng lão lại còn kết luận là do lệch pha nên méo dạng sóng là "hợp lý" thì chứng tỏ trưởng lão chưa hiểu gì về đặc điểm của PWM khi rời rạc hóa trong hệ thống số rồi :)

Mỗ stop ở đây thôi kẻo không trưởng lão lại cho rằng vấn đề PWM không được tranh luận trong PIC :)

Thân,
Biển học có hạn, sức người mênh mông


Trích:

Nguyên văn bởi namqn (Post 18546)
Datasheet cũng nói rằng khoảng thời gian không kích hoạt của PWM cũng phải ít nhất lớn hơn 3 lần dead-time, để giảm thiểu tối đa ảnh hưởng của dead-time. Do đó, bạn nên thay đổi phạm vi giá trị duty cycle của bạn khi có thêm dead-time, để không vi phạm những khuyến cáo trên.

Thử nghiệm của tôi cho thấy ở những giá trị duty cycle quá lớn thì dạng sóng ở các ngõ ra hoàn toàn thay đổi (PWM1 và PWM0 thay phiên nhau 'on' trong suốt 1 chu kỳ PWM).

Mạch lọc của bạn tạo ra một độ lệch pha khoảng 17 độ, sớm pha. Do đó hiện tượng mà bạn đã quan sát được là hợp lý.

Với trường hợp cụ thể của bạn, tần số PWM là 20 kHz, dùng 1 us dead-time, bạn thử giảm giá trị duty tối đa trong bảng xuống còn khoảng 95% thử xem.

Tuy nhiên, bạn nên suy nghĩ thêm: Tại sao phải đưa dead-time vào? Nếu có dead-time thì việc đo dạng sóng sau mạch lọc RC của bạn có ý nghĩa gì không? Nếu bạn là sinh viên đang làm đề tài, bạn nên trao đổi với người hướng dẫn.

Thân,


tienminh 02-09-2008 02:24 AM

Tóm lại mục đích của em là dùng PIC tạo PWM theo quy luật sine, đưa sang Driver sau đó vào cầu H MOSFET ,cuối cùng là lọc LC để được sine.
Mong các bác cao thủ ĐTCS định hướng giúp em, định hướng đúng em xin cảm ơn nhiều và các đồng chí khác cũng đỡ công phải nghiên cứu lại .
Các bác cứ tranh luận với nhau đi để lộ ra chân lý và sự thật.
thanks.

namqn 02-09-2008 04:03 AM

Trích:

Nguyên văn bởi tuoitrequaypha (Post 18562)
Hôm nay lại nhảy vào PIC đọc tí chút thì thấy trưởng lão namqn lại chỉ dẫn sai cho các chú đồng chí rồi! Hahahaha.... Ngứa nghề cho nên Mỗ lại phải ra tay đây :)

Mỗ hoảng hồn khi nghe namqn nói là mạch lọc RC lại tạo được tín hiệu ra "sớm pha", lại còn tính ra được sớm đúng 17 độ mới ghê chứ! :) Học điện tử công suất như trưởng lão thì vất rồi. Sai cơ bản, sai cơ bản. Thiện tai! Thiện tai!

Trưởng lão lại còn kết luận là do lệch pha nên méo dạng sóng là "hợp lý" thì chứng tỏ trưởng lão chưa hiểu gì về đặc điểm của PWM khi rời rạc hóa trong hệ thống số rồi :)

Mỗ stop ở đây thôi kẻo không trưởng lão lại cho rằng vấn đề PWM không được tranh luận trong PIC :)

Thân,
Biển học có hạn, sức người mênh mông

Cám ơn bạn nhé. Tôi lại sai nữa. Theo kết quả đáp ứng tần số thì góc lệch pha giữa điện áp trên tụ lọc và điện áp vào là khoảng -17 độ, tức là áp ra chậm pha so với áp vào. Tôi dùng phần mềm để vẽ đáp ứng tần số và đọc trị số góc lệch ở 50 Hz.

Cái nhận xét rằng hiện tượng xảy ra hợp lý là từ việc xem xét dạng xung ngõ ra khi duty cycle đặt gần bằng 100%, chứ không phải từ việc xét lệch pha của tần số cơ bản đâu. Lẽ ra tôi viết nhận xét ở đoạn trên mới phải.

Tôi còn nhiều cái chưa hiểu lắm, mời bạn giảng cho. DSP là cái mà tôi không được học ở đại học. Toán rời rạc tôi cũng chưa hề đụng đến.

Mà bạn cũng hay nhỉ, thấy các thành viên hỏi thì không thèm trả lời, có vẻ chỉ thích tìm lỗi của người khác để đem ra chê bai.

Thân,

tienminh 02-09-2008 04:10 PM

Đúng là lỗi trên liên quan đến dutycycle khi đạt 100% và 0% có deadtime, tôi sửa lại 5-95% thì ngon lành.
Tôi rất muốn bác tuoitrequaypha định hướng giúp tôi câu hỏi trên, vì nghe bác nói tôi đoán bác là người giỏi(rất hi vọng là như vậy).

tuoitrequaypha 03-09-2008 11:58 PM

Trả lời trưởng lão namqn và chú Tiễn Mình!
 
Dành cho trưởng lão namqn:
Hehehe... Trưởng lão án binh, bất khẩu về Đại lực điện tử (ĐTCS) để tái luyện công cũng là một ý hay, Mỗ hoan nghênh.

Trưởng lão bất thiện khi nói Mỗ hám tìm lỗi của người khác để chê bai. Mỗ nhập diễn đàn là để luyện công, phải đâu để tóe tung miệng cho sướng để lòe bá tánh. Thiển nghĩ Mỗ tọa sơn kiến mục đấu pháp của bá tánh không phải là điều hay sao? Ngoài ra triệt kê bất dụng đại đao, nhiều thắc mắc của bá tánh sẽ được các ma đầu giải quyết, không cần Mỗ phải động thủ, vận công cho nhọc.

Dành cho chú Tiễn Mình:

Khi dụng PIC18F4431 thì nhiệm vụ đọat sóng sine hoàn hảo từ PIC ở những duty cycle có giá trị gần 100% hoặc là gần 0% là bất khả. Đây là yếu huyệt của nhiều dòng PIC của Microchip mà từ bấy giờ đến nay Mỗ vẫn ngạc nhiên khi không thấy ma đầu nào chỉ ra hạn chế này. Điểm nhãn vào sơ đồ khối của phần điều khiển tạo PWM trong con PIC thì Mỗ ngộ ra hạn chế này là do cách xử lý tín hiệu số trong nội bộ con chip không được tối ưu, không có phần bù trừ cải thiện dạng sóng. Nếu bất dụng biện pháp cải thiện bằng các mạch phụ trợ bên ngoài thì hạn chế này đồng nghĩa với việc chú sẽ không thể chiếm tiện nghi tối đa mức điện áp của nguồn dc đầu vào khi chỉ dùng khối PWM của PIC 18F4431.

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? :)

Chúc các hạ vui.

Thân,
Biển học có hạn, sức người mênh mông :)






Trích:

Nguyên văn bởi namqn (Post 18569)
Cám ơn bạn nhé. Tôi lại sai nữa. Theo kết quả đáp ứng tần số thì góc lệch pha giữa điện áp trên tụ lọc và điện áp vào là khoảng -17 độ, tức là áp ra chậm pha so với áp vào. Tôi dùng phần mềm để vẽ đáp ứng tần số và đọc trị số góc lệch ở 50 Hz.

Cái nhận xét rằng hiện tượng xảy ra hợp lý là từ việc xem xét dạng xung ngõ ra khi duty cycle đặt gần bằng 100%, chứ không phải từ việc xét lệch pha của tần số cơ bản đâu. Lẽ ra tôi viết nhận xét ở đoạn trên mới phải.

Tôi còn nhiều cái chưa hiểu lắm, mời bạn giảng cho. DSP là cái mà tôi không được học ở đại học. Toán rời rạc tôi cũng chưa hề đụng đến.

Mà bạn cũng hay nhỉ, thấy các thành viên hỏi thì không thèm trả lời, có vẻ chỉ thích tìm lỗi của người khác để đem ra chê bai.

Thân,


gto 04-09-2008 08:58 AM

Công lực uyên thâm vô cùng! Xem ra bác tuoitrequaypha là một nhân vật có tên tuổi trong giới khoa học. Giá mà bác tích cực ra mặt giúp chúng em nhiều hơn nữa thì tốt biết bao, chứ bác cứ "tọa sơn kiến mục đấu pháp của bá tánh" thế thì thật lãng phí nhân tài.
Bác cho em hỏi, trong các dòng PIC và dsPIC thì dòng nào, chip nào giải quyết vấn đầ này tốt nhất?

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,


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