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