?? code.c
字號:
#include <pic.h>
#define ADNUM 805
//base 0.
//const unsigned int Sin[100] = {0,1,2,4,6,9,12,16,20,25,30,35,41,48,55,63,71,79,88,97,106,116,127,138,149,160,172,184,197,209,223,236,250,263,278,292,306,321,336,351,367,382,398,413,429,445,461,477,493,509,524,540,556,572,588,604,619,635,650,666,681,696,711,725,739,754,767,781,794,808,820,833,845,857,868,879,890,901,911,920,929,938,946,954,962,969,976,982,987,992,997,1001,1005,1008,1011,1013,1015,1016,1017,1018};
//base 10
const unsigned int Sin[100] = {10,11,12,13,16,18,22,25,29,34,39,45,51,57,64,71,79,87,96,105,114,124,134,145,156,167,179,191,203,215,228,241,255,268,282,296,310,325,340,354,369,384,400,415,430,446,462,477,493,509,524,540,555,571,587,602,617,633,648,663,677,692,707,721,735,749,762,776,789,802,814,826,838,850,861,872,883,893,903,912,921,930,938,946,953,960,966,972,978,983,988,992,995,999,1001,1004,1005,1006,1007,1007};
// base 25.
//const unsigned int Sin[100] = {25,25,27,28,31,33,36,40,44,48,53,59,64,71,77,84,92,100,108,117,126,136,146,156,166,177,189,200,212,224,237,249,262,275,289,303,316,330,345,359,374,388,403,418,433,448,463,478,493,509,524,539,554,569,584,599,614,629,643,658,672,687,701,714,728,742,755,768,780,793,805,817,828,840,851,861,871,881,891,900,909,917,925,933,940,946,953,958,964,969,973,977,981,984,986,989,990,992,992,992};
//這是50的差值。
//const unsigned int Sin[100] = {50,51,52,53,55,58,61,64,68,72,77,82,87,93,100,106,114,121,129,137,146,155,164,174,184,194,205,216,227,239,251,263,275,287,300,313,326,340,353,367,381,394,408,423,437,451,465,480,494,509,523,537,552,566,580,594,609,623,636,650,664,677,691,704,717,730,742,754,766,778,790,801,812,823,833,843,853,862,871,880,888,896,903,911,917,924,930,935,940,945,949,953,956,959,962,964,965,967,967,968};
//base 100.
//const unsigned int Sin[100] = {100,100,101,103,105,107,109,112,116,120,124,128,133,139,144,150,157,163,170,178,185,193,202,210,219,229,238,248,258,268,279,289,300,312,323,334,346,358,370,382,394,407,419,432,445,457,470,483,496,509,521,534,547,560,572,585,598,610,623,635,647,659,671,683,694,705,717,728,738,749,759,769,779,788,798,807,815,824,832,839,847,854,860,867,873,878,884,889,893,897,901,905,908,910,912,914,916,917,917,917};
static unsigned int step;
unsigned long int longbuf;
unsigned int tempint;
unsigned char tempchar, datamul;
bit Fbit;
bit ADbit,ADFbit;
unsigned int ADdata,tempAD;
unsigned char ADmul,ADcnt;
unsigned int Rcnt;
unsigned int delay,delay2;
void main (void)
{
//-------------------------------------var initlize.
step = 49;
Fbit = 1;
ADbit = 1;
ADmul = 200;
ADcnt = 0;
Rcnt = 0;
datamul = 200; //must be low 255.
//-------------------------------------initlize.
RB2 = 1;
RC2 = 1;
TRISC2 = 0;
TRISC7 = 0;
TRISC6 = 0;
TRISA4 = 0;
TRISA1 = 0;
TRISB2 = 0;
RB2 = 1;
RC2 = 1;
//=============== COMPARE.
CM1CON0 = 0x16;
CM2CON0 = 0x17;
CM2CON1 = 0x32;
SRCON = 0x00; //...???
VRCON = 0x00; //??????
C1IF = 0;
C1IE = 0;
C2IF = 0;
C2IE = 0;
C1ON = 0;
C2ON = 0;
//=============== INT.
TRISB0 = 1;
INTEDG = 0;
INTE = 0;
INTF = 0;
//=============== AD.
ANSEL = 0x08;
TRISA3 = 1;
ANSELH = 0x20;
TRISB5 = 1;
ADCON0 = 0xF4;
ADCON1 = 0x90;
ADIF = 0;
ADIE = 0;
ADON = 1;
//=============== TIMER2.PWM1.PWM2.
TMR2 = 0;
T2CON = 0x08;
PR2 = 251; //251--> 100-> 50.1Hz;
TMR2IF = 0;
TMR2IE = 1;
CCP1CON = 0x8F; //ECCP1.
PWM1CON = 0x0a; //05 ---> 1uS, 04 ---> 0.8uS,06 ---> 1.2uS;
ECCPAS = 0x55; //過障保護。INT-->過流保護;
PSTRCON = 0x13; //PWM IO SET. and refresh Set.
CCP2CON = 0x00; //CCP2.
CCPR2L = 0x80;
//================ COMP.
// ANS2 = 1;
// ANS3 = 1; //模擬輸入電壓參考端+5V。
// ANS9 = 1;
// ANS10 = 1;
TRISA2 = 1;
TRISA3 = 1;
TRISB3 = 1;
TRISB1 = 1;
CM1CON0 = 0x07;
CM2CON0 = 0x06;
CM2CON1 = 0x30;
C1OE = 1;
SRCON = 0x00;
VRCON = 0x3C; //外部參考電壓分壓調節
VREN = 1;
C1IE = 0;
C2IE = 0; //interrupt process.
C1ON = 1;
C2ON = 1;
// ================ 延時啟動。
delay = 0;
delay2 = 0;
while (1)
{
for (delay = 0; delay < 500; delay ++);
if (C1OUT == 0)
delay2 ++;
else
delay2 = 0;
if (delay2 > 5)
break;
}
for (delay = 0; delay < 300; delay ++)
for (delay2 = 0; delay2 < 6000; delay2 ++);
ECCPASE = 0;
TMR2ON = 1; //延時開啟PWM。
//================= 中斷.
PEIE = 1;
GIE = 1;
//-------------------------------------main code.
while (1)
{
NOP();
//-------------------- AD processe.
if (ADbit)
{
ADIF = 0;
GODONE = 1;
NOP();
NOP();
while (!ADIF);
ADIF = 0;
NOP();
ADdata = ADRESH;
ADdata <<= 8;
ADdata += ADRESL;
/*
if (ADdata > 900)
{
if (ADmul != 250)
ADmul ++;
}
else
{
if (ADmul != 150)
ADmul --;
}
*/
if (ADdata > ADNUM)
{
tempAD = ADdata - ADNUM;
ADFbit = 1;
}
else
{
tempAD = ADNUM - ADdata;
ADFbit = 0;
}
if (tempAD > 3) //5
{
if (ADFbit)
{
if (ADmul != 250)
ADmul ++;
}
else
{
if (ADmul != 150)
ADmul --;
}
}
ADbit = 0;
}
//-------------------- R_Protect.
if (C2OUT == 1)
{
RA1 = 0;
if (Rcnt > 35000)
ECCPASE = 1;
}
else
{
RA1 = 1;
Rcnt = 0;
}
//--------------------- other;
NOP();
NOP();
}
}
void interrupt ISR (void)
{
if (TMR2IE && TMR2IF)
{
TMR2IF = 0;
RC7 = 1; //for Test.
if (Fbit)
{
step ++;
if (step == 50) //..
{
datamul = ADmul; //refresh PWM datamul.
ADcnt ++;
//if (ADcnt == 2)
{
ADbit = 1;
ADcnt = 0;
}
}
if (step == 100)
{
Fbit = 0;
}
}
else
{
step --;
if (step == 1)
{
Fbit = 1;
}
}
longbuf = Sin[step -1];
if (step > 50)
{
longbuf = (longbuf - 509) * datamul;
tempint = longbuf >> 8;
tempint += 509;
}
else
{
longbuf = (509 -longbuf) * datamul;
tempint = longbuf >> 8;
tempint = 509 - tempint;
}
//longbuf =longbuf * datamul;
//tempint = longbuf >> 8; //datamul <= 255;
CCPR1L = tempint >> 2;
tempchar = tempint;
tempchar <<= 4;
CCP1CON = (CCP1CON & 0xCF) | (tempchar & 0x30);
Rcnt ++;
RC7 = 0; //for test.
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -