📄 stepmotor.c
字号:
#include <iom48v.h>
#include <macros.h>
unsigned char speed = 220;
unsigned char busyflag = 0;
char dirflag = 1;
unsigned int currentdegree = 0;
unsigned int desiredegree = 0;
int degree = 0;
int degree2 = 32;
const unsigned char sin1[192] = {
0,
8,
17,
25,
33,
42,
50,
58,
66,
74,
82,
90,
98,
105,
113,
120,
127,
135,
142,
149,
155,
162,
168,
174,
180,
186,
192,
197,
202,
207,
212,
217,
221,
225,
229,
232,
236,
239,
241,
244,
246,
248,
250,
252,
253,
254,
254,
255,
255,
255,
254,
254,
253,
252,
250,
248,
246,
244,
241,
239,
236,
232,
229,
225,
221,
217,
212,
207,
202,
197,
192,
186,
180,
174,
168,
162,
155,
149,
142,
135,
128,
120,
113,
105,
98,
90,
82,
74,
66,
58,
50,
42,
33,
25,
17,
8,
255,
247,
238,
230,
222,
213,
205,
197,
189,
181,
173,
165,
157,
150,
142,
135,
128,
120,
113,
106,
100,
93,
87,
81,
75,
69,
63,
58,
53,
48,
43,
38,
34,
30,
26,
23,
19,
16,
14,
11,
9,
7,
5,
3,
2,
1,
1,
0,
0,
0,
1,
1,
2,
3,
5,
7,
9,
11,
14,
16,
19,
23,
26,
30,
34,
38,
43,
48,
53,
58,
63,
69,
75,
81,
87,
93,
100,
106,
113,
120,
127,
135,
142,
150,
157,
165,
173,
181,
189,
197,
205,
213,
222,
230,
238,
247
};
const unsigned char sin2[192] = {
0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,
1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1};
void timer0_init(void)
{
CLI();
TCCR0B = 0x00;
TIMSK0 = 0x01;
TCNT0 = 0x00;
TCCR0A = 0xA3;
busyflag = 0;
SEI();
}
#pragma interrupt_handler timer0_ovf_isr:17
void timer0_ovf_isr(void)
{
static unsigned char temp = 0;
temp++;
if (temp >= speed)
{
temp = 0;
if (busyflag == 1)
{
if(dirflag == 1)
{
if(degree >= 191)
{
degree = 0;
}
else degree++;
if(degree2 >= 191)
{
degree2 = 0;
}
else degree2++;
}
else if(dirflag == -1)
{
if(degree <= 0)
{
degree = 191;
}
else degree--;
if(degree2 <= 0)
{
degree2 = 191;
}
else degree2--;
}
currentdegree++;
if (currentdegree >= desiredegree)
{
busyflag = 0;
}
}
if (sin2[degree] == 1)
{
PORTC = (PORTC)|(0x01);
OCR0A = sin1[degree];
}
else
{
PORTC = (PORTC)&(0xFE);
OCR0A = sin1[degree];
}
if (sin2[degree2] == 1)
{
PORTC = (PORTC)|(0x02);
OCR0B = sin1[degree2];
}
else
{
PORTC = (PORTC)&(0xFD);
OCR0B = sin1[degree2];
}
}
}
void step(char direction, unsigned int todegree, unsigned char tospeed)
{
if (direction == -1)
{
dirflag = -1;
}
else if (direction == 1)
{
dirflag = 1;
}
if (tospeed > 0)
{
speed = (unsigned char) (255 - tospeed);
}
if ( todegree > 0 )
{
currentdegree = 0;
desiredegree = todegree;
busyflag = 1;
}
TCCR0B = 0x01;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -