原创 ARM7驱动步进电机的程序

2008-10-14 09:17 3935 3 4 分类: MCU/ 嵌入式
///////////////////////////////////////////////////////////////////////////////////
//文件名: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
PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户461316 2008-10-15 15:59

顶起楼主的源代码!!

Cybershu 2008-6-25 17:47

en

用户1359843 2008-6-17 09:35

这种好贴要顶!期望多学多发多交流!
相关推荐阅读
用户115270 2008-10-20 20:52
ARM7控制液晶显示程序
//////////////////////////////////////////////////////////////////////////////////////  文件名 :LCDscre...
用户115270 2008-10-14 09:08
转载:C语言嵌入式系统编程修炼之道
C语言嵌入式系统编程修炼之道 C语言嵌入式系统编程修炼之道——背景篇... 1C语言嵌入式系统编程修炼之道——软件架构篇... 41.模块划分...42.多任务还是单任务...53.单任务程序典型架构...
用户115270 2008-05-04 10:23
大秦
凡我大秦大军铁骑能到达之处,皆必须予以征讨,毫不例外;凡大秦大军所到之处结为我大秦国土,其子民也皆为我大秦子民,也毫不例外。...
用户115270 2008-04-22 19:36
USB传输协议分析
USB传输协议分析关键字: 一 、数据格式【包】总体的格式如下: 同步序列【SYNC】包ID【PID】包特定信息CRC校验位包结束标志【EOP】                        信息包1...
用户115270 2007-12-22 17:35
RFID读卡程序
RFID读卡程序关键字 :125k 、读卡程序 、RFID一、 原理1、硬件原理1.1、硬件工作原理说明 阅读器:基站 ;应答器:非接触ID卡。我们使用的MCU是at89s52(CS—Ⅲ板)。基站在上...
EE直播间
更多
我要评论
1
3
关闭 站长推荐上一条 /3 下一条