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)

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,

truongqt 14-06-2009 12:14 PM

pwm
 
2 đoạn mã sau là tuơng đuơng, nhưng khi chạy mạch thật thì không biết vì sao mà đoạn mã tạo PWM (mã 2) lại không làm việc (ko chạy hoặc chạy sai gậy ngắn mạch cầu H), còn mã 1 thì chạy bình thường?


------------Mã 1-------------

Code:

#include <18f4331.h>
#fuses  HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT
#use delay(clock=20000000)

void main()
{
while (1)
    {
      output_B(0B00001001);  delay_us(21);
      output_B(0X00);  delay_us(2);     
      output_B(0B00000110);  delay_us(21);
      output_B(0X00);  delay_us(2);
    }
 }


-------------Mã 2( dùng chức năng PWM)------------
Code:

#include <18f4331.h>
#fuses  HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT
#use delay(clock=20000000)

#bit TBInt_pin = 0xfa4.4
#byte PTCON0 = 0XF7F
#byte PTCON1 = 0XF7E
#byte PTMRL = 0XF7D
#byte PTMRH = 0XF7C
#byte PTPERL = 0XF7B
#byte PTPERH = 0XF7A
#byte PDC0L = 0XF79
#byte PDC0H = 0XF78
#byte PDC1L = 0XF77
#byte PDC1H = 0XF76
#byte PDC2L = 0XF75
#byte PDC2H = 0XF74
#byte PDC3L = 0XF73
#byte PDC3H = 0XF72
#byte SEVTCMPL = 0XF71
#byte SEVTCMPH = 0XF70
#BYTE PWMCON0 = 0XF6F
#BYTE PWMCON1 = 0XF6E
#BYTE DTCON = 0XF6D
#byte FLTCONFIG = 0XF6C
#byte OVDCOND = 0XF6B
#byte OVDCONS = 0XF6A
#byte ANSEL0 = 0XFB8

void main()
{ setup_power_pwm_pins(PWM_COMPLEMENTARY,PWM_COMPLEMENTARY,PWM_OFF,PWM_OFF);
setup_power_pwm(PWM_CLOCK_DIV_4|PWM_FREE_RUN,1,0,249,0,1,30);//20KHz
      set_power_pwm0_duty(498);
      set_power_pwm2_duty(498);
 while (1)
    {
      if (TBINT_PIN == 1 && PTMRL >= 50)
      {
      set_power_pwm0_duty(498);
      set_power_pwm2_duty(498);
        TBINT_PIN= 0;
      }
    }
 }


------------------
Mong các cao nhân chỉ giùm, em cần gấp lắm.

tienminh 14-06-2009 08:44 PM

Đoạn mã 1 của bạn không thể gọi là PWM đúng nghĩa, không thể hiện được ưu điểm gì của 18F4431, Tôi nghĩ bạn không nên dùng cách này cho các ứng dụng công suất.
Còn đoạn 2 thì...Tôi cũng không biết giải thích thế nào nhưng tôi từng sử dụng CCS như trên và không được, có lẽ do hàm viết sẵn của nó nhiều khi dở hơi mình không kiểm soát được nội dung.
Chuyển sang dùng C18 và cấu hình cụ thể đến từng thanh ghi giúp cho chúng ta hiểu vấn đề hơn, kết quả là tôi tạo ra được PWM rất tốt.

truongqt 14-06-2009 09:01 PM

Trích:

Nguyên văn bởi tienminh (Post 26779)
Đoạn mã 1 của bạn không thể gọi là PWM đúng nghĩa, không thể hiện được ưu điểm gì của 18F4431, Tôi nghĩ bạn không nên dùng cách này cho các ứng dụng công suất.
Còn đoạn 2 thì...Tôi cũng không biết giải thích thế nào nhưng tôi từng sử dụng CCS như trên và không được, có lẽ do hàm viết sẵn của nó nhiều khi dở hơi mình không kiểm soát được nội dung.
Chuyển sang dùng C18 và cấu hình cụ thể đến từng thanh ghi giúp cho chúng ta hiểu vấn đề hơn, kết quả là tôi tạo ra được PWM rất tốt.

Anh tienminh dùng C18 chạy được rồi à, vậy anh cho em xin đoạn code luôn được ko anh. Em viết đoạn mã 1 để kiểm tra xem portB có bị hỏng không thôi, vì thấy PWM nó ko chạy. Cảm ơn anh đã trả lời sớm. Thanks much much...

tienminh 16-06-2009 12:32 AM

Bạn xem lại trang 1 có đoạn mã anh Namqn đã cho , có thể chạy trên 18F4431 và tạo được ra sin.

JohnnyNguyen 02-09-2009 12:35 AM

bác nào có file HEX của chương trình namqn viết ko,cả mô hình mạch nữa.gửi cho mình với.mình cũng đagn điều chế sóng sin,nhưng dùng dspic và C30.

JohnnyNguyen 17-09-2009 11:57 PM

Trích:

Nguyên văn bởi namqn (Post 25088)
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,

cho em hỏi,việc lựa chọn giá trị đỉnh 400 dựa vào yếu tố nào để lựa chọn.

nhanvh 18-09-2009 09:01 AM

Trích:

Nguyên văn bởi tienminh (Post 18381)
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);

}
}


Cảm ơn bạn Namqn. Bạn có nhiều bài rất hay về biến tần và PWM. Bạn cho tôi email được ko? Tôi đang nghiên cứu biến tần dùng PIC. Có rất nhiều điều cần bạn tư vấn. Bạn liên hệ với tôi qua vuongdaonhan@gmail.com

thuan_tb86 28-09-2009 10:36 AM

Anh namqn ơi. Em chuyển viết chương trình của anh sang CCS thi thay đổi tần số sóng Sin ra được. Anh chọn giá trị đỉnh có dựa trên cơ sở nao không anh hay là tuỳ mình chọn.

Ruby 07-10-2009 11:19 PM

bác tienminh làm ngon lành rồi thì giời thiệu cho a e đi, e cũng đang rất quan tâm đến vấn đề DC-AC như bác đã nghiên cứu

anhga 25-01-2010 11:44 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,

Chào anh Nam,
Em mới vào diễn đàn thấy các anh bàn luận hay quá.
Anh có thể giải thichcs giúp em tại sao a lại chọn giá trị đỉnh là 400 được k?
Anh căn cứ vào đâu để chọn như vậy?
Cám ơn anh nhiều!

namqn 25-01-2010 11:54 AM

Trích:

Nguyên văn bởi anhga (Post 33312)
Chào anh Nam,
Em mới vào diễn đàn thấy các anh bàn luận hay quá.
Anh có thể giải thichcs giúp em tại sao a lại chọn giá trị đỉnh là 400 được k?
Anh căn cứ vào đâu để chọn như vậy?
Cám ơn anh nhiều!

Bạn căn cứ vào giá trị tối đa dùng để tạo ra duty cycle = 100%. Ví dụ, nếu giá trị tương ứng với duty cycle = 100% là x thì chúng ta có thể chọn trị đỉnh bằng x/2 (duty cycle = 0% đến 100% sẽ tương ứng với cực tiểu và cực đại của sóng sin), đây là giá trị lớn nhất có thể dùng.

Module PWM của PIC có sự giới hạn đối với duty cycle khá gần 0% và 100%, do đó có thể giảm trị đỉnh xuống vài phần trăm để khắc phục.

Thân,

anhga 27-01-2010 12:42 AM

Trích:

Nguyên văn bởi namqn (Post 33313)
Bạn căn cứ vào giá trị tối đa dùng để tạo ra duty cycle = 100%. Ví dụ, nếu giá trị tương ứng với duty cycle = 100% là x thì chúng ta có thể chọn trị đỉnh bằng x/2 (duty cycle = 0% đến 100% sẽ tương ứng với cực tiểu và cực đại của sóng sin), đây là giá trị lớn nhất có thể dùng.

Module PWM của PIC có sự giới hạn đối với duty cycle khá gần 0% và 100%, do đó có thể giảm trị đỉnh xuống vài phần trăm để khắc phục.

Thân,

Xin cám ơn anh Nam,
Anh có thể giải thích cụ thể căn cứ chọn đỉnh thông qua code ví dụ a sửa cho bạn tienminh đc k?
Giá trị đỉnh của tín hiệu sine ra sau cầu H và giá trị điện áp 1 chiều cấp cho cầu H và bảng sine có quan hệ như thế nào hả a?
Em cám ơn anh nhiều!

anhga 28-01-2010 01:03 AM

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,

Chào a Nam,
Code a sửa ở trên có đúng k vậy. Tôi thấy giá trị thanh ghi PTPER = 199 (chính là giá trị duty max) vậy mà bảng sin để cập nhật duty lại có những giá trị lớn hơn 199 rất nhiều là sao? Liệu a Nam có nhầm nhọt k nhỉ:D

