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

📄 main.c

📁 步进电机驱动主函数
💻 C
字号:
//****************************************************************************
//文件名:main.c
//描述: 步进电机驱动主函数,使用C8051F330。
//版本:1.0 2005-11-11
//****************************************************************************

//头文件引用区
#include "c8051f330.h"

//#define   SPEEACC   10                    // 步进电机加减速系数
                                            // 如果想要加减速系数可调,改成 unsigned int iSpeedAcc 
//#define   SPEEDMAX  16000                 // 步进电机最高转速 = 2*8*200*最高转速
                                            // 如果想要最高转速可调,改成 unsigned int iSpeedMax 
#define   SPEEDMIN  80                      // 步进电机启动转速 = 2*8*200*启动转速  
                                            // 如果想要启动转速可调,改成 unsigned int iSpeedMin 
#define   SYSCLK    22118400                // 晶体频率
#define   MAXSTEP   1000000                 // 最大运行步数

//函数声明区

extern void Init_Device(void);              // 初始化函数

//全局变量定义区 

sbit nZero = P1^0;                          // 步进电机驱动器零点标志
sbit nOver = P1^1;                          // 步进电机驱动器溢出标志
sbit nRST  = P1^4;                          // 步进电机驱动器芯片复位控制
sbit nEN   = P1^5;                          // 步进电机驱动器工作允许
sbit DIR   = P1^6;                          // 步进电机驱动器运行方向
sbit LOCK  = P1^7;                          // 步进电机驱动器待机锁定控制

sbit STEP = P0^6;                           // 步进电机驱动器步进脉冲
sbit SEL  = P0^7;                           // 读入地址控制

bit bComm;                                  // 接收到一包正确的命令标志
bit bRun;                                   // 电机运行状态,1 = 运行;0 = 停止
unsigned char Addres;                       // 本机地址
unsigned long lSpeed;                       // 电机当前速度
unsigned long lPedometer;                   // 电机当前剩余运行步数
unsigned long lStepPal;                     // 电机当前坐标步数
unsigned long lEncodPal;                    // 编码器当前坐标步数
unsigned long lMeteDat;                     // 测量结果
unsigned int  iSpeedMax = 16000;            // 步进电机最高转速 = 2*8*200*最高转速
unsigned int  iSpeedAcc = 10;               // 步进电机加减速系数
unsigned int  iSpeedwn;                     // 完成减速需要的脉冲个数
//unsigned int  iSpeedwn = iSpeedMax/iSpeedAcc;// 完成减速需要的脉冲个数

bdata unsigned char MotoState;
sbit bStZoro = MotoState^0;                 // 零点状态标志
sbit bStDir  = MotoState^1;                 // 方向状态标志
sbit bStRun  = MotoState^2;                 // 运行状态标志
sbit bStEn   = MotoState^3;                 // 加电状态标志
sbit bStLock = MotoState^4;                 // 保持状态标志
sbit bStOver = MotoState^5;                 // 超界状态标志
sbit bStMete = MotoState^6;                 // 测量状态标志
sbit bStBak  = MotoState^7;                 //     状态标志
//****************************************************************************
// 步进电机减速控制函数
// 用于控制步进电机的减速
//****************************************************************************
void SpeedDown(void)
  {
    if(lSpeed > SPEEDMIN)lSpeed -= iSpeedAcc;
  }
//****************************************************************************
// 步进电机加速控制函数
// 用于控制步进电机的加速
//****************************************************************************
void SpeedUp(void)
  {
    lSpeed += iSpeedAcc;
  }
//****************************************************************************
// 步进电机停机控制函数
// 用于控制步进电机的停机
//****************************************************************************
void ShutDown(void)
  {
    TMR2CN = 0;                             // 关闭定时器2 
    bRun = 0;                               // 清除运行标志
    lPedometer = 0;                         // 清除步进电机剩余运行步数
    LOCK = 1;                               // 进入电机锁定状态
  }
//****************************************************************************
// 步进电机运行控制函数
// 用于控制步进电机的驱动及加减速
//****************************************************************************
void  TurnMoto(unsigned long lStep,bit bDir)
  {
    nEN  = 0;                               // 步进电机加电
    LOCK = 0;                               // 进入电机工作状态
    bRun = 1;                               // 置运行标志
    TMR2RLH = 0xa0;                         // 设置计数器
    lPedometer = lStep;                     // 设置步进数
    DIR = bDir;                             // 设置运动方向
    TMR2CN = 0x04;                          // 启动定时器
  }
//****************************************************************************
// T2中断函数
// 用于产生步进电机驱动时钟
// 两个中断完成一个步进脉冲
//****************************************************************************
void t2_ISR() interrupt 5
  {
    unsigned long f;
    unsigned t;
    TF2H=0;                                      // 清除中断标志
    f = SYSCLK/12/lSpeed;                        // 计算脉冲频率
    t = f;
    t = 0x10000 - t;
    TMR2RLH = t>>8;                              // 设置计数器
    TMR2RLL = t;
    lPedometer--;                                // 当前剩余运行步数-1
    STEP = !STEP;                                // 置步进脉冲
    if(DIR)lStepPal++;                           // 记录步进电机当前坐标
    else lStepPal--;
    if(lPedometer < iSpeedwn) SpeedDown();       // 如果(剩余脉冲数)小于(完成减速需要的脉冲个数)转减速处理
    else if(lSpeed < iSpeedMax) SpeedUp() ;      // 如果未达到最高速度转加速处理
  }
//****************************************************************************
// T0中断函数
// 用于产生系统时钟
// 时钟 = (22.1184E6/12)/2/(TH0*256+TL0)
//****************************************************************************
unsigned int iTime0;                             // 软件定时器0,用于接收中断判断包头
unsigned int iTime1;                             // 软件定时器1
unsigned int iTime2;                             // 软件定时器2
unsigned int iTime3;                             // 软件定时器3,用于接收与回应之间的时间控制
void t0_ISR() interrupt 1                        // 1mS的时间基准
  {
    TF0=0;
    if(iTime0)
      {
        iTime0--;
      }
    if(iTime1)
      {
        iTime1--;
      }
    if(iTime2)
      {
        iTime2--;
      }
    if(iTime3)
      {
        iTime3--;
      }
    bStZoro = nZero;                        // 处理状态标志
    bStEn   = nEN;
    bStLock = LOCK;
  }
//****************************************************************************
// 读本机地址函数
// 返回本机地址
//****************************************************************************
unsigned char ReadAdd(void)
  {
    unsigned char i,q;
    P1 = 0xFF;
    SEL = 1;
    for(i=0;i<200;i++);
    q = P1;
    q ^= 0xFF;
    q >>= 4;
    SEL = 0;
    return(q);
  }
//****************************************************************************
// 串口中断函数
// 用于接收串口数据
// 波特率
//****************************************************************************
unsigned char BufRev[16],BufTev[16];
unsigned char NBufRev,NBufTev;
unsigned char CntRev,CntTev,Crc;
void uart0_ISR() interrupt 4                // 发送接收
  {
    if(RI0)
      {
        if(iTime0==0) NBufRev = 0;
        iTime0=30;
        RI0= 0;
        BufRev[NBufRev] = SBUF0;
        if(NBufRev==0) NBufRev++;
        else if(NBufRev==1)
          {
            if(BufRev[NBufRev]==0xe7)
              {
                NBufRev++;
                Crc = 0;
              }
            else  NBufRev = 0;
          }
        else if(NBufRev > 1)
          {
            Crc += BufRev[NBufRev];
            NBufRev++;
          }
        else if(NBufRev == 8)
          {
            if(Crc == BufRev[NBufRev]) bComm = 1;
            bComm = 1;
            NBufRev = 0;
          }
        else NBufRev = 0;
        iTime3 = 25;
      }
    if(TI0)
      {
        TI0 = 0;
        if(CntTev)
          {
            SBUF0 = BufTev[NBufTev];
            CntTev--;
          }
      }
  }

//****************************************************************************
// 步进电机回零处理函数
// 用于步进电机发生的回零处理
//****************************************************************************
void StepZero(void)
  {
    EA = 0;
    lStepPal  = 0;                     // 电机当前坐标步数清零
    lEncodPal = 0;                     // 电机当前坐标步数清零
    if(!DIR) ShutDown();               // 如果电机反转则停机
    EA = 1;
  }
//****************************************************************************
// 步进电机解锁命令函数
// 用于步进电机的解锁
//****************************************************************************
void StepUnlock(void)
  {
    nEN  = 1;
    LOCK = 1;
  }
//****************************************************************************
// 步进电机测量函数
// 用于步进电机的位置测量
// 返回从当前位置回到零点的运行步数
//****************************************************************************
unsigned long StepMeterage(void)
  {
    unsigned long lq0;
    nEN  = 0;
    LOCK = 0;
    while(bRun) if(nZero)
      {
        EA = 0;
        lq0 = MAXSTEP - lStepPal;
        lEncodPal = 0;                      // 电机当前坐标步数清零
        if(!DIR) ShutDown();                // 如果电机反转则停机
        EA = 1;
      }
    LOCK = 1;
    return(lq0);
  }
//****************************************************************************
// 步进电机参数设置函数
// 用于步进电机的最高速度及加减速系数设置
//****************************************************************************
void SetUpDown()
  {
    unsigned int iq0;
    iq0 = BufRev[4];
    iq0 <<= 8;
    iq0 += BufRev[5];
    iSpeedwn = iSpeedMax/iSpeedAcc;
  }
//****************************************************************************
// 给430提供:回零、当前坐标、限位保护状态  
// 接受430的命令有:到给定的坐标、回零、解锁、测量、加减速设置  
//****************************************************************************
void main(void)
  {
    unsigned char i;
    Init_Device();
    
    P0 = 0xFF;
    P1 = 0xFF;
    iSpeedwn = iSpeedMax/iSpeedAcc;
    Addres = ReadAdd();
    nRST = 0;
    for(i=0;i<200;i++);
    SEL  = 0;
    DIR  = 0;
    nRST = 1;
    nEN  = 0;
    LOCK = 1;
    while(1)
      {
	  	TurnMoto(100000, 1);
		while(bRun);
		TurnMoto(100000, 0);
		while(bRun);
		continue;
        if(bRun)
          {
            if(nZero) StepZero();
          }
        else if((bStBak)&&(iTime3==0))
          {
            bStBak = 0;
          }
      }
  }



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -