Ðề tài: PWM với PIC16F886
View Single Post
Old 20-05-2012, 01:37 PM   #3
vakk
Đệ tử 1 túi
 
Tham gia ngày: Sep 2010
Bài gửi: 17
:
Smile

sau một hồi mò mẫm thì em thấy hình như con số 310 chỉ là con số tượng trưng, cái ta cần là tỉ số giữa độ rộng xung và chu kì vì vậy ta có thể chọn tần số PWM trước rồi tính ra giá trị lớn nhất. Sau khi mò mẫm chương trình của em bằng HTpic:

Trích:
Nguyên văn bởi vakk View Post
#include <pic16f886.h>
#include <htc.h>
__CONFIG(FOSC_HS&WDTE_OFF&PWRTE_ON&MCLRE_ON&CP_OFF &CPD_OFF&BOREN_OFF&IESO_OFF&FCMEN_OFF&LVP_OFF&DEBU G_OFF);
__CONFIG(BOR4V_BOR21V&WRT_OFF);
int i=0;

const unsigned int sine[500]={400,405,409,414,418,423,427,432,436,441,445,450, 454,459,463,467,472,476,481,485,489,494,498,503,
507,511,515,520,524,528,532,537,541,545,549,553,55 7,561,565,569,573,577,581,585,589,593,597,600,604,
608,612,615,619,622,626,629,633,636,640,643,646,65 0,653,656,659,662,665,668,671,674,677,680,683,686,
688,691,694,696,699,701,704,706,709,711,713,715,71 8,720,722,724,726,728,729,731,733,735,736,738,739,
741,742,744,745,746,747,749,750,751,752,753,754,75 4,755,756,757,757,758,758,759,759,759,760,760,760,
760,760,760,760,760,760,759,759,759,758,758,757,75 7,756,755,754,754,753,752,751,750,749,748,746,745,
744,742,741,740,738,736,735,733,731,730,728,726,72 4,722,720,718,716,713,711,709,707,704,702,699,697,
694,691,689,686,683,681,678,675,672,669,666,663,66 0,656,653,650,647,643,640,637,633,630,626,623,619,
616,612,608,605,601,597,593,589,586,582,578,574,57 0,566,562,558,554,550,546,541,537,533,529,525,520,
516,512,507,503,499,494,490,486,481,477,472,468,46 4,459,455,450,446,441,437,432,428,423,419,414,410,
405,401,396,392,387,382,378,373,369,364,360,355,35 1,347,342,338,333,329,324,320,315,311,307,302,298,
294,289,285,281,277,272,268,264,260,256,251,247,24 3,239,235,231,227,223,219,215,212,208,204,200,196,
193,189,185,182,178,175,171,168,164,161,157,154,15 1,148,144,141,138,135,132,129,126,123,120,117,115,
112,109,107,104,101,99,96,94,92,89,87,85,83,81,79, 77,75,73,71,69,67,66,64,62,61,
59,58,56,55,54,53,52,50,49,48,47,47,46,45,44,44,43 ,42,42,41,41,41,40,40,40,
40,40,40,40,40,40,41,41,41,42,42,43,43,44,45,45,46 ,47,48,49,50,51,52,53,55,
56,57,59,60,62,63,65,67,68,70,72,74,76,78,80,82,84 ,86,89,91,93,96,98,100,103,
106,108,111,114,116,119,122,125,128,131,134,137,14 0,143,146,150,153,156,159,163,166,170,173,177,180,
184,188,191,195,199,202,206,210,214,218,222,226,23 0,234,238,242,246,250,254,258,262,266,271,275,279,
283,288,292,296,301,305,309,314,318,323,327,331,33 6,340,345,349,354,358,363,367,372,376,381,385,390,
394
};
void PORT(void)
{
TRISA=0x00;
TRISB=0x00;
TRISC=0x00;
PORTA=0x00;
PORTB=0x00;
PORTC=0x00;
}

void setduty(int duty)
{
int temp;
temp=duty&0x003;
CCP1CON=(CCP1CON&0x8C)|(temp<<4);
CCPR1L=duty>>2;

}


void PWM(void)
{
T2CON=0x00;//pre=1,post=1
TMR2IE=0;
TMR2IF=0;
TMR2=0;
PR2=199;
CCP1CON=0x8C;

PWM1CON=0x04;

}
void main(void)
{
PORT();

PWM();
TMR2ON=1;
while(1)
{
RC0^=1;

setduty(sine[i]);
while(!TMR2IF){}
i++;
if(i>=500) i=0;

TMR2IF=0;
}
}
tần số PWM là 25Khz.
Cho những ai cũng mới mò mẫm như em
vakk vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn