电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » XY轴光驱激光绘图机——软件移植

共2条 1/1 1 跳转至

XY轴光驱激光绘图机——软件移植

助工
2019-01-12 23:10:47    评分

不得不说STM32的软件开发环境真是太丰富了,从当前官方主推的STM32CubxMX代码配置工具就可窥得一斑(见下图)。

IDE.jpg

丰富带来的好处是显而易见的,在做开发时让你有了更多的选择,不过对于萌新来说,就会有种选择困难、无从下手的感觉。因为这其中的项目除了IDE环境不同外,还夹杂着函数库版本不同带来的一些差异,如:STD库、HAL库。种种情况组合起来,简直让人眼花缭乱了。

再来说说将要用到的Grbl,它是面向Arduino/AVR328芯片开发的一款开源嵌入式G代码编译和运动控制软件。因Grbl性能高,成本低,常被用于制作小型CNC雕刻机、写字机的控制系统。近年来除了在原生的Arduino平台广泛应用外,Grbl同时也被大量移植到其它平台使用,如:51平台、STM32平台等。

考虑到此次小蝴蝶比赛的时间安排,笔者选择了https://github.com/IRNAS/grbl_stm32这个项目作为母本。从该项目的描述中可以看出,它是针对Nucleo-F411RET6做的移植,与笔者正要使用的Nucleo-F410RB非常接近,应该说移植起来非常方便了,可是事实却没有当初想象的那么简单,中间还是出现了不少波折


工程项目属性修改

该项目使用的是SW4STM32,这是一款基于eclipse免费的STM32开发环境,具体安装过程可以参考网上的文章。

首先,需要将项目属性里“Setting”-〉Target中Mcu/Board作相应修改(如下图)。

P1.jpg 

“Setting”-〉MCU GCC Compiler-〉Preprocessor中添加F410相关宏定义(如下图)

P2.jpg 


IO定义

因为Nucleo系列开发板采用了兼容Arduino的设计,所以在该项目的引脚定义上,延续Grbl在Arduino的相关引脚定义就可以了。

P4.jpg

#define DIRX	GPIOB,GPIO_Pin_4
#define DIRY	GPIOB,GPIO_Pin_10
#define DIRZ	GPIOA,GPIO_Pin_8

#define STPX	GPIOA,GPIO_Pin_10
#define STPY	GPIOB,GPIO_Pin_3 //
#define STPZ	GPIOB,GPIO_Pin_5

#define STPEN	GPIOA,GPIO_Pin_9

#define TESTP	GPIOB,GPIO_Pin_8

#define LIMX	GPIOC,GPIO_Pin_7
#define LIMY	GPIOB,GPIO_Pin_6
#define LIMZ	GPIOA,GPIO_Pin_7

#define PROBE	GPIOC,GPIO_Pin_0

#ifndef VARIABLE_SPINDLE
#define SPINDLE_EN		GPIOA,GPIO_Pin_6//GPIOC,GPIO_Pin_1
#define SPINDLE_DIR		GPIOA,GPIO_Pin_5//GPIOC,GPIO_Pin_1
#endif

#define FLOOD_COOLANT	GPIOB,GPIO_Pin_0
//#define MIST_COOLANT

#define RESET_PIN 		GPIOA,GPIO_Pin_0
#define FEED_HOLD_PIN	GPIOA,GPIO_Pin_1
#define CYCLE_START_PIN GPIOA,GPIO_Pin_4
//#define SAFETY_DOOR_PIN


Eeprom地址设定

由于最初Grbl程序是基于Arduino平台设计的,使用了ATmega328p内部的EEPROM,而ST的Nucleo系列是没有内置Eeprom的,不过由于Nucleo系列内置的Flash够大,所以在母板代码中EEPROM是用一部分Flash空间来模拟的。不过需要注意的是如果EEPROM的虚拟地址设置不合适的话,就可能会使程序代码被误刷,导致死机等异常现象。这次就碰到这个问题,并且困扰了我很久,一开始程序跑不通,断点跟踪发现Flash中代码居然被清除了,当时并没有注意到Flash模拟eeprom的功能,只觉得莫名其妙,怎么在线仿真都无法进行?一度怀疑问题是不是出在SW4STM32的仿真功能或者仿真工具Stlink上。

现在,移植到F410RB时做了如下处理,就可以避免以上问题了。

#include <avr/io.h>
#include <avr/interrupt.h>
#include "stm32f4xx.h"
#include <string.h>
 
char eeprom[4096];
 
#ifdef NUCLEO_F410RB
#define VIRTUAL_EEPROM_ADDRESS   0x8011000
#else
#define VIRTUAL_EEPROM_ADDRESS   0x8008000
#endif


定时器修改

F410内的定时器与F411略有差异,前者没有定时器3,所以需要将母本程序中用到的有关定时器3的部分,替换为对定时器5的操作。具体就是将Stepper.c里的void init_timer(void)相关部分改为TIM5。

void init_timer(void)
{
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
 
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
 
TIM_TimeBaseStructure.TIM_Period =25000-1; // 1KHz
TIM_TimeBaseStructure.TIM_Prescaler = 3;   // 100MHz/4
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);
 
TIM_SetCompare1(TIM5,(settings.pulse_microseconds)*TICKS_PER_MICROSECOND);
 
TIM_ARRPreloadConfig(TIM5,DISABLE);
 
TIM_ClearITPendingBit(TIM5, TIM_IT_Update);
timerrunning=0;
TIM_ITConfig(TIM5, TIM_IT_Update| TIM_IT_CC1, ENABLE);
 
TIM_Cmd(TIM5, ENABLE);
 
NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
 
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream7_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}

另外,由于前述的F411RE项目使用的标准库版本较早,针对F410RB一些文件也对照F4的标准库STM32F4xx_DSP_StdPeriph_Lib_V1.8.0做一些更新。

完成以上修改后,就可以成功编译基于F410RB开发板的Grbl固件了,下载目标文件至开发板中,即可成功连接GrblController、微雕大师等软件。

P5.jpg

VID_20180715_173705.gif

比较遗憾的是,绘图机在运动操控上还存在一些问题,暂时还不能实现图形和文字绘制。要不然就可以立即画一只小蝴蝶出来给大家看看了






关键词: 光驱     激光     绘图机     移植     F410RB     Nucle    

管理员
2019-01-14 10:56:26    评分
2楼

谢谢楼主分享


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]