namqn 28-01-2010 11:21 AM

Trích:

Nguyên văn bởi anhga (Post 33377)
Chào a Nam,
Code a sửa ở trên có đúng k vậy. Tôi thấy giá trị thanh ghi PTPER = 199 (chính là giá trị duty max) vậy mà bảng sin để cập nhật duty lại có những giá trị lớn hơn 199 rất nhiều là sao? Liệu a Nam có nhầm nhọt k nhỉ:D

Code đã được thử nghiệm thực tế, đúng hay không thì bạn có thể tự kiểm nghiệm.

Với PIC18, nếu PTPER = 199 thì duty cycle = 100% sẽ ứng với 4*(PTPER + 1) = 4*(199 +1) = 800. Đề nghị bạn đọc lại datasheet của PIC18.

Thân,

anhga 28-01-2010 11:42 AM

Trích:

Nguyên văn bởi namqn (Post 33382)
Code đã được thử nghiệm thực tế, đúng hay không thì bạn có thể tự kiểm nghiệm.

Với PIC18, nếu PTPER = 199 thì duty cycle = 100% sẽ ứng với 4*(PTPER + 1) = 4*(199 +1) = 800. Đề nghị bạn đọc lại datasheet của PIC18.

Thân,

Bác lấy công thức 4*(PTPER + 1) = 4*(199 +1) = 800 ở đâu vậy? Em đọc datasheet con PIC8F4431 sao k thấy nhỉ?
Giá trị thanh ghi PDC có thể lớn hơn PTPER khi nào?
Em thấy nó chỉ lớn hơn đc khi clock của thằng PTMR lớn hơn clock PDC (chẳng hạn PTMR có clock là Tcy thì clock của PDC phải là Tcy/n; n = 2,3...).Đúng k bác Nam?
Chứ nếu cả hai thằng đều là Tcy thì k thể có chuyện giá trị thanh ghi PDC lớn hơn PTPER được đâu.

namqn 28-01-2010 12:07 PM

Trích:

Nguyên văn bởi anhga (Post 33383)
Bác lấy công thức 4*(PTPER + 1) = 4*(199 +1) = 800 ở đâu vậy? Em đọc datasheet con PIC8F4431 sao k thấy nhỉ?
Giá trị thanh ghi PDC có thể lớn hơn PTPER khi nào?
Em thấy nó chỉ lớn hơn đc khi clock của thằng PTMR lớn hơn clock PDC (chẳng hạn PTMR có clock là Tcy thì clock của PDC phải là Tcy/n; n = 2,3...).Đúng k bác Nam?
Chứ nếu cả hai thằng đều là Tcy thì k thể có chuyện giá trị thanh ghi PDC lớn hơn PTPER được đâu.

Kết hợp phương trình 17-1 và hình 17-11 trong datasheet, sẽ thấy PTPER được cập nhật theo Fcy (= Fosc/4), còn PDC được cập nhật theo Fosc.

Thân,

anhga 28-01-2010 12:43 PM

Trích:

Nguyên văn bởi namqn (Post 33384)
Kết hợp phương trình 17-1 và hình 17-11 trong datasheet, sẽ thấy PTPER được cập nhật theo Fcy (= Fosc/4), còn PDC được cập nhật theo Fosc.

Thân,

Em cám ơn a Nam rất nhiều!
Em xin bổ sung thêm là nếu ta chọn chia tần của bộ PWM Time Base là 1:1 thì khi đó độ phân giải của PTMR sẽ là Tcy (Tcy = Fosc/4) còn độ phân giải của PDC sẽ là Tcy/4 (Fosc). Tương tự khi ta chọn chia tần khác đi thì độ phân giải sẽ khác đi nhưng vẫn theo tỷ lệ 1:4. Và lưu ý là điều này chỉ đúng với PIC18 thôi. Đối với dsPIC30 hoặc dsPIC33 thì sẽ khác. Cụ thể các bạn đọc trong datasheet sẽ rõ.

Ruby 01-06-2010 12:17 AM

Luồng này mình thấy rất hay mà sao giờ trầm lắng quá nhỉ? Theo mình thấy code bác Nam viết chỉ enable cho PWM0 và 1, giờ mình muốn enable cho cả PWM2 và 3 nữa để đưa vào cho đủ cầu H thì xử lý trong giải thuật ntn ah? Bác Nam có thể gợi ý thêm giúp e ko? Vì e cũng ko rõ khi đặt enable PWM2, 3 trong PWMCON0 thì thuật toán phía sau xử lý ntn nữa để trong cầu H thì PWM1 và PWM3 đặt vào kênh cao, PWM0 và PWM2 đặt vào kênh thấp, tín hiệu điều biến là PWM1+ tín hiệu bù PWM0 sẽ phải ngược pha so với tín hiệu điều biến PWM3 + tín hiệu bù PWM2 (tín hiệu PWM1 dẫn nửa chu kỳ và PWM3 dẫn nửa chu kỳ còn lại).

phithientula 10-09-2010 01:14 AM

Trích:

Nguyên văn bởi namqn (Post 18663)
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,

sao bác tuoitrequaypha lại đưa ra hệ số là 6 vậy ạ?

HYknight 17-03-2011 07:29 PM

Chào các anh !
Bảng sin em lập như hướng dấn của anh Nam, Pic em dùng là 16F886, Fpwm = 20KHz
Nhưng không hiểu tại sao không thể chạy đúng
Nếu em dùng chương trình này cho Pic18 thì ok
Hay có điều gì về PWM của Pic16 mà em chưa đọc kĩ
Mong các anh giải thích giùm
Đây là chương trình của em :

Code:

#include <16f886.h>
#fuses  HS,NOWDT,NOPROTECT,NOLVP
#Device ADC = 10
#use    Delay(clock=20000000)

long Const Table_sin[400] =
{
500,507,515,523,531,539,547,554,562,570,578,585,593,601,609,616,624,631,639,647
,654,661,669,676,684,691,698,705,712,719,726,733,740,747,754,761,767,774,781,787
,793,800,806,812,818,824,830,836,842,847,853,859,864,869,875,880,885,890,895,899,
904,909,913,917,922,926,930,934,938,941,945,949,952,955,958,961,964,967,970,973,975,977
,980,982,984,986,987,989,991,992,993,995,996,996,997,998,999,999,999,999,100,999,
999,999,999,998,997,996,996,995,993,992,991,989,987,986,984,982,980,977,975,973,970
,967,964,961,958,955,952,949,945,941,938,934,930
,926,922,917,913,909,904,899,895,890,885,880,875,869,864,859,853,847,842,836,830,824,
818,812,806,800,793,787,781,774,767,761,754,747,740,733,726,719,712,705,698,691,684,
676,669,661,654,647,639,631,624,616,609,601,593,585
,578,570,562,554,547,539,531,523,515,507,500,492,484,476,468,460,452,445,437,429,421,
414,406,398,390,383,375,368,360,352,345,338,330,323,315,308,301,294,287,280,273,266,
259,252,245,238,232,225,218,212,206,199,193
,187,181,175,169,163,157,152,146,140,135,130,124,119,114,109,104,100,95,90,86,82,77,
73,69,65,61,58,54,50,47,44,41,38,35,32,29,26,24,22,19,17,15,13,12,10,8,7,6,4,3,3
,2,1,0,0,0,0,0,0,0,0,0,1,2,3,3,4,6,7,8,10,12,13,15,17,19,22,24,26,29,32,35,38,41,
44,47,50,54,58,61,65,69,73,77,82,86,90,95,100,104,109,114,119,124,130
,135,140,146,152,157,163,169,175,181,187,193,199,206,212,218,225,232,238,245,252
,259,266,273,280,287,294,301,308,315,323,330,338,345,352
,360,368,375,383,390,398,406,414,421,429,437,445,452,460,468,476,484,492};

Unsigned Int16 Index;

Void Main()
      { 
        Set_Tris_A(0x0F);
        Set_Tris_B(0x00);
        Set_Tris_C(0X02);

        Setup_Timer_2(T2_DIV_BY_1, 249, 1);
        Setup_ccp1(CCP_PWM);
        Index = 0;
       
        While(1)
          {
              Set_pwm1_duty(Table_sin[index]);
              Index++;
              if (index > 399 )
                {
                  Index=0;
                }
          }
       
      }


traixomtro_hy 19-03-2011 11:46 PM

điều chế độ rộng xung ra sin (SPWM)
 
bạn có thể vào trang này nó sẽ hướng dẫn cụ thể cách lập bảng mã SPWM

http://hoiquandientu.com//read.php?579#entrymore

cái này có lâu rồi mà . khi điều khiển cầu H cho nghịch lưu ở điện áp cao bạn nên để ý :

và lập trình khéo bạn phải cho khoảng thời gian deadtime vào .

còn để làm gì thì bạn chắc hiểu rồi .

