📄 motor_dri.c
字号:
#pragma small
#include "reg66x.h"
#include "motor_dri.h"
#include "electromotion.h"
//电机驱动器设定:400步一圈,单脉冲方式,半电流,输出电流选择最大。
unsigned int motor_degree[5]={2048,1024,512,384,340}; //五级变速调控
bit motor_runing=0; //==1电机在转
bit timer0_end_flag=1; //==1定时结束,可以走下一步
bit run_next_cycle=0; //一个呼吸周期标志
unsigned int timer_cycle = 0; //一个呼吸周期中循环1ms的个数
/************************步进电机驱动程序*****************/
/*********************************************************
函数名称:motor_driver()
功能描述:根据提供的速度.脉冲步数和方向,做出实时的处理.
被调用的函数列表:无
参数说明:
返 回 值:
注 释:
**********************************************************/
bit motor_driver(unsigned int motor_speed,unsigned int motor_pulse,bit motor_direct)
{
unsigned int i,temp;
P1_1=motor_direct; //==1正转;
P1_4=0;
P1_5=1;
if(motor_pulse>200)
{
motor_pulse-=200;
temp=65535-motor_speed-30*100;
for(i=0;i<100;i++)
{
TH0=temp/256;
TL0=temp%256;
temp+=30;
TR0=1;
timer0_end_flag=0;
while(!timer0_end_flag);
}
temp=65535-motor_speed;
for(i=motor_pulse;i>0;i--)
{
TH0=temp/256;
TL0=temp%256;
TR0=1;
timer0_end_flag=0;
while(!timer0_end_flag);
}
temp=65535-motor_speed;
for(i=100;i>0;i--)
{
TH0=temp/256;
TL0=temp%256;
temp-=30;
TR0=1;
timer0_end_flag=0;
while(!timer0_end_flag);
}
motor_pulse=0;
return(1);
}
else
{
if(motor_speed<motor_degree[1])
{
temp=65535-motor_degree[1];
for(i=0;i<motor_pulse;i++)
{
TH0=temp/256;
TL0=temp%256;
TR0=1;
timer0_end_flag=0;
while(!timer0_end_flag);
}
}
else
{
temp=65535-motor_speed;
for(i=0;i<motor_pulse;i++)
{
TH0=temp/256;
TL0=temp%256;
TR0=1;
timer0_end_flag=0;
while(!timer0_end_flag);
}
}
motor_pulse=0;
return(1);
}
}
//定时器初始化
void init_timer(void)
{
//T0用作计数器计数流量计
TMOD = 0x05; //方式1
TR0 = 0;
IEN0 = 0x80;
TCON = 0;
//T1用作波特率发生器
TMOD |= 0x20; //方式2
TH1 = TL1 = 0xF3; //12M下2400
PCON = 0x00;
S0CON = 0x50;
TR1 = 1;
IEN0 |= 0x10;
//T2用作定时一个呼吸周期时间
TL2 = RCAP2L = T2_CONSTANT_FOR_1MS;
TH2 = RCAP2H = T2_CONSTANT_FOR_1MS / 0x100;
T2MOD = 0x00;
T2CON = 0x00; //自动装载
IEN1 = 0x01;
}
//T0中断服务函数,定时步进电机每步时间
void timer0_int(void) interrupt 1 using 1
{
unsigned char i;
TR0=0;
P1_0=1;
for (i=0; i<30; i++); //极限i=20
P1_0=0;
timer0_end_flag=1;
}
//T1中断服务函数,定时一个呼吸周期时间
void timer1_int(void) interrupt 3 using 2
{
TH1 = 0xF8;
TL1 = 0x30;
TR1 = 1;
timer_cycle++;
if(timer_cycle>time_respiration)
{
timer_cycle = 0;
run_next_cycle = 1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -