机械臂控制C语言程序,51单片机的6自由度机械臂 16路舵机控制 源码

/***************************************************************************************************************

文 件 名:main.c

功能描述:

备    注: 16路舵机控制

****************************************************************************************************************/

#include "STC15Fxxxx.H"  //STC15系列单片机

#include

#include "UART.H"

#include "timer.h"

#include "util.h"

#include "ps2/ps2.h"

#include "flash/flash.h"//头文件

#include

#include

#include "LED/led.h"

#include

#include

#include "adc/adc.h"

extern uint8 flag_p;

extern bit flag_RecFul;

//extern uchar KEY[9];

uint16 pos[7][MOTOR_NUM]={ {1000,1500,1500,1500,1500,1500,1500,1500,1500},

{1000,1500,1500,1500,1500,1500,1500,1500,1500},

{1000,1500,1500,1500,1500,1500,1500,1500,1500},

{1000,500,500,500,500,500,500,500,500},

{1000,1500,1500,1500,1500,1500,1500,1500,1500},

{1000,500,500,500,500,500,500,500,500},

{1000,1500,1500,1500,1500,1500,1500,1500,1500}

};         //位置

uint16 pwm[MOTOR_NUM]=    {1500,1500,1500,1500,1500,1500,1500,1500,1500};

uint16 UartRec[MOTOR_NUM]={1500,1500,1500,1500,1500,1500,1500,1500,1500};

uint8 redata[257] = {0};    // 定义接收数据变量数组

uint8 line=0;                                        //缓存存入口与出口之间的距离,即当前缓存中有多少个没有执行的数据

uint8 point_now=0;                                //与point_aim一起标记缓存出口位置,即取数位置

uint8 point_aim=1;

uint8 point_in=2;                                //标记缓存入口位置,即上一行数据存放位置

bit flag_connect = 0;

bit flag_stop=1;                                //表示一行执行结束

uint8 flag_vpwm=0;                                //表示到达了该更新pwm[]的时间

bit flag_in=1;                                         //表示缓存中有空闲空间

bit flag_out=0;                                        //表示缓存中有可执行数据的标志位

bit flag_run_ready=0;                        //表示有要要放入缓存的EErom数据

uint16 n=1000;                                        //用来计算需要建立多少个中间数据

uint16 m=1;                                                //用来累计已经执行了多少中间数据

double dp;

double dp0[MOTOR_NUM] = {0};                                        //插补增量

bit flag_download = 0;//判断是否下载

bit flag_read = 0;// 读取flash内容,发送上位机

bit flag_connect_run = 0;//连接上位机的执行flash保存的命令

bit flag_stop_download = 0;//停止下载

bit flag_online_run = 0;

bit flag_uart2_rev = 0;

bit flag_uart2_rev_time_out = 0;

bit flag_ps2_rev = 0;

bit flag_read_adc = 0;

unsigned long send_mode = 0;//当前串口接收到命令状态存储

MotorData motor_data;//舵机总信息

MotorOneCmd motor_one_cmd;//单个命令

CurrentItem cur_item;

uint16 tuoji_count = 0;//脱机执行次数

bit flag_scan_ps2 = 0;

uint8 error = 0;

uchar file_list[MAX_SUPPORT_FILE_SAVE] = {0};

int file_list_count = 0;

int file_last_num = 0;

char ps2_buf[120] = {0};

char uart2_buf[50] = {0};

uint cur_count = 0;

uchar ad_value = 0;

uchar beep_mode = 1;

uchar key_bak;

uchar ps2_key;

uchar ps2_mode=0;

void updata_file_list()

{

uchar i = 0;

uchar j = 0;

file_last_num = -1;

ReadMoterInfor();

for (i = 0; i < motor_data.filecount; i++)

{

if (motor_data.file_flag[i] == 1)

{

file_list[j] = i;

j++;

file_last_num = i;

}

}

file_list_count = j;

}

void InitMotor()

{

ReadMoterInfor();//读取舵机控制信息

updata_file_list();

memset(&cur_item,0,sizeof(cur_item));

beep_mode = motor_data.beep_mode;

}

/***************************************************************************************************************

函 数 名:主函数

功能描述:入口函数 ,进行各种初始化配置

输入参数:无

返 回 值:无

备    注:

****************************************************************************************************************/

void main(void)

{

uint temp = 0;

P0M1=0x00;                                   //设置P0口为强推挽输出模式

P0M0=0xFF;

P1M1|=0x80;

P1M0|=0xc8;

P5M1|=0x00;

P5M0|=0x2d;

P4M0|=0x20;

P4M1|=0x00;

Timer_init();          //定时器初始化

Timer0(31);                  //定时任意值,启动定时器,进入定时器循环

#if MOTOR_NUM > 9

Timer1(30);

#endif

SpiFlashInit();//初始化flash

while((temp = SpiFlashReadID())!=W25Q64)LED_ALL_ON();//判断flash有没有接错

LED_ALL_OFF();

InitMotor();

UART1_Init();          //串口1初始化

UART2_Init();  //串口2初始化

#if PS_SUPPORT

Timer3_init();

#endif

InitADC(7);

BEEP_On_Or_OFF();

while(1)

{

if(flag_vpwm==1)

{

vpwm();                                        //更新pwm[]数组

flag_vpwm=0;

}

if( flag_RecFul==1)                   //串口接受完一条指令

{

DealRec();                                 //处理串口缓存中的数据

flag_RecFul=0;

}

GetOneMotorCMD();//获取一个命令

SendUartState();//发送状态信息

#if PS_SUPPORT

scan_ps2();

#endif

LED_State();

Check_Power();

cur_count++;

}

}

void Check_Power()

{

if ((cur_count % 800) == 0)

{

StartADC(7);

//cur_count=0;

}

if (flag_read_adc)

{

flag_read_adc = 0;

//UART_Put_Inf("adc:",ad_value);

if (ad_value > 46)//根据电压粗略估计

{

//UART_Put_Inf("adc:

  • 4
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值