mini_2440 21-03-2011 01:05 PM

Mình thử xem sao , cảm ơn mọi người nhiều,

dungd4 04-05-2011 07:42 PM

1 Attachment(s)
các anh ơi giúp em với!em dùng vi điều khiển pic18f4431 để điều khiển cầu nghịch lưu áp làm inverter,khi mô phỏng trên proteus thì ra sóng sine đúng biên độ và tần số nhưng điện áp cứ tăng lên rồi giảm xuống theo chu kỳ?em đã làm mạch và chạy cũng như mô phỏng vậy!các anh xem giúp có phải vì chương trình hay vì phần cứng em có gì sai không?
đây là chương trình và mô phỏng của em!

killua142 29-05-2011 05:28 PM

- Mấy anh cho em hỏi PTMRL là gì vậy và vì sao phải có điều kiện PTMRL >= 100 hoặc PTMRL >= 50.
PTMRL có phải là byte thấp của PTMR và nó sẽ đếm lên đến khi = PTPER thì reset về 0.
- Em mới tìm hiểu về Pwm mong được mọi người chỉ bảo cho.

minhminh17 19-07-2012 09:31 PM

xuat 500xung PWM Tpwm=5khz
 
dear cac bac pro pic18 hien em dang thu lap trinh C18 xuat power PWM Tpwm=5Khz xuat 500 xung thi dung khong xuat nua nhung chua ranh chi lam duoc den day bac chi giup em voi

