Grbl代码分析 cpu-map.h

这篇博客详细解析了Grbl代码中针对Arduino Mega328p的CPU_MAP_ATMEGA328P,包括串口、步进电机、方向、使能、限位、控制系统端口的中断向量和掩码配置,以及主轴、冷却和探头的相关定义。

//Arduino Mega328p.

#ifdef CPU_MAP_ATMEGA328P // (Arduino Uno)

  //串口中断向量

  #define SERIAL_RX     USART_RX_vect

  #define SERIAL_UDRE   USART_UDRE_vect

  // 步进电机脉冲端口,所有步进端口必须在一个通道里.

  #define STEP_DDR        DDRD

  #define STEP_PORT       PORTD

  #define X_STEP_BIT      2  // Uno Digital Pin 2

  #define Y_STEP_BIT      3  // Uno Digital Pin 3

  #define Z_STEP_BIT      4  // Uno Digital Pin 4

  #define STEP_MASK       ((1<<X_STEP_BIT)|(1<<Y_STEP_BIT)|(1<<Z_STEP_BIT)) // 掩码

  //步进电机方向端口. 所有步进端口必须在一个通道里.

  #define DIRECTION_DDR     DDRD

  #define DIRECTION_PORT    PORTD

  #define X_DIRECTION_BIT   5  // Uno Digital Pin 5

  #define Y_DIRECTION_BIT   6  // Uno Digital Pin 6

  #define Z_DIRECTION_BIT   7  // Uno Digital Pin 7

  #define DIRECTION_MASK    ((1<<X_DIRECTION_BIT)|(1<<Y_DIRECTION_BIT)|(1<<Z_DIRECTION_BIT)) // 掩码

  // 步进电机使能端口(一个端口控制所有电机)

  #define STEPPERS_DISABLE_DDR    DDRB

  #define STEPPERS_DISABLE_PORT   PORTB

  #define STEPPERS_DISABLE_BIT    0  // Uno Digital Pin 8

  #define STEPPERS_DISABLE_MASK   (1<<STEPPERS_DISABLE_BIT)

  /*硬限位端口和中断向量,所有端口必须在一个通道,但和其他输入端口可不再一个通//道内.*/

  #define LIMIT_DDR        DDRB

  #define LIMIT_PIN        PINB

  #define LIMIT_PORT       PORTB

  #define X_LIMIT_BIT      1  // Uno Digital Pin 9

  #define Y_LIMIT_BIT      2  // Uno Digital Pin 10

  #ifdef VARIABLE_SPINDLE // 因为变主轴转速用到PWM,所以需要Z 轴限位放到Pin 12.

    #define Z_LIMIT_BIT    4 // Uno Digital Pin 12

  #else

    #define Z_LIMIT_BIT    3  // Uno Digital Pin 11

  #endif

  #if !defined(ENABLE_DUAL_AXIS

ain()主函数首先执行下面初始化函数 serial_init(); // Setup serial baud rate and interrupts settings_init(); // Load Grbl settings from EEPROM stepper_init(); // 配置步进方向和中断定时器 system_init(); // 配置引脚分配别针和pin-change中断 memset(&sys, 0, sizeof(system_t)); // Clear all system variables sys.abort = true; // Set abort to complete initialization 完成初始化设置中止 sei(); // Enable interrupts #ifdef HOMING_INIT_LOCK //宏运算(settings.flags & (1 << 4)) != 0结果flags等于执行sys.state = STATE_ALARM //系统状态赋值为报警状态 if (bit_istrue(settings.flags,BITFLAG_HOMING_ENABLE)) { sys.state = STATE_ALARM; } #endif _____________________________________________________________________________________________________________________________________ 接下来是一些主要初始化循环 for(;;) { serial_reset_read_buffer(); // Clear serial read buffer gc_init(); // Set g-code parser to default state spindle_init(); //主轴 coolant_init(); //冷却液 limits_init(); //极限开关 probe_init(); //探测 plan_reset(); // Clear block buffer and planner variables 清晰块缓冲区和规划师变量 st_reset(); // Clear stepper subsystem variables. 清晰的步进系统变量。 // Sync cleared gcode and planner positions to current system position. 同步清除gcode和策划师职位当前系统位置。 plan_sync_position(); gc_sync_position(); // Reset system variables. sys.abort = false; //系统中止标志 sys_rt_exec_state = 0; //系统执行标志状态变量状态位清零。 sys_rt_exec_alarm = 0; //系统执行警报标志变量清零。 sys.suspend = false; //系统暂停标志位,取消,和安全的门。 sys.soft_limit = false; //系统限制标志状态机复位。(布尔) protocol_main_loop(); //主协议循环 } // ___________________________________________________________________________
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值