⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stepmotor.c

📁 用单片机来直接驱动步进电机很精确走小步子.
💻 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 + -