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

📄 控制步进电机项目程序.c

📁 控制步进电机项目程序:综合考虑工作模式、加速启动
💻 C
📖 第 1 页 / 共 2 页
字号:
#include<reg51.h>
#include<initial.h>
void speed_contorl(void);
void dec_speed (void);
void inc_speed (void);
void speed_to_timer(uint speed_data);
void out_driver_data (void);
uchar sweep_key(void);
void delay (uchar x1ms);
void led_data_out (uint disp_n);
/*************************************************
功能:主程序,初始化
**************************************************/
void main(void)
{
/*=====    定时器初始化============*/
    TMOD=0x11;//T0 16位定时器,T1 16位定时器
    ET0=0;//定时器开中断
    ET1=1;//
    TH1=0xff;//设置定时器1参数、
    TL1=0;
    TR1=1;//启动定时器1开始刷LED            
/*=====    中断初始化============*/
    EX0=1;//外部中断开
    PT0=1;//定时器优先于外部中断
    PT1=1;
    PX0=1;    
    IT0=1;//外部中断0下降延触发
    EA=1;
/*=====    标志位初始化============*/
    con_bit=0;
    dir_bit=0;
    mod_bit=1;
    stop_f=0;
    ch_speed_en=1;
    motor_run=0;
/*=====    输入输出口初始化============*/
    P1=0;
    P2=0;
/*=====    内部参数设定 ============*/    
    step_set=5;
    step_run=5;
    ch_speed_val=10;
    speed_set=900;
    theory_speed=0;    
    speed_contorl();
    while(1);    
}

/*********************************************
原型:void disp_output(void) interrupt 3
**********************************************/
void disp_output(void) interrupt 3
{
TR1=0;//关定时器1中断
TH1=0xff;
TL1=0;
if(!con_bit)//是连续运行模式
    if(motor_run&ET0)//正在运行
        led_data_out(theory_speed);
    else led_data_out(speed_set);//输出数是理论转速
else//是置步运行模式
    if(motor_run&ET0)//正在运行
        led_data_out(step_run);//输出数是 置步运行数
    else
        led_data_out(step_set);//输出数是 置步设置数
TR1=1;    //开定时器1中断                
}

/********************************************
原型:void led_data_out(disp_n)
功能:显示输出程序,将所给的数字输出给数码管                     
********************************************/
void led_data_out (uint disp_n)
{
    uchar temp1,temp2,temp3,temp4;
    bit u_zero;//用来判断上几位是否都是零的标志
    P2|=0x0f;
    if(disp_n>9999) disp_n=0;//超出显示范围,显示为0;
    //输出千位数字
    temp1=disp_n/1000;
    if(temp1)
    {
        u_zero=1;
        bs1=0;
        dataport=num_tab[temp1];
        delay(1);
        bs1=1;            
    }
    else u_zero=0;
    //输出百位
    temp2=(disp_n-temp1*1000)/100;
    if(temp2||u_zero)
    {
        u_zero=1;
        bs2=0;
        dataport=num_tab[temp2];
        delay(1);
        bs2=1;    
    }
    else u_zero=0;
    //输出十位
    temp3=(disp_n-(temp1*1000)-(temp2*100))/10;
    if(temp3||u_zero)
    {
        bs3=0;
        dataport=num_tab[temp3];
        delay(1);
        bs3=1;    
    }
    //输出个位
    temp4=disp_n-(temp1*1000)-(temp2*100)-(temp3*10);
    bs4=0;
    dataport=num_tab[temp4];
    delay(1);
    bs4=1;    
    
}





