主函数:
四极管:主函数文件(main.c)
#ifndef MAIN_C
#define MAIN_C
#include <avr/io.h>
#include <move.h>
#include <move_1.h>
//===========================================
int main(void)
{
DDRC=0X00;
while(1)
{
if( XmotorStepNum<100)
{
x_up();
}
//step(200);
//拍数模式
/*engine_port=0x66; //调用RR()前先给一个初值以便电机启动
RR();*/
}
}
#endif
步进电机驱动 晕。。。当时不知道怎么想的··写到.h里面了··不过为了保留完整性,以便以后自己留作菜鸟纪念,上传源码不再做任何修改。
四极管:步进电机驱动文件(move.h)
#ifndef MOVE_H
#define MOVE_H
/***********************************
函数功能:步进电机控制程序
函数说明:四线方式,数据输出线:engine_port
使用环境: 硬件: MCU: ATmega32L
F_CPU = 16000000
外部:16000000
接线方法:4线
编译环境:WinAVR-20080610
模式说明:
半拍模式 精度高
单拍模式 速度快
双拍模式
包含文件 :<util/delay.h>
日期:2009年7月31日
修改者: 杨琦 (日期: )
**************************************************************************************/
#include <util/delay.h>
#define engine_port PORTC
uint64_t XmotorStepNum=0; //注意:XmotorStepNum的值决定拍数;双拍、单拍步进为1.8°;单拍步进为0.9°
uint64_t YmotorStepNum=0; //注意:XmotorStepNum的值决定拍数;双拍、单拍步进为1.8°;单拍步进为0.9°
//---------------------------------------------
unsigned int XmotorPortDataPiont=0;
unsigned int YmotorPortDataPiont=0;
//const unsigned char Motor_Data[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //半拍模式 精度高//步进角度 0.9度/步;现在是半步驱动。
const unsigned char Motor_Data[]={0x08,0x04,0x02,0x01};//0001,0010,0100,1000 //单拍模式 速度快
//const unsigned char Motor_Data[]={0x0c,0x06,0x03,0x09};//0001,0010,0100,1000 //双拍模式
/****************************************
** 函数名:x_up(void)
** 功能 :接低位————按X轴方向顺时针旋转
** 子函数:_delay_ms()
** 变量 :无
****************************************/
void x_up(void)
{
engine_port&=0xF0;
engine_port|=Motor_Data[XmotorPortDataPiont++];
XmotorStepNum+=1; //可计算圈数,备用~~~
if(XmotorPortDataPiont==4)XmotorPortDataPiont=0;
_delay_ms(5);
}
/****************************************
** 函数名:x_down(void)
** 功能 :接低位————按X轴方向逆时针旋转
** 子函数:_delay_ms()
** 变量 :无
****************************************/
void x_down(void)
{
engine_port&=0xF0;
engine_port|=Motor_Data[3-(XmotorPortDataPiont++)];
if(XmotorPortDataPiont==4)XmotorPortDataPiont=0;
XmotorStepNum+=1; //可计算圈数,备用~~~
_delay_ms(100);
}
/****************************************
** 函数名:y_up(void)
** 功能 :接高位————按y轴方向顺时针旋转
** 子函数:_delay_ms()
** 变量 :无
****************************************/
void y_up(void)
{
engine_port&=0x0F;
engine_port|=(Motor_Data[YmotorPortDataPiont++]<<4);
if(YmotorPortDataPiont==4)YmotorPortDataPiont=0;
YmotorStepNum-=1; //可计算圈数,备用~~~
_delay_ms(100);
}
/****************************************
** 函数名:y_down(void)
** 功能 :接高位————按y轴方向逆时针旋转
** 子函数:_delay_ms()
** 变量 :无
****************************************/
void y_down(void)
{
engine_port&=0x0F;
engine_port|=(Motor_Data[3-(YmotorPortDataPiont++)]<<4);
if(YmotorPortDataPiont==4)YmotorPortDataPiont=0;
YmotorStepNum+=1; //可计算圈数,备用~~~
_delay_ms(100);
}
/****************************************
** 函数名:x_stop(void)
** 功能 :停止接低位的电机
** 子函数:无
** 变量 :无
****************************************/
void x_stop(void)
{
PORTC&=0XF0;
}
/****************************************
** 函数名:y_stop(void)
** 功能 :停止接高位的电机
** 子函数:无
** 变量 :无
****************************************/
void y_stop(void)
{
PORTC&=0X0F;
}
/****************************************
** 函数名:all_stop(void)
** 功能 :全部停止
** 子函数:无
** 变量 :无
****************************************/
void all_stop(void)
{
x_stop();
y_stop();
}
#endif
还有一个
/*********************************** 函数功能:步进电机控制程序 函数说明:四线方式,数据输出线:engine_port 使用环境: 硬件: MCU: ATmega32L F_CPU = 16000000 外部:16000000 接线方法:4线 编译环境:WinAVR-20080610 模式说明: 循环左右移动,简洁模式 包含文件 :<util/delay.h> 日期:2009年7月31日 修改者: 杨琦 (日期: ) **************************************************************************************/ unsigned char i,j; uint32_t count=0; /**************************************** ** 函数名:RR(void) ** 功能 :接低位————按X轴方向顺时针旋转 ** 子函数:_delay_ms() ** 变量 :无 ****************************************/ void RR(void) { for(i=0;i<8;i++) //此循环实现的功能是循环右移 { j=engine_port&0x01; j<<=7; engine_port>>=1; engine_port|=j; _delay_ms(10); count++; //用于计算角度,备用~~~~ } } /**************************************** ** 函数名:RL(void) ** 功能 :接低位————按X轴方向逆时针旋转 ** 子函数:_delay_ms() ** 变量 :无 ****************************************/ void RL(void) { for(i=0;i<8;i++) //此循环实现的功能是循环左移 { j=engine_port&0x80; j>>=7; engine_port<<=1; engine_port|=j; _delay_ms(10); count++; //用于计算角度,备用~~~~ } }
转载请注明出处。作者:四极管。广西师范大学 电子工程学院大学生科技创新基地 邮箱: yangxingbo-0311@163.com。