/////////////////////////////////////////////////////////////////////////////////// //文件名:motor.c // ////////////////////////////////////////////////////////////////////////////////// #include "stepmotor.h" /******************************************************* name :main function : API 接口 调试 ********************************************************/ int main() { StepmotorPort_Init() ; Stepmotor_Run(ATICLOCK,STEPMOTORREVBASE+300) ; while(1) ; return 0 ; } /////////////////////////////////////////////////////////////////////////////////// //文件名:stepmotor.c ////////////////////////////////////////////////////////////////////////////////// #include "stepmotor.h" void __irq Stepmotor_Int(void) ; //步进电机变量结构体 struct _STEPMOTOR { uint8 dir ; //转动方向 uint16 rev ; //转速 uint8 count ; }; struct _STEPMOTOR stepmotor ; /**************************************************************** name : StepmotorPort_Init function :步进电机端口初始化 *****************************************************************/ void StepmotorPort_Init() { PINSEL2 &= 0xFFFFFFCF ; IO2DIR |= 0x00780000 ; //P2.19 P2.20 P2.21 P2.22 FOR OUT IO2SET |= 0x00780000 ; } /**************************************************************** name : StepmotorInt_Init function : 步进电机中断初始化 parameter: rev : 步进电机转速 ,rev值越大,步进电机转动越快 *****************************************************************/ void StepmotorInt_Init( uint16 rev ) { T1MCR = 0x600 ; T1MR3 = ( Fpclk/rev ) ; // T1PR = 0 ; T1PC = 0 ; T1TC = 0 ; T1TCR = 0x01 ; VICIntSelect &= 0xFFFFFFDF ; VICVectCntl0 = 0x25 ; VICVectAddr0 = (int)Stepmotor_Int ; VICIntEnable |= 0x00000020 ; } ////////////////////////////////////////////////////// // API interface function // rundir :步进电机转动方向 1: 0: // runrev :转动速度 /////////////////////////////////////////////////////// /***************************************************************** name : Stepmotor_Run function : API interface function parameter: rundir :步进电机转动方向 runrev :步进电机转速 ******************************************************************/ void Stepmotor_Run( uint8 rundir , uint16 runrev ) { stepmotor.dir = rundir ; stepmotor.rev = runrev ; stepmotor.count = 0 ; StepmotorInt_Init( stepmotor.rev ) ; } /**************************************************************** name : Stepmotor_RunDir function : 控制步进电机方向 *****************************************************************/ void Stepmotor_RunDir() { if(stepmotor.dir == ATICLOCK ) { if( stepmotor.count == 0 ) { IO2SET = DEASILRUN ; } else { IO2SET = ( ANTICLOCKRUN << (stepmotor.count-1) ) ; } IO2CLR = ( ANTICLOCKRUN << stepmotor.count ) ; } if(stepmotor.dir == DEASIL ) { if( stepmotor.count == 0 ) { IO2SET = ANTICLOCKRUN ; } else { IO2SET = ( DEASILRUN >> (stepmotor.count-1) ) ; } IO2CLR = ( DEASILRUN >> stepmotor.count ) ; } stepmotor.count ++ ; if( stepmotor.count == 4 ) { stepmotor.count = 0 ; } } /**************************************************************** name : Stepmotor_Int function :中断处理 *****************************************************************/ void __irq Stepmotor_Int() { Stepmotor_RunDir() ; T1IR = 0x08 ; //复位中断 VICVectAddr=0x00 ; } /////////////////////////////////////////////////////////////////////////////////// //文件名:stepmotor.h // ////////////////////////////////////////////////////////////////////////////////// #ifndef _stepmotor_h #define _stepmotor_h #include "config.h" //////////////////////////////////////////////////// //宏定义 ///////////////////////////////////////////////////// #define ANTICLOCKRUN 0x00080000 //逆时针运行值 #define DEASILRUN 0x00400000 //顺时针运行值 #define ATICLOCK 0 //逆时针转动标志 #define DEASIL 1 //顺时针转动标志 #define STEPMOTORREVBASE 1 //步进电机基准转速 ////////////////////////////////////////////////////// // API interface function // rundir :步进电机转动方向 ; runrev:转动速度 ////////////////////////////////////////////////////// void Stepmotor_Run( uint8 rundir , uint16 runrev ) ; void StepmotorPort_Init(void) ; #endif
关闭
站长推荐
/3
用户461316 2008-10-15 15:59
Cybershu 2008-6-25 17:47
用户1359843 2008-6-17 09:35