1.TinyG项目简介 https://github.com/synthetos/TinyG
TinyG项目是一个多轴运动控制系统,它面向数控加工中心和其它需要高精度运动控制的应用场景。TinyG是一个针对中小型功率电机控制的嵌入式解决方案。下面列出TinyG 第8版硬件的主要特点:
1) 采用Atmel ATxmega192嵌入式控制器;
2) 将4路基于TI DRV8818芯片的步进电机驱动器集成在4英寸的电路板上;
3) 步进电机驱动器相电流可达2.5A,可支持NEMA17系列电机和大部分NEMA23s系列电机;
4) 支持USB口接收G代码指令,板内解释执行;
5) 6个轴可映射至任意四个电机;
6) 采用恒定急动度(加加速度)的速度规划方式(3阶S速度曲线);
7) 采用单个周期内,相位优化的脉冲发生算法,输出脉冲平滑。在50kHz实现DDA算法时,输出信号频率抖动非常小;
8) 可达到1/8微步,采用优化后的DDA算可达到1/16 。
2.固件源代码分析
2.1 固件源代码主流程
TinyG固件基于C语言开发,采用简易的前后台系统:后台主循环设置在main函数结尾,各子功能以任务函数的形式依次出现主循环中,借助状态机控制主循环的执行路径;前台中断处理定时事件,刷新输出脉冲控制电机。其固件代码执行起点在Main.c文件中的main函数。Main函数分3段。第1段源码:
_system_init();
其主要功能是禁用ATxmega192芯片看破门狗,始化C语言运行库,启动USB枚举过程,连接PC机;
第2段源码:
_application_init();
run_canned_startup(); // 目前为空
其中_application_init()函数包含:
hardware_init(); // 设置芯片工作频率16MHz
persistence_init(); // 设置掉电不丢失数据RAM的基地址
rtc_init(); // 设置万年历功能
xio_init(); // 初始化串口,SPI接口,USB接口,文件访问接口
//
stepper_init(); // 初始化步进电机的相关定时器和I/O口
encoder_init(); // 清零编码器变量
switch_init(); // 初始化各轴限位开关输入引脚
pwm_init(); // 初始化PWM1和PWM2输出
//
controller_init(STD_IN, STD_OUT, STD_ERR); //设置标准输入输出
config_init(); //从EEPROM中读取JSON格式的配置文件
network_init(); // 初始化RS485为标准输入,USB为标准输出和标准错误
planner_init(); // 初始化粗插补器的缓存队列
canonical_machine_init(); //初始化G代码解释器`
以下源码初始化中断控制器:
PMIC_SetVectorLocationToApplication(); //
PMIC_EnableHighLevel();
PMIC_EnableMediumLevel();
PMIC_EnableLowLevel();
第3段源码:
for ( ; ; )
{
controller_run( ); // single pass through the controller
}
主任务循环函数controller_run直接调用_controller_HSM函数,该函数内部包含多个子任务函数,且功能注释如下:
DISPATCH(hw_hard_reset_handler()); // 1. 复位看门狗
DISPATCH(hw_bootloader_handler()); // 2. 软件复位
DISPATCH(_shutdown_idler()); // 3. 待机任务
// DISPATCH( poll_switches()); // 4.
DISPATCH(_limit_switch_handler()); // 5. 限位报警开关处理函数
DISPATCH(cm_feedhold_sequencing_callback()); // 6a. 进给运动(见1.2详解)
DISPATCH(mp_plan_hold_callback()); // 6b. plan a feedhold from line runtime
DISPATCH(_system_assertions()); // 7. 崩溃诊断函数
//----- planner hierarchy for gcode and cycles ---------------------------------------//
DISPATCH(st_motor_power_callback()); // 步进电机驱动电源启停管理
DISPATCH(sr_status_report_callback()); // 发送状态报告
DISPATCH(qr_queue_report_callback()); // 发送指令缓存状态报告
DISPATCH(rx_report_callback()); // conditionally send rx report
DISPATCH(cm_arc_callback()); // arc generation runs behind lines
DISPATCH(cm_homing_callback()); // 搜索原点感应器
DISPATCH(cm_jogging_callback()); // 慢进给
DISPATCH(cm_probe_callback()); // G38.2 continuation
DISPATCH(cm_deferred_write_callback()); // 保存数据
// 以下源码实现串口终端交换功能
DISPATCH(_sync_to_planner()); // 检测指令缓存空间大小
DISPATCH(_sync_to_tx_buffer()); // 写入发送缓存
DISPATCH(set_baud_callback()); // 更新串口波特率
DISPATCH(_command_dispatch()); // 执行串口交互指令
DISPATCH(_normal_idler()); // 空闲任务节能
待续。。。