![]() |
|
Tài trợ cho PIC Vietnam |
Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC |
![]() |
|
Ðiều Chỉnh | Xếp Bài |
|
![]() |
#1 | |
Đệ tử 4 túi
Tham gia ngày: Dec 2006
Bài gửi: 79
: |
Trích:
http://www2.hcmut.edu.vn/~nxbac/data/ tìm đến tài liệu có tên: QUANG_LVTN_hoanchinh.pdf |
|
![]() |
![]() |
![]() |
#2 | |
Đệ tử 3 túi
Tham gia ngày: Oct 2006
Bài gửi: 50
: |
Trích:
Hiện nay chỉ thấy có PIC và AVR là tạo deadtime tin cậy mà lại phổ biến . Tôi làm mạch thực tế và thấy thời gian update dutycycle của hai loại là khác nhau, với PIC4431 thời gian update 50us là chạy không ổn định lắm , sau một lúc sẽ đứng im không phát xung nữa. Một chút so sánh của tôi trong trường hợp tạo SPWM giữa hai loại: - PIC18F4431 có 4 kênh PWM , AT90PWM có 2 hoặc 3 bộ - Clock đầu vào cực đại PWM của PIC4431 là 10MHz (PLLx4) và của AT90 là 60MHz - Đều có tạo deadtime linh động Tôi thực sự rất muốn dùng PIC4431 trong trường hợp này, và tôi nghĩ rằng chương trình tôi viết cơ bản là đúng, có bác nào nhìn thấy sai sót mong các bác chỉ bảo trên cơ sở giúp đỡ thực sự .thanks |
|
![]() |
![]() |
![]() |
#3 | |
Trưởng lão PIC bang
|
Trích:
Chương trình bạn viết có những chỗ sai cơ bản, tôi thử nghiệm code sửa đổi xong sẽ post lên cho bạn xem. Thân,
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 |
|
![]() |
![]() |
![]() |
#4 |
Đệ tử 3 túi
Tham gia ngày: Oct 2006
Bài gửi: 50
: |
Nếu được bác ra tay giúp đỡ, tôi xin cảm ơn nhiều.
|
![]() |
![]() |
![]() |
#5 |
Trưởng lão PIC bang
|
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; } } } Thân,
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 |
![]() |
![]() |
![]() |
#6 |
Đệ tử 3 túi
Tham gia ngày: Oct 2006
Bài gửi: 50
: |
Tôi xin cảm ơn sự nhiệt tình của bác,
cho tôi hỏi, bây giờ ta lọc thông thấp đầu ra của PWM thì sẽ được sine 62.5Hz phải không bác nhỉ? |
![]() |
![]() |
![]() |
#7 | |
Trưởng lão PIC bang
|
Trích:
Thân,
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 |
|
![]() |
![]() |
![]() |
#8 | |
Đệ tử 4 túi
Tham gia ngày: Dec 2006
Bài gửi: 79
: |
Trích:
|
|
![]() |
![]() |
![]() |
#9 | |
Trưởng lão PIC bang
|
Trích:
Để tần số là 50 Hz, bạn tạo bảng sine có 1000 giá trị cho một chu kỳ của tín hiệu được điều chế. Thân,
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 |
|
![]() |
![]() |
![]() |
#10 | |
Đệ tử 1 túi
Tham gia ngày: Feb 2008
Bài gửi: 19
: |
Trích:
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ỉ ![]() |
|
![]() |
![]() |
![]() |
#11 | |
Trưởng lão PIC bang
|
Trích:
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,
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 |
|
![]() |
![]() |
![]() |
#12 | |
Đệ tử 1 túi
Tham gia ngày: Aug 2012
Bài gửi: 24
: |
Trích:
|
|
![]() |
![]() |
![]() |
#13 |
Đệ tử 1 túi
Tham gia ngày: Aug 2012
Bài gửi: 24
: |
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; } } } } |
![]() |
![]() |
![]() |
#14 | |
Đệ tử 2 túi
Tham gia ngày: Jan 2007
Bài gửi: 34
: |
Trích:
thay đổi nội dung bởi: cuongthinh, 25-02-2009 lúc 10:25 AM. |
|
![]() |
![]() |
![]() |
#15 |
Đệ tử 2 túi
Tham gia ngày: Apr 2007
Nơi Cư Ngụ: Quảng Trị - Đà Nẵng
Bài gửi: 43
: |
![]() Bảng Sin được nêu trong bài này là làm thế nào mà có được vậy các bạn, ai biết ko chỉ giúp mình với, hay là chỉ cóp rồi sửa lại cái có sẵn. Ví dụ như ở trang 1, trong chuơng trình CCS có bảng sin 800 phần tử, vậy cách tìm ra chúng theo đúng yêu cầu, chẳng hạn với tuơng ứng tần số fx nào đó của sóng sin, thì thế nào? Mong các cao thủ chỉ giáo. Thanks. // ý mình là cách tìm ra các giá trị của bảng đó, 1 cách chính xác (vì nếu ko chính xác thì e...).
thay đổi nội dung bởi: truongqt, 21-04-2009 lúc 11:41 PM. |
![]() |
![]() |
![]() |
|
|