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:
#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&DEBUG_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
vBulletin® v3.8.11, Copyright ©2000-2026, vBulletin Solutions Inc.