1年前因为研究自动写字机,所以渐渐萌生出做一台cnc控制器的想法,因为原来自己也研究过自动化控制,所以对于步进电机的控制还算熟悉,但由于精力的原因没有整出一个完整的控制框架,今年正好疫情严重导致自己也没啥事,所以花点时间做了一整套的东西。
然后还要说明的是,标题虽然是是grbl的脱机控制器,但实际和grbl一点关系都没有,做个标题党,吸引下点击率,这套控制系统从头到尾都是自己一点一点码出来的,我暂时把他命名为Elixir,下面开始介绍下这套系统的软硬件构成。
/*
*********************************************************************************************************
*
* 模块名称 : 定义初始化常量
* 文件名称 : cncconf.h
* 版 本 : V3.4
* 说 明 : 头文件
* Copyright (C), 2016-2017, [email protected]
*
*********************************************************************************************************
*/
#ifndef _CNCCONF_H
#define _CNCCONF_H
/*******************************************************条件预编译*******************************************************/
/*******************************************************dubug时候使用*******************************************************/
//#define CNC_DEBUG /*使能printf显示*/
//#define CNC_DEBUG_GCODE /*使能显示gcode字符串*/
/*******************************************************使能轴*******************************************************/
#define CNC_XEN /*使能X轴*/
#define CNC_YEN /*使能Y轴*/
#define CNC_ZEN /*使能Z轴*/
//#define CNC_AEN /*使能A轴*/
/*******************************************************选择适配的单片机*******************************************************/
//#define CNC_STM32F0 /*stm32f1系列,在用户接口程序中条件编译*/
//#define CNC_STM32F1 /*stm32f1系列,在用户接口程序中条件编译*/
#define CNC_STM32F4 /*stm32f4系列*/
/*******************************************************选择适配按键(mcgs虚拟键和实体键)*******************************************************/
#define CNC_ENTITY_KEY /*实体按键*/
//#define CNC_MCGS_KEY /*modbus触摸屏mcgs*/
/*******************************************************使能需要的功能******************************************************/
#define CNC_USER /*按键显示之类接口*/
#define CNC_TIM /*定时器功能*/
//#define CNC_PVD /*使能掉电保存功能*/
//#define CNC_EHDW /*使能手脉功能*/
#define CNC_GCODE /*使能G代码解析功能*/
#define CNC_HALL /*使能霍尔功能*/
#define CNC_USART /*使能串口*/
#define CNC_OS /*在多任务内核中使用*/
#ifdef CNC_GCODE
#define CNC_GCODE_ZIP
#define CNC_GCODE_UNZIP
#endif
/****************************************************设定方向的极性**********************************************************/
//#define CNC_XDIR /*X轴方向极性,申明:高电平+低电平- 不申明:高电平-低电平+ */
#define CNC_YDIR /*Y轴方向极性,申明:高电平+低电平- 不申明:高电平-低电平+*/
#define CNC_ZDIR /*Z轴方向极性,申明:高电平+低电平- 不申明:高电平-低电平+*/
#define CNC_ADIR /*A轴方向极性,申明:高电平+低电平- 不申明:高电平-低电平+*/
#define CNC_XP(PN) if(PN==0){CNC_XDIRL;}else{CNC_XDIRH;}
#define CNC_XN(PN) if(PN==0){CNC_XDIRH;}else{CNC_XDIRL;}
#define CNC_YP(PN) if(PN==0){CNC_YDIRL;}else{CNC_YDIRH;}
#define CNC_YN(PN) if(PN==0){CNC_YDIRH;}else{CNC_YDIRL;}
#define CNC_ZP(PN) if(PN==0){CNC_ZDIRL;}else{CNC_ZDIRH;}
#define CNC_ZN(PN) if(PN==0){CNC_ZDIRH;}else{CNC_ZDIRL;}
#define CNC_AP(PN) if(PN==0){CNC_ADIRL;}else{CNC_ADIRH;}
#define CNC_AN(PN) if(PN==0){CNC_ADIRH;}else{CNC_ADIRL;}
#ifdef CNC_XDIR
#define CNC_MOVE_XL 9999999 /*显示最大坐标值*/
#define CNC_MOVE_XR -9999999 /*显示最小坐标值*/
#define CNC_MOVE_XRO -10000 /*测纸边移出距离*/
//#define CNC_XP CNC_XDIRL
//#define CNC_XN CNC_XDIRH
#else
#define CNC_MOVE_XL -9999999 /*显示最大坐标值*/
#define CNC_MOVE_XR 9999999 /*显示最小坐标值*/
#define CNC_MOVE_XRO 10000 /*测纸边移出距离*/
//#define CNC_XP CNC_XDIRH
//#define CNC_XN CNC_XDIRL
#endif
#ifdef CNC_YDIR
#define CNC_MOVE_YD 9999999 /*显示最大坐标值*/
#define CNC_MOVE_YU -9999999 /*显示最小坐标值*/
#define CNC_MOVE_YRO 100000 /*测纸边移出距离*/
//#define CNC_YP CNC_YDIRH
//#define CNC_YN CNC_YDIRL
#else
#define CNC_MOVE_YU -9999999 /*显示最大坐标值*/
#define CNC_MOVE_YD 9999999 /*显示最小坐标值*/
#define CNC_MOVE_YRO -100000 /*测纸边移出距离*/
//#define CNC_YN CNC_YDIRH
//#define CNC_YP CNC_YDIRL
#endif
#ifdef CNC_ZDIR
//#define CNC_ZP CNC_ZDIRH
//#define CNC_ZN CNC_ZDIRL
#else
//#define CNC_ZN CNC_ZDIRH
//#define CNC_ZP CNC_ZDIRL
#endif
#ifdef CNC_ADIR
//#define CNC_AP CNC_ADIRH
//#define CNC_AN CNC_ADIRL
#else
//#define CNC_AN CNC_ADIRH
//#define CNC_AP CNC_ADIRL
#endif
/****************************************************是否使用flash存储**********************************************************/
//#define CNC_GCODE_FLASH /*申明:使用flash储存,U盘可以拔取 不申明:不储存U盘文件,在线读一块刻一块*/
/****************************************************使用小线段连续功能时的fifo缓存大小**********************************************************/
#define CNC_FIFO_NUMBER 30/*结构体数组大小*/
/****************************************************使用串口是收发缓存大小*********************************************************/
#define CNC_TX_SIZE 1024/*数组大小*/
#define CNC_RX_SIZE 1024/*数组大小*/
/*****************************************************CNC库的一些常量的设定*****************************************************/
/*****************************************************设定坐标值范围*****************************************************/
#define CNC_MAX_XGS 9999999 /*显示最大坐标值*/
#define CNC_MIN_XGS -9999999 /*显示最小坐标值*/
#define CNC_MAX_YGS 9999999 /*显示最大坐标值*/
#define CNC_MIN_YGS -9999999 /*显示最小坐标值*/
#define CNC_MAX_ZGS 9999999 /*显示最大坐标值*/
#define CNC_MIN_ZGS -9999999 /*显示最小坐标值*/
#define CNC_MAX_AGS 9999999 /*显示最大坐标值*/
#define CNC_MIN_AGS -9999999 /*显示最小坐标值*/
/*****************************************************设定速度范围*****************************************************/
#define CNC_MAX_V 100000 /*200.000 KHZ 单位hz,F0设定到60K,F1设定到100K,F407设定到400K*/
#define CNC_MIN_V 1 /*000.001 KHZ =1HZ */
#define CNC_MAX_XV 9999 /*X轴最高速,单位r/min*/
#define CNC_MIN_XV 1 /*X轴最低速*/
#define CNC_MAX_YV 9999 /*Y轴最高速*/
#define CNC_MIN_YV 1 /*Y轴最低速*/
#define CNC_MAX_ZV 9999 /*Z轴最高速*/
#define CNC_MIN_ZV 1 /*Z轴最低速*/
#define CNC_MAX_AV 9999 /*A轴最高速*/
#define CNC_MIN_AV 1 /*A轴最低速*/
/*****************************************************设定爬频表格大小*****************************************************/
#define CNC_MAX_LADDER 2048 /*表格最大值,小容量的一般1K,1024*2 =2K*/
/*****************************************************设定定时是位数*****************************************************/
#define CNC_TIME_REG 16 /*定时为16位时或者spped_table是16位 参数选择 16 / 32*/
/*****************************************************设定是否用电子齿轮转换速度*****************************************************/
#define CNC_F2V 0 /*mm/min速度转脉冲频率,1代表使用此规则,0代表不使用,F*10=hz*/
/*****************************************************设定百分比变化范围和变化大小*****************************************************/
#define CNC_VTCHANGE 5 /*速度变化量*/
#define CNC_VTCHANGE_MAX 50 /*速度变化最大值,最大值50*/
#define CNC_VTCHANGE_MIN -50 /*速度变化最小值,最小值-50*/
/*****************************************************设定插补圆弧时候,分割的段数*****************************************************/
#define CNC_ARC_N 300 /*圆弧的分割点,把圆弧分段,此数值越小,圆弧越精细,速度越慢,注意最小值应该是最小圆弧半径的3倍*/
/*****************************************************设定单片机定时器相关参数*****************************************************/
/*
*stm32f1 72M主频 CNC_TIM_CLK 72 CNC_TIM_PSC 71
*stm32f4 168M主频 CNC_TIM_CLK 84 CNC_TIM_PSC 83
*/
#ifdef CNC_STM32F4
#define CNC_TIM_CLK 84 /*定时器时钟,单位Mhz */
#define CNC_TIM_PSC 83 /*定时器预分频*/
#endif
#ifdef CNC_STM32F1
#define CNC_TIM_CLK 72 /*定时器时钟,单位Mhz */
#define CNC_TIM_PSC 71 /*定时器预分频*/
#endif
#ifdef CNC_STM32F0
#define CNC_TIM_CLK 48 /*定时器时钟,单位Mhz */
#define CNC_TIM_PSC 47 /*定时器预分频*/
#endif
#define CNC_TIM_CNT (1000000 * CNC_TIM_CLK / (CNC_TIM_PSC)) /*定时器的值*/
#define CNC_EHDW_COUNT 0xffffffff /*手脉脉冲总数*/
#define CNC_EHDW_4COUNT (CNC_EHDW_COUNT >> 2) /*手脉1/4脉冲数*/
/*****************************************************设定解析Gcode时候相关buff大小*****************************************************/
/*
解析nc文件相关
文件存放格式:
划分存放闪存大小 1M CNC_ZIP_BLOKN 256×4K=1024K
一次写入数据量 4K CNC_ZIP_BLOCK
每个块中可以存放的行数 128 CNC_ZIP_ROWN
*/
#define CNC_NCFILE_BLOCK 1024 /*每次分块读取nc文件字符串大小*/
#define CNC_ZIP_BLOCKN 256 /*最大容量1M 256×4K=1024K*/
#define CNC_ZIP_BLOCK 4096 /*压缩后每次向flash中写入的数据量,扇区大小*/
#define CNC_ZIP_ROWN 128 /*一行G代码转成8个32位数据 CNC_ZIP_BUFF为4K 一次可以完成压缩128行 8*4*128=4096*/
#define CNC_ZIP_ROW_ALL (CNC_ZIP_ROWN * CNC_ZIP_BLOCKN) /*最大行数*/
#endif