这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 活动中心» 板卡试用» 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  #include  #include "stm32f4xx.h" #include  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 跳转至

回复

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