主函数:
四极管:主函数文件(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++; //用于计算角度,备用~~~~ } }
转载请注明出处。作者:四极管。广西师范大学 电子工程学院大学生科技创新基地 邮箱: [email protected]。