📄 motor_dri.c
字号:
#pragma small
#include "reg66x.h"
#include "motor_dri.h"
#include "electromotion.h"
#define T2_CONSTANT_FOR_1MS (65536-2000) //定时1ms
//电机驱动器设定:400步一圈,单脉冲方式,半电流,输出电流选择最大。
unsigned int motor_degree[5] = {2048,1024,512,384,340}; //五级变速调控
bit timer0_end_flag = 1; //==1定时结束,可以走下一步
bit run_next_cycle = 0; //一个呼吸周期标志
unsigned int timer_cycle = 0; //一个呼吸周期中循环1ms的个数
//定时器初始化
void init_timer(void)
{
//T0用作步进电机步间隙时间
TMOD = 0x01; //方式1
TR0 = 0;
IEN0 = 0x82;
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;
}
//步进电机归零
void regress_stepmotor(void)
{
unsigned char i;
unsigned int temp;
temp = 65535 - motor_degree[1];
P1_4 = 0;
P1_5 = 1;
for(i = 0;i < 10;i++);
if(P1_5)
while(P1_5)
{
P1_1 = BACKWARD;
TH0 = temp / 256;
TL0 = temp % 256;
TR0 = 1;
timer0_end_flag = 0;
while(!timer0_end_flag);
}
else
while(!P1_5)
{
P1_1 = FORWARD;
TH0 = temp / 256;
TL0 = temp % 256;
TR0 = 1;
timer0_end_flag = 0;
while(!timer0_end_flag);
}
}
/************************步进电机驱动程序*****************/
/*********************************************************
函数名称:motor_driver()
功能描述:根据提供的速度.脉冲步数和方向,做出实时的处理.
被调用的函数列表:无
参数说明:
返 回 值:
注 释:
**********************************************************/
bit motor_driver(unsigned int motor_speed,unsigned int motor_pulse,bit motor_direct)
{
unsigned int i,temp;
P1_4 = 0;
P1_1 = motor_direct; //==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);
}
}
//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;
}
//T2中断服务函数,定时一个呼吸周期时间
void timer2_int(void) interrupt 7 using 2
{
TF2 = 0;
TR2 = 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 + -