Ðăng Nhập

View Full Version : PWM với PIC16F886


vakk
12-05-2012, 10:27 AM
Mọi người cho em hỏi về PWM trên pic16f886 ,thạch anhh tần số 20MHz, ra 220VAC từ 310VDC thì tần số PWM bao nhiêu là phù hợp.giả sử em đã chọn được tần số phù hợp ,giá trị max là 310 thì để có duty từ 5% tới 95% .
310 sẽ tương ứng với 95%, vậy 100% sẽ là ~327
vậy pulse max=(327*Tosc)*Prescale(timer2)=> f=1/(pulse max)
với 5%: thì giá trị cần nạp là 327*5/100~16;
với 95% sẽ là 310
vậy công thức tính bảng sin trong exel là 147*sin(2*3.14*t/n)+147+16;
đảm bảo giá trị max là 310 và min là 16
cho em hỏi những công thức trên có sai không.
Pic có 4 chân P1A,P1B,P1C,P1D nhưng hiện tại em chỉ xuất xung PWM ra được 2 chân là P1A và P1B (half bridge), làm thế nào em có thể đưa xung ra cả 4 chân để ghép với mạch cầu.
Thanks

vakk
15-05-2012, 02:50 PM
ngày qua ngày :D
upppppppp

vakk
20-05-2012, 01:37 PM
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