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

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

📁 控制步进电机项目程序:综合考虑工作模式、加速启动
💻 C
📖 第 1 页 / 共 2 页
字号:
***********************************************/
void inc_speed (void)
{
    static    uchar level_val,level_use;
    if(!theory_speed)//理论速度为零
    {
        level_val=1;//速度档次为1
        level_use=0;//该档次使用次数为0        
    }
    if(level_val<=9)
    {
        level_use++;
        if(level_use==ch_speed_val)//该档次使用次数为ch_speed_val
        {
        level_val++;//速度档次加一
        level_use=0;//该档次使用次数为0
        }
        if(speed_set > speed_level[level_val])    
        {
        theory_speed=speed_level[level_val];//理论速度等于该档次速
        speed_to_timer(theory_speed);//转化理论速度
        }
        else
        {
        theory_speed = speed_set;//按实际大小输出
        speed_to_timer(theory_speed);
        }    
    }
    else //level_val大于9
    {
        theory_speed = speed_set;//按实际大小输出
        speed_to_timer(theory_speed);
    }
    
}
                        
/*********************************************
原型:void speed_to_timer(uint speed_data);
功能:根据输入的速度,设置定时器参数
*********************************************/
void speed_to_timer(uint speed_data)
{
    float delay_time,t0_time,fri_n;
    uchar step;            
    if(mod_bit) step=4;//判断是四拍还是八拍
    else step=8;       //按拍数设置变量以备运算
    fri_n=60/(float)speed_data;//将输入的转速转化为频率
                    /*!如果speed_set是int,那
么即使fir_n定义为float
                     得到的结果还是整型,没有小数部分
~!所以只能强制把
                          speed_set转化成float.
                   所谓的数据类型隐式转换在这得不到体
现!不解?*/
    delay_time=fri_n/step;//由频率和拍数得到定时总的延时
    loop_n=delay_time/0.064;//t0最多能延时65。5ms这里取54
                //得到大概的循环次数loop_n
    loop_temp=loop_n;
    t0_time=delay_time/(loop_n+1);//得到每次定时器的精确定时时间
    t0_time*=1000;
    
    TH0=(65536-t0_time*1000)/256;//由每次定时时间设置TH0,TL0
    TL0=(char)(65536-t0_time*1000)%256;
    
    ch_speed_en=0;    //在设定的功能没完成之前,不再进入该子程
    motor_run=1;//开定时器
}

/*********************************************
原型:motor_driver()
功能:输出驱动数据
**********************************************/
void out_driver_data (void)
{
    if (mod_bit==0)            //四相八拍
    {
        if (dir_bit)    //反方向旋转
        {    
            //反方向八拍输出
            P1=state_tab1[motor_site];
            if (motor_site==0)
                motor_site=7;
            else    motor_site--;        
            
        }
        else        //正方向旋转
        {
            //正方向八拍输出
            P1=state_tab1[motor_site];
            if(motor_site==7)
                motor_site=0;
            else    motor_site++;    
        }    
    }
    else                 //四相四拍
    {
        if (dir_bit)    //反方向旋转
        {
            //反方向四拍输出
            P1=state_tab2[motor_site];
            if (motor_site==0)
                motor_site=3;
            else    motor_site--;        
            
        }
        else        //正方向旋转
        {
            //正方向四拍输出
            P1=state_tab2[motor_site];
            if(motor_site==3)
                motor_site=0;
            else    motor_site++;    
        }        
    }
}


/********************************************
原型:void input_keypad(void) interrupt 0
功能:键值处理子程序 外部中断0
********************************************/

void input_keypad(void) interrupt 0
{
    uchar input_key1,input_key2;
    
    input_key1=sweep_key();//键盘扫描
    if(input_key1)//有键输入
    {    
        delay(5);//延时
        input_key2=sweep_key();//键盘扫描
        if(input_key1==input_key2)//有键输入并且和第一次一样
        {        //键值处理
            if(!con_bit)    //连续运行模式
            {        
                if(input_key2==0x04)//输入键是开始按
                {        
                    if(motor_run&ET0)//正在运
                    {
                        stop_f=1;//减速
停止运转。
                    }
                    else
                    {        
                        motor_run=1;//开
始运转
                        ET0=1;
                    
    theory_speed=0;//刚开始都是0的
                        ch_speed_en=1;//
允许修改定时参数
                    }
                }
                else if(input_key2==0x02)//输入是加一
按钮
                {    
                    if(speed_set<=1990)//设定
速度不大于1990r/min
                    {    
                        speed_set+=10;//
设定速度加十        
                        ch_speed_en=1;//
允许修改定时参数                        
                    }        
                
                }
                else if(input_key2==0x01)//输入是减一
按钮
                {
                    if(speed_set>=10)//设定速
度不小于10r/min
                    {    
                        speed_set-=10;//
设定速度加十
                        ch_speed_en=1;//
允许修改定时参数
                    }        
                
                }
            }            
            else    //置数运行模式
            {        
                if(input_key2==0x04)//输入键是开始按
                {
                    if(motor_run&ET0)    //正
在运行
                    {
                        motor_run=0;
    //停止运转
                        ET0=0;
                    
    step_run=step_set;//置步执行数等于置步数
                        theory_speed=0;
    //理论转速边为零
                    }
                
                    else
                    {
                        motor_run=1;
    //开始运转
                        ET0=1;
                        ch_speed_en=1;
    //允许修改定时参数
                    }
                }
                else if(!(motor_run&ET0))//不在运行才
能修改置步数
                {
                    if(input_key2==0x02)//if输
入键是加一按钮
                    {        
                        if
(step_set<9999)//置步数小于9998
                        {
                            if
(step_set<10)
                            
    step_set++;//置步数加一
                            else
    step_set+=10;
                        
    step_run=step_set;//置步执行数等于置步数            
                        }    
                    }
                    else if
(input_key2==0x01)//输入键是减一键
                    {        
                        if(step_set>1)//
置步数大于1
                        {
                            if
(step_set<=10)
                            
    step_set--;//置步数减一
                            else 
    step_set-=10;
                        
    step_run=step_set;//置步执行数等于置步数
                        }    
                    }
                    
                }
            }
        }
    }
}

/********************************************
原型:uchar sweep_key(void)
功能:扫描按键,返回键值
********************************************/
uchar sweep_key(void)
{
    uchar sweep_key;
    /*
    //先读入各标志位状态
    dir_bit=0xa4;        //方向标志位;“0”正方向。“1”反方向。
    mod_bit=0xa5;        //电机转动模式;“0”四相八拍,"1"四相双四拍
    con_bit=0xa6;        //电机控制模式:“0”连续运转模式;“1”设定步?
    */
    sweep_key=P1&0xf0;
    sweep_key>>=4;
    return (sweep_key);    
}

/********************************************
原型:void delay (uchar x1ms)
功能:延时子程序
********************************************/
void delay (uchar x1ms)
{
    uchar i;
    for(; x1ms>0; x1ms--)
    { 
        for(i=255; i>0; i--);
    }
}

⌨️ 快捷键说明

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