void Motor_init()
{
//------------------------ PTCON0: PWM TIMER CONTROL REGISTER 0 -----------------------------//
// Postscale: 1:1
PTCON0bits.PTOPS0 = 0;
PTCON0bits.PTOPS1 = 0;
PTCON0bits.PTOPS2 = 0;
PTCON0bits.PTOPS3 = 0;
// time base input clock: 1:4 prescale
PTCON0bits.PTCKPS0 = 0;
PTCON0bits.PTCKPS1 = 1;
// Free running mode
PTCON0bits.PTMOD0 = 0;
PTCON0bits.PTMOD1 = 0;
// PWM PERIOD FOR FREE-RUNNING MODE:
// Tpwm = ((PTPER + 1) x PTMRPS) / (Fosc/4).
//(Desired period) (Period value) (prescale value)


//------------------------ PTCON1: PWM TIMER CONTROL REGISTER 1 -----------------------------//
PTCON1bits.PTEN = 0; // PWM time base is off

//------------------------ PWMCON0: PWM CONTROL REGISTER 0 -----------------------------//
// PWM outputs: PWM0-PWM1-PWM2-PWM3
PWMCON0bits.PWMEN0 = 0;
PWMCON0bits.PWMEN1 = 1;
PWMCON0bits.PWMEN2 = 0;
// Config pair output:
PWMCON0bits.PMOD0 = 1; // pair (PWM0, PWM1) is in the Independent mode
PWMCON0bits.PMOD1 = 1; // pair (PWM2, PWM3) //
PWMCON0bits.PMOD2 = 1; // pair (PWM4, PWM5) //
PWMCON0bits.PMOD3 = 1; // pair (PWM6, PWM7) //

//------------------------ PWMCON1: PWM CONTROL REGISTER 1 -----------------------------//
// PWM Special Event Trigger: 1:1 postscale
PWMCON1bits.SEVOPS0 = 0;
PWMCON1bits.SEVOPS1 = 0;
PWMCON1bits.SEVOPS2 = 0;
PWMCON1bits.SEVOPS3 = 0;

PWMCON1bits.SEVTDIR = 0; // A Special Event Trigger will occur when the PWM time base is counting upwards
PWMCON1bits.UDIS = 0; // Updates from Duty Cycle and Period Buffer registers are enabled
PWMCON1bits.OSYNC = 0; // Output overrides via the OVDCON register are asynchronous

// Time base beginning value
PTMRL = 0;
PTMRH = 0;
// Period value: 249 <==> Tpwm = 5Khz
PTPERH = 0;
PTPERL = 0xF9;
// Max Duty cycle = Period value x 4.
PTCON1bits.PTEN = 1; // PWM time base is on

navypro_hvhq 02-04-2013 12:31 PM

Trích:

Nguyên văn bởi namqn (Post 18488)
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,

em mới gia nhập anh có thể chỉ giúp em được không ah nếu được anh gửi thẳng hay trao đổi thẳng với em qua mail: navypro_hvhq@yahoo.com.vn
thanhks anh

navypro_hvhq 02-04-2013 04:33 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,

chào bác namqn bác có code ccs không chứ c18 thì với em lạ hoắc em mới học pic mong anh chỉ giúp

navypro_hvhq 02-04-2013 04:35 PM

em làm thế này
 
đây là code em kiếm được nhưng chạy được tẹo là lại lỗi không chạy tiếp ai biết chỉ em với

#include <18f4431.h>
#fuses H4,NOWDT,NOPROTECT,NOLVP
#use delay(clock=40000000)
const INT16 sin_wave[400]=
{
998,1013,1028,1043,1058,1072,1087,1102,1117,1132,
1146,1161,1176,1190,1205,1219,1234,1248,1263,1277,
1291,1305,1319,1333,1347,1361,1375,1388,1402,1415,
1428,1442,1455,1468,1481,1493,1506,1519,1531,1543,
1555,1567,1579,1591,1602,1614,1625,1636,1647,1658,
1668,1679,1689,1699,1709,1719,1729,1738,1747,1756,
1765,1774,1782,1790,1799,1806,1814,1822,1829,1836,
1843,1849,1856,1862,1868,1874,1880,1885,1890,1895,
1900,1904,1908,1912,1916,1920,1923,1926,1929,1932,
1934,1937,1939,1940,1942,1943,1944,1945,1946,1946,
1946,1946,1946,1945,1944,1943,1942,1940,1939,1937,
1934,1932,1929,1926,1923,1920,1916,1912,1908,1904,
1900,1895,1890,1885,1880,1874,1868,1862,1856,1849,
1843,1836,1829,1822,1814,1806,1799,1790,1782,1774,
1765,1756,1747,1738,1729,1719,1709,1699,1689,1679,
1668,1658,1647,1636,1625,1614,1602,1591,1579,1567,
1555,1543,1531,1519,1506,1493,1481,1468,1455,1442,
1428,1415,1402,1388,1375,1361,1347,1333,1319,1305,
1291,1277,1263,1248,1234,1219,1205,1190,1176,1161,
1146,1132,1117,1102,1087,1072,1058,1043,1028,1013,
998,983,968,953,938,924,909,894,879,864,
850,835,820,806,791,777,762,748,733,719,
705,691,677,663,649,635,621,608,594,581,
568,554,541,528,515,503,490,477,465,453,
441,429,417,405,394,382,371,360,349,338,
328,317,307,297,287,277,267,258,249,240,
231,222,214,206,197,190,182,174,167,160,
153,147,140,134,128,122,116,111,106,101,
96,92,88,84,80,76,73,70,67,64,
62,59,57,56,54,53,52,51,50,50,
50,50,50,51,52,53,54,56,57,59,
62,64,67,70,73,76,80,84,88,92,
96,101,106,111,116,122,128,134,140,147,
153,160,167,174,182,190,197,206,214,222,
231,240,249,258,267,277,287,297,307,317,
328,338,349,360,371,382,394,405,417,429,
441,453,465,477,490,503,515,528,541,554,
568,581,594,608,621,635,649,663,677,691,
705,719,734,748,762,777,791,806,820,835,
850,864,879,894,909,924,938,953,968,983};

#bit TBInt_pin = 0xfa4.4
#byte PTMRL = 0XF7D
#byte PTMRH = 0XF7C
unsigned INT32 index1 = 0;
unsigned INT32 index2 = 399;
void main()
{
setup_power_pwm_pins(PWM_COMPLEMENTARY,PWM_COMPLEM ENTARY,PWM_OFF,PWM_OFF);
setup_power_pwm(PWM_CLOCK_DIV_4|PWM_FREE_RUN,1,0,4 99,0,1,10);
while (1)
{
if (TBINT_PIN == 1 && PTMRL >= 100)
{
set_power_pwm0_duty(sin_wave[index1]);
index1++;
set_power_pwm2_duty(sin_wave[index2]);
index2--;
TBINT_PIN= 0;
if (index1 >=400) index1=0;
if (index2 <=0)
{ set_power_pwm2_duty(sin_wave[index2]);
index2=399;
}
}
}
}

navypro_hvhq 15-04-2013 12:04 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 !

lên google mà tìm hôm bữa mình cũng làm cái này lên tìm phát được luôn

tuanlovetien 07-11-2013 05:27 PM

bác namqn cho em hỏi vấn đề này em đang làm đề tài inverter dùng dspic với thuật pid,em trong chu kỳ chia ra 20 bậc,trung bình mỗi bậc là 1ms,giá trị đặt được thay đổi bằng cách dùng bảng tra sin nhưng chỉ có 1ms thì liệu hệ thống có đáp đứng k bác,em chỉ làm pid cho động cơ nhưng lấy mẫu tới 25ms,giờ làm cái này chỉ có 1ms,bác có cách sử lí pid nào khác hơn không gợi ý cho em làm với.

xuanthuan 03-01-2015 02:06 AM

hihi em vừa làm thành công con inventer 12>>220v pure sine
 
em lang thang trên mạng thì tìm được cái code của mấy anh điện tử việt nam lên em làm thử quả nhiên ra sine thật mấy anh à đây là link của em nó các anh xem xong chém nhẹ hihi
có gì anh nam sửa cho em cái sai sót

https://www.facebook.com/video.php?v...type=2&theater

NguyenDucTin 21-09-2015 10:47 AM

mọi người có ai lập trình tạo sin PWM cho pic 18f4431 chưa giậy? chỉ mình sai chổ nào trog code này đi. mình sửa mãi mà không chạy. trong đồ án nghịch lưu 3 pha... ;(((

code mình:

#include<htc.h>
//#include<stdio.h>
#include<math.h>
__CONFIG(1,HS);//HS
__CONFIG(2,WDTWINDIS);
__CONFIG(3,MCLREN,PWM4RB5,PWRTDIS);
__CONFIG(4,LVPDIS,STVRDIS,BORDIS);
#define _XTAL_FREQ 20000000
float Ta,Tb,To,U,V,W;
char sector;
unsigned int i,j;

unsigned int data[300]={0,40,81,121,161,202,242,282,322,363,403,443,
484,524,564,604,645,685,725,765,805,846,886,926,96 6,1006,1047,1087,1127,
1167,1207,1247,1287,1327,1367,1407,1447,1487,1527, 1567,1607,1647,1687,
1727,1767,1806,1846,1886,1926,1965,2005,2045,2084, 2124,2164,2203,2243,
2282,2322,2361,2401,2440,2480,2519,2558,2598,2637, 2676,2715,2754,2793,
2833,2872,2911,2950,2989,3027,3066,3105,3144,3183, 3222,3260,3299,3337,3376,
3415,3453,3491,3530,3568,3607,3645,3683,3721,3759, 3797,3835,3873,3911,3949,
3987,4025,4063,4100,4138,4176,4213,4251,4288,4326, 4363,4400,4437,4475,4512,
4549,4586,4623,4660,4697,4733,4770,4807,4843,4880, 4916,4953,4989,5026,5062,
5098,5134,5170,5206,5242,5278,5314,5350,5385,5421, 5457,5492,5527,5563,5598,
5633,5668,5704,5739,5774,5808,5843,5878,5913,5947, 5982,6016,6050,6085,
6119,6153,6187,6221,6255,6289,6323,6356,6390,6424, 6457,6490,6524,6557,6590,
6623,6656,6689,6722,6755,6787,6820,6852,6885,6917, 6949,6981,7013,7045,7077,
7109,7141,7172,7204,7235,7267,7298,7329,7360,7391, 7422,7453,7484,7514,
7545,7576,7606,7636,7666,7696,7726,7756,7786,7816, 7846,7875,7904,7934,7963,
7992,8021,8050,8079,8108,8136,8165,8193,8222,8250, 8278,8306,8334,8362,8390,
8417,8445,8472,8500,8527,8554,8581,8608,8635,8662, 8688,8715,8741,8767,8793,
8820,8846,8871,8897,8923,8948,8974,8999,9024,9049, 9074,9099,9124,9149,9173,
9198,9222,9246,9270,9294,9318,9342,9365,9389,9412, 9436,9459,9482,9505,9528,
9550,9573,9595,9618,9640,9662,9684,9706,9728,9749, 9771,9792,9814,9835,
9856,9877,9898,9918,9939,9959,9980};

/*unsigned int data[300]={127, 130, 132, 135, 138, 140, 143, 146, 148, 151, 153, 156,
159, 161, 164, 166, 169, 171, 174, 176, 179, 181, 183, 186, 188, 191, 193, 195, 197, 199, 202, 204, 206, 208, 210, 212, 214,
216, 218, 220, 221, 223, 225, 227, 228, 230, 231, 233, 234, 236, 237, 238, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 249,
250, 251, 251, 252, 252, 253, 253, 253, 254, 254, 254, 254, 254, 254, 254, 254, 254, 253, 253, 253, 252, 252, 251, 251, 250, 249, 249,
248, 247, 246, 245, 244, 243, 242, 241, 240, 238, 237, 236, 234, 233, 231, 230, 228, 227, 225, 223, 221, 220, 218, 216, 214, 212, 210,
208, 206, 204, 202, 199, 197, 195, 193, 191, 188, 186, 183, 181, 179, 176, 174, 171, 169, 166, 164, 161, 159, 156, 153, 151, 148, 146,
143, 140, 138, 135, 132, 130, 127, 124, 122, 119, 116, 114, 111, 108, 106, 103, 101, 98, 95, 93, 90, 88, 85, 83, 80, 78, 75, 73, 71, 68,
66, 63, 61, 59, 57, 55, 52, 50, 48, 46, 44, 42, 40, 38, 36, 34, 33, 31, 29, 27, 26, 24, 23, 21, 20, 18, 17, 16, 14, 13, 12, 11, 10,9,8,7,6,
5,5,4,3,3,2, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 3, 3, 4, 5, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 18, 20, 21, 23, 24, 26, 27, 29,
31, 33, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 55, 57, 59, 61, 63, 66, 68, 71, 73, 75, 78, 80, 83, 85, 88,
90, 93, 95, 98, 101, 103, 106, 108, 111, 114, 116, 119, 122, 124};*/
void main()
{
char m=0;
i=sector=0;
//khoi tao PWM tan so 5KHz, => T = 0.0002(s)
PTCKPS1= 0; PTCKPS0=0; // bo chia 1:1--------------------------------------

PTMOD1=1; PTMOD0 =0; // continuos up/down counting

PTEN =1; // PWM time base on

PWMEN2 = 1; PWMEN1 = PWMEN0 =0; // dung cac chan PWM0--5

PMOD0 = PMOD1 = PMOD2 = 1; // independent : chay doc lap
// complementary : chay bu tru nhau

SEVOPS3 = SEVOPS2 = SEVOPS1 = SEVOPS0 =0; // các bit co dãn ngõ ra PWM dac biet. : 1-1
//-------------------------------------------------------------

//tan so PWM 5KHz -> T = 1/5000 = 0.0002(s)
/*(PTPER.4+1).4.Pre/Fosc=1/T
=> (PTPER.4+1).4.Pre = 4000
chon Pre = 1.
=> PTPER = 250.
PTPER = PTPERH.256 + PTPERL
=> PTPERH = 0 , PTPERL =250
Ts = PTPER*4
*/
PTPERH =0; PTPERL =250;

// dead time 1us
DTCON = 0b00000001;

// interrupt PWM
PTIE =1; PTIF = 0; IPEN = 1; GIE = 1;
LATB6 =1; RB6 =1;

while(1)
{}
}
void interrupt ngat()
{
if(PTIF)
{
Ta=50.0*data[299-i]/150.0;
Tb=50.0*data[i]/150.0;
To=(250-Ta-Tb)/2.0;
i=i+3;
if(i>=300)
{
i=0;
sector++;
if(sector>6)
sector=1;
}
switch(sector)
{
case 1:
U= To;
V=To+Ta;
W=250-To;
RD0=1;
break;
case 2:
U= To+Tb;
V=To;
W=250-To;
RD0=0;
break;
case 3:
U= 250-To;
V=To;
W=To+Ta;
RD0=1;
break;
case 4:
U= 250-To;
V=To+Tb;
W=To;
RD0=0;
break;
case 5:
U= To+Ta;
V=250-To;
W=To;
RD0=1;
break;
case 6:
U= To;
V=250-To;
W=To+Tb;
RD0=0;
break;
}
PDC0H=(char)(U/256.0);PDC0L=(char)(U-PDC0H*256.0);
PDC1H=(char)(V/256.0);PDC1L=(char)(V-PDC1H*256.0);
PDC2H=(char)(W/256.0);PDC2L=(char)(W-PDC2H*256.0);
PTIF=0;
}

}

chaukyo 28-11-2015 12:37 PM

Trích:

Nguyên văn bởi xuanthuan (Post 85187)
em lang thang trên mạng thì tìm được cái code của mấy anh điện tử việt nam lên em làm thử quả nhiên ra sine thật mấy anh à đây là link của em nó các anh xem xong chém nhẹ hihi
có gì anh nam sửa cho em cái sai sót

https://www.facebook.com/video.php?v...type=2&theater

Chỉ có mỗi cái video thì bạn làm sao được hay vậy:


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