1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
| const unsigned char sin_table[416]=
{
0,16,33,49,64,79,93,106,118,129,138,146,153,158,161,163,163,161,158,153,146,138,129,118,106,93,79,64,49,33,16,0, //65%
0,17,34,51,67,82,97,110,122,134,143,152,158,164,167,169,169,167,164,158,152,143,134,122,110,97,82,67,51,34,17,0, //67.5%
0,18,35,52,69,85,100,114,127,138,149,157,164,169,173,175,175,173,169,164,157,149,138,127,114,100,85,69,52,35,18,0, //70%
0,18,36,54,71,88,103,118,131,143,154,163,170,175,179,181,181,179,175,170,163,154,143,131,118,103,88,71,54,36,18,0, //72.5%
0,19,38,56,74,91,107,122,136,149,160,169,176,182,186,188,188,186,182,176,169,160,149,136,122,107,91,74,56,38,19,0, //75%
0,20,39,58,77,94,111,126,141,153,165,174,182,188,192,194,194,192,188,182,174,165,153,141,126,111,94,77,58,39,20,0, //77.5%
0,20,40,60,79,97,114,130,145,158,170,180,188,194,198,200,200,198,194,188,180,170,158,145,130,114,97,79,60,40,20,0, //80%
0,21,41,62,81,100,118,134,149,163,175,185,193,199,204,206,206,204,199,193,185,175,163,149,134,118,100,81,62,41,21,0, //82.5%
0,22,43,64,84,103,122,139,154,168,181,191,200,206,211,213,213,211,206,200,191,181,168,154,139,122,103,84,64,43,22,0, //85
0,22,44,66,86,106,125,143,159,173,186,197,205,212,216,219,219,216,212,205,197,186,173,159,143,125,106,86,66,44,22,0, //87.5%
0,23,45,67,89,109,129,147,163,178,191,202,211,218,222,225,225,222,218,211,202,191,178,163,147,129,109,89,67,45,23,0, //90%
0,23,46,69,91,112,132,150,167,183,196,207,217,224,228,231,231,228,224,217,207,196,183,167,150,132,112,91,69,46,23,0, //92.5%
0,24,48,71,94,116,136,155,173,188,202,214,223,230,235,238,238,235,230,223,214,202,188,173,155,136,116,94,71,48,24,0, //95%
};
unsigned int TBL_POINTER_NEW, TBL_POINTER_OLD,
TBL_POINTER_SHIFT, SET_FREQ;
unsigned int DUTY_CYCLE, FBV, FB_Step, adder;
void interrupt()
{
if (TMR2IF_bit == 1){TBL_POINTER_NEW =
TBL_POINTER_OLD + SET_FREQ;
if (TBL_POINTER_NEW < TBL_POINTER_OLD){P1M1_bit =
~P1M1_bit;}
TBL_POINTER_SHIFT = TBL_POINTER_NEW >> 11;
DUTY_CYCLE = TBL_POINTER_SHIFT + adder;
CCPR1L = sin_table[DUTY_CYCLE];
TBL_POINTER_OLD = TBL_POINTER_NEW;
TMR2IF_bit = 0;
}}
void main()
{
SET_FREQ = 410;
TBL_POINTER_SHIFT = 0;
TBL_POINTER_NEW = 0;
TBL_POINTER_OLD = 0;
DUTY_CYCLE = 0;
FB_Step = 0;
adder = 0;
T1CON = 0b00001001;//1:1 Prescale Value, Enables Timer1
ANSEL = 0b00000001;//RA0/AN0 as analogue input.
TRISA = 0b00000001;//PortA as output except RA0 as input
ADCON0 = 0b00000011;//Analog Channel (AN0)
ADCON1 = 0b01100000;//FOSC/64
CMCON0 = 7;
PR2 = 249;
TRISC = 0x3F;
CCP1CON = 0x4C;
TMR2IF_bit = 0;
T2CON = 4;
while (TMR2IF_bit == 0);
TMR2IF_bit = 0;
TRISC = 0;
TMR2IE_bit = 1;
GIE_bit = 1;
PEIE_bit = 1;
ADC_Init();
while(1)
{
FBV = ADC_Get_Sample(0);
if (FBV < 512){FB_Step++;
if (FB_Step > 12) FB_Step = 12;
}
else
{
if (FB_Step > 0){FB_Step--;}}
adder = FB_Step << 5;
TMR1L = 0;
TMR1H = 0;
T1IF_bit = 0;
}
} |