目录
前言
本文中的是基于机器谱的机械零件与三维文件拼装而成的,详情可登录机器谱官网查看机器谱 (robotway.com)
https://www.robotway.com/
控制器使用的是STC89C52
一、机械爪的拼装:
1.获取相关的模组三维文件:
机器谱 (robotway.com)
https://www.robotway.com/h-col-122.html
2.查看模组三维文件:
我们可以使用追光几何来查看
二、具体步骤:
1.180°和270°舵机的使用:
2.按键控制代码:
#include <reg52.h>
#include <intrins.h>
sbit X_PWM = P3^5; //设定PWM输出的I/O端口
sbit Y_PWM = P3^4;
sbit Claw_PWM = P3^7;
sbit X_Up = P2^0;
sbit X_Down = P2^1;
sbit Y_Up = P2^2;
sbit Y_Down = P2^3;
sbit Claw_OPEN = P2^4;
sbit Claw_CLOSE = P2^5;
sbit led = P2^7;
unsigned char count = 0;
unsigned char timer1 ;
unsigned char ITR_Over = 0 ;
unsigned char Time_sign;
unsigned char X_move_num;
unsigned char Y_move_num;
unsigned char Claw_move_num;
#define X_sign 1;
#define Y_sign 2;
#define Claw_sign 3;
/*
对于180°舵机
占空比变化范围:t = 0.5ms——>t = 2.5ms
变化最小间隔:0.5ms
*/
/*
对于270°舵机
占空比变化范围:t = 0.5ms——>t = 2.5ms
变化最小间隔:0.1ms
*/
void delay(unsigned int timeout) //误差 0us
{
while(timeout--)
_nop_(); //if Keil,require use intrins.h
}
void Timer0_Init();
void Arm_Init();
void x_axis();
void Y_axis();
void Claw();
void main()
{
Timer0_Init();
Arm_Init();//机械臂归中
while(1)
{
x_axis();
Y_axis();
Claw();
}
}
/*定时器T0初始化*/
void Timer0_Init()
{
unsigned char I_time;
TMOD |= 0x02; //定时器T0设置8位重装载
I_time=92;
TH0 = 256-I_time; //定时常数 0.1ms 晶振为11.0592MHz
TL0 = 256-I_time;
ET0 = 1;
TR0 = 1;
EA=1;
}
/*T0中断初始化*/
void Time0_Init() interrupt 1
{
switch(Time_sign)//选择控制哪个电机转动
{
case 1 :
if(count <= timer1 && count > 0) //确定高电平时间
{
X_PWM = 1;
}
else
{
X_PWM = 0;
}
count++;
if(count >= 200) //T = 20ms清零
{
count = 0;
ITR_Over=1;
}
break;
case 2 :
if(count <= timer1 && count > 0) //5==0° 15==90°
{
Y_PWM = 1;
}
else
{
Y_PWM = 0;
}
count++;
if(count >= 200) //T = 20ms清零
{
count = 0;
ITR_Over=1;
}
break;
case 3 :
if(count <= timer1 && count > 0) //5==0° 15==90°
{
Claw_PWM = 1;
}
else
{
Claw_PWM = 0;
}
count++;
if(count >= 200) //T = 20ms清零
{
count = 0;
ITR_Over=1;
}
break;
}
}
void Arm_Init()
{
X_PWM=0;
Y_PWM=0;
Claw_PWM=0;
//x臂归中
Time_sign=X_sign;
X_move_num = 14;
timer1=X_move_num;
count=0;
while(!ITR_Over);
delay(1000);
ITR_Over=0;
//y臂归中
Time_sign=Y_sign;
Y_move_num = 14;
timer1=Y_move_num;
count=0;
while(!ITR_Over);
ITR_Over=0;
delay(1000);
//爪打开
Time_sign=Claw_sign;
Claw_move_num=10;
timer1=Claw_move_num;
count=0;
while(!ITR_Over);
ITR_Over=0;
delay(1000);
}
//x臂 21- 7
void x_axis()
{
if(!X_Up)
{
if(!X_Up)
{
Time_sign=X_sign;//改变标志位,详情请看定时器中断
X_move_num+=1;//高电平时间加0.1ms
if(X_move_num>=21)//限制移动最大幅度
X_move_num=21;
timer1 = X_move_num;//舵机恢复到0°的位置
count=0;//让定时器重新计数
}
while(!X_Up||!ITR_Over)led=0;
ITR_Over=0;
led=1;
delay(500);
}
/*其他函数同理*/
if(!X_Down)
{
if(!X_Down)
{
Time_sign=X_sign;
X_move_num -=1;
if(X_move_num<=7)
X_move_num=7;
timer1 = X_move_num;//舵机恢复到0°的位置
count=0;//让定时器重新计数
}
while(!X_Down||!ITR_Over)led=0;
ITR_Over=0;
led=1;
delay(500);
}
}
//y臂 5-17
void Y_axis()
{
if(!Y_Down)
{
if(!Y_Down)
{
Time_sign=Y_sign;
Y_move_num+=1;
if(Y_move_num>=17)
Y_move_num=17;
timer1 =Y_move_num;//舵机恢复到0°的位置
count=0;//让定时器重新计数
}
while(!Y_Down||!ITR_Over)led=0;
ITR_Over=0;
led=1;
delay(500);
}
if(!Y_Up)
{
if(!Y_Up)
{
Time_sign=Y_sign;
Y_move_num -=1;
if(Y_move_num<=5)
Y_move_num=5;
timer1 = Y_move_num;//舵机恢复到0°的位置
count=0;//让定时器重新计数
}
while(!Y_Up||!ITR_Over)led=0;
ITR_Over=0;
led=1;
delay(500);
}
}
//抓
void Claw()
{
if(!Claw_OPEN)
{
if(!Claw_OPEN)
{
Time_sign=Claw_sign;
timer1 =5;//舵机恢复到0°的位置
count=0;//让定时器重新计数
}
while(!Claw_OPEN||!ITR_Over)led=0;
ITR_Over=0;
led=1;
delay(700);
}
if(!Claw_CLOSE)
{
if(!Claw_CLOSE)
{
Time_sign=Claw_sign;
timer1 =10;//舵机恢复到0°的位置
count=0;//让定时器重新计数
}
while(!Claw_CLOSE||!ITR_Over)led=0;
ITR_Over=0;
led=1;
delay(700);
}
}总结:
如果什么疑问或者建议,可以在评论区留言。
版权声明:本文为weixin_63568691原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。