grbl脱机 stm32控制器

1年前因为研究自动写字机,所以渐渐萌生出做一台cnc控制器的想法,因为原来自己也研究过自动化控制,所以对于步进电机的控制还算熟悉,但由于精力的原因没有整出一个完整的控制框架,今年正好疫情严重导致自己也没啥事,所以花点时间做了一整套的东西。

然后还要说明的是,标题虽然是是grbl的脱机控制器,但实际和grbl一点关系都没有,做个标题党,吸引下点击率,这套控制系统从头到尾都是自己一点一点码出来的,我暂时把他命名为Elixir,下面开始介绍下这套系统的软硬件构成。

  1. MCU:由于预算的有限同时保证主板的小巧,我选择了stm32f412re这款芯片,100M的m4内核,最大的优势是64脚芯片中唯一带有fsmc接口的芯片。
  2. 通讯:我选择了一路USB主机和一路串口作为通讯接口,做串口是为了兼容grbl那么多的pc软件,做脱机U盘当然是为了自用的方便。
  3. 界面:采用了2.8寸的液晶,由于液晶太小感觉触摸用的不是太灵活所以干脆用了实体按键。
  4. 软件:第一个版本裸机跑的,最大的问题就是刷屏跟不上。所以新的版本果断上了rtx,keil自家的号称0中断延时的内核
  5. gui:也是用了keil版本的emwin,勾选组件的方式用起来不比CubeMX效果差
    下面开始上图了纪念几个月的奋斗


win7 离线搭建ESP32 开发环境 esp32 grbl脱机_#define

/*
*********************************************************************************************************
*
*	模块名称 : 定义初始化常量
*	文件名称 : cncconf.h
*	版    本 : V3.4
*	说    明 : 头文件 
*	Copyright (C), 2016-2017, lcj1031@foxmail.com
*
*********************************************************************************************************
*/

#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