/*******************************************
原型:void motor_driver (void) interrupt 1 using 0
功能:驱动步进电机(定时中断)
*******************************************/
void motor_driver (void) interrupt 1
{
    /*
    //先读入各标志位状态
    dir_bit=0xa4;        //方向标志位;“0”正方向。“1”反方
向。
    mod_bit=0xa5;        //电机转动模式;“0”四相八拍,"1"四相
双四拍
    con_bit=0xa6;        //电机控制模式:“0”连续运转模式;
“1”设定步数模式
    */
    if(loop_temp==0)//循环圈数完成
    {
        if(con_bit)//是置步运行模式
        {
            if(step_run<1)//置步运行数小于1
            {
                ET0=0;//停止运行
                motor_run=0;
                theory_speed=0;    //理论转速为零
            }
            else //置步运行数大于等于1
            {

                ch_speed_en=1;//允许设置定时参数
                out_driver_data();//输出驱动数据
    
            }
        }
        else//是连续运行模式
            out_driver_data();//输出驱动数据
        loop_temp=loop_n;//循环圈数复位
        ch_speed_en=1;//允许设置定时参数
    }
    
    else //循环圈数没有完成
        {
            loop_temp--;//循环圈数减一
            motor_run=1;//继续循环
        }
    speed_contorl();//速度控制    
}

/*********************************************
原型:void speed_contorl(void);
功能:综合考虑工作模式、加速启动,减速停止曲线;以及
     置步数等因素,决定在该时刻,电机的驱动速度
*********************************************/
void speed_contorl(void)
{
if(ch_speed_en)    //定时参数可以修改
    {
        if(!con_bit)//连续运行模式
        {
            if(motor_run&ET0)//如果正在运行才需要加减速
            {
                if(stop_f)//减速停止转动
                    dec_speed();//减速停止转动
                else//是加速运行
                    inc_speed();//加速运行
            }
        }
        else//是置步运行模式
        {
            if(--step_run)//置步运行数减一
                      //如果置步运行数大于0
            {
                if(step_run <(ch_speed_val*4))//置步
运行数小于ch_speed_val*4
                    dec_speed();//进入减速停止
运行
                else
                    inc_speed();//进入加速运行
    
            }
            else//置步运行数等于0
            {    
                motor_run=0;//停止运转
                ET0=0;
                theory_speed=0;
                step_run=step_set;//置步运行数等于置
步数
            }    
            
        }
        ch_speed_en=0;//不用再修改速度参数了
    }
}                    

/***********************************************
原型:void dec_speed (void)
功能:减速直到停止转动
***********************************************/
void dec_speed (void)
{
    static uchar  level_val,level_use;
    uchar temp;
    if(con_bit||(theory_speed==speed_set))//刚进入减速(理论速度等于设定速
度)
    {
        //寻找一个合适的减速 速度档次
        if(con_bit)
            temp=2;//如果是置步模式只要有步数,就给它一个低
速走完
        else
            for(temp=9; temp>=0; temp--)
                {
                    if
(theory_speed>=speed_level[temp])
                    break;
                }
        level_val=temp;
        //理论速度等于该档次速度
        theory_speed=speed_level[level_val];
        
        if(!level_val)    //如果为零档
            {
            ET0=0;
            motor_run=0;//关掉输出
            stop_f=0;
            theory_speed=0;
            level_use=0;
            step_run=step_set;
            }
        else
        {    //转化理论速度
            speed_to_timer(theory_speed);
            level_use=0;//该档次使用次数为0
        }
                        
    }
    else    //已经进入过减速
    {
        if(level_use==ch_speed_val)//使用次数为ch_speed_val次
        {
            level_val--;//速度档次减一
            level_use=0;//该档次使用次数为0
        }
            //理论速度等于该档次速度
        theory_speed=speed_level[level_val];
        if(!level_val)//该档次速度为0
        {        motor_run=0;//停止运转
                ET0=0;
                stop_f=0;
                theory_speed=0;
        }
        else        //转化理论速度
        {
                speed_to_timer(theory_speed);
                level_use++;//使用次数加一
        }
    }    
}

/***********************************************
原型:void inc_speed (void)
功能:加速运行

⌨️ 快捷键说明

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