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)

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.


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