📄 控制步进电机项目程序.c
字号:
#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 + -