![]() |
|
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 |
![]() |
#61 | |
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 |
|
![]() |
![]() |
![]() |
#62 | |
Đệ tử 1 túi
Tham gia ngày: Feb 2008
Bài gửi: 19
: |
Trích:
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õ. thay đổi nội dung bởi: anhga, 08-02-2010 lúc 12:58 PM. |
|
![]() |
![]() |
![]() |
#63 |
Nhập môn đệ tử
Tham gia ngày: May 2007
Bài gửi: 6
: |
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).
|
![]() |
![]() |
![]() |
#64 |
Nhập môn đệ tử
Tham gia ngày: Jul 2010
Bài gửi: 7
: |
sao bác tuoitrequaypha lại đưa ra hệ số là 6 vậy ạ?
thay đổi nội dung bởi: phithientula, 10-09-2010 lúc 01:23 AM. |
![]() |
![]() |
![]() |
#65 |
Nhập môn đệ tử
Tham gia ngày: Aug 2010
Bài gửi: 6
: |
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; } } } |
![]() |
![]() |
![]() |
#66 |
Nhập môn đệ tử
Tham gia ngày: Feb 2011
Bài gửi: 3
: |
![]() 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 . |
![]() |
![]() |
![]() |
#67 |
Đệ tử 1 túi
Tham gia ngày: Mar 2011
Bài gửi: 21
: |
Mình thử xem sao , cảm ơn mọi người nhiều,
|
![]() |
![]() |
![]() |
#68 |
Nhập môn đệ tử
Tham gia ngày: Aug 2010
Bài gửi: 2
: |
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! |
![]() |
![]() |
![]() |
#69 |
Nhập môn đệ tử
Tham gia ngày: Jun 2010
Bài gửi: 7
: |
- 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. thay đổi nội dung bởi: killua142, 29-05-2011 lúc 10:18 PM. |
![]() |
![]() |
![]() |
#70 |
Nhập môn đệ tử
Tham gia ngày: Apr 2008
Bài gửi: 4
: |
![]() 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 |
![]() |
![]() |
![]() |
#71 | |
Đệ tử 1 túi
Tham gia ngày: Aug 2012
Bài gửi: 24
: |
Trích:
thanhks anh |
|
![]() |
![]() |
![]() |
#72 | |
Đệ tử 1 túi
Tham gia ngày: Aug 2012
Bài gửi: 24
: |
Trích:
|
|
![]() |
![]() |
![]() |
#73 |
Đệ 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; } } } } |
![]() |
![]() |
![]() |
#74 |
Đệ tử 1 túi
Tham gia ngày: Aug 2012
Bài gửi: 24
: |
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
|
![]() |
![]() |
![]() |
#75 |
Nhập môn đệ tử
Tham gia ngày: Sep 2012
Bài gửi: 3
: |
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.
|
![]() |
![]() |