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 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.


Múi giờ GMT. Hiện tại là 10:55 PM.

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