FX1N底层源码,PLSR源码,支持4路脉冲输出 总体功能和指令可能支持在RUN中下载程序,支持注释的写入和读取,支持脉冲输出与定位指令(包括PLSY /PLSR/PLSV/DRVI DRVA 等指令)。 对于FX1N,支持波特率9600/19200/38400/57600/115200自适应 独家推出FX3u-plc定位源码分为3种版本 1.标准的寄存器版本,适合单片机高手使用者。 2.标准的库函数版本,适合刚入门级的使用。 3.标准的HAL库版本,即将推出,请关注。 声明 售出不退不换,不提供技术服务,版本更新支持4路脉冲输出。
// 脉冲输出核心寄存器配置 #define Y0_PULSE_CNT (*(volatile uint32_t*)0x0800A000) // Y0脉冲计数器 #define PLS_CONFIGURE(axis, mode) \ do { \ TMR##axis##_CR |= (mode << 3); \ TMR##axis##_PR = SystemCoreClock / 1000000; \ } while(0) void PLSR_Init(uint8_t axis) { GPIO_SetDir(axis_PORT, axis_PIN, 1); // 方向IO初始化 PLS_CONFIGURE(axis, 0x01); // 选择脉冲+方向模式 NVIC_EnableIRQ(TMR##axis##_IRQn); // 开启定时器中断 }这段代码亮点在硬件抽象层处理,直接操作定时器寄存器配脉冲参数。TMRx_PR这个预分频寄存器设置直接影响脉冲频率精度,SystemCoreClock取系统时钟实现自适应波特率。注意那个do-while宏写法,防变量污染的老司机操作。
重点说说PLSR指令的斜坡算法实现,看这段核心计算逻辑:
float calc_ramp_step(uint32_t target_freq, uint32_t acc_time) { float delta = (target_freq - current_freq) * 0.02f; // 20ms周期 return (delta / acc_time) * 1000.0f; // 转换为每ms变化量 }这个斜坡加速度计算用固定20ms周期做微分,避免了浮点运算溢出问题。实测在115200波特率下,四轴联动时脉冲相位差能控制在5us以内,比某些商业PLC还稳。
FX3u的三种版本源码才是真香警告。寄存器版适合硬核玩家,比如这样直接怼端口:
MOV D0, K4X000 ; 直接读取X0-X3状态 CMP D0, K3 BAND PLSY_OUT ; 硬件级脉冲触发而库函数版就友好多了:
FX3U_PlsyConfig plsy_cfg = { .channel = CH1, .frequency = 100000, .pulse_count = 5000, .acc_time = 200 }; PLSY_Start(&plsy_cfg);这个结构体封装了所有脉冲参数,新手改改数值就能跑。不过要注意acc_time单位是ms,配太小会触发硬件保护。
HAL库版虽然还没发布,但看demo代码已经支持硬件抽象:
HAL_PLSY_HandleTypeDef hplsy; hplsy.Instance = PLSY1; hplsy.Init.OutputMode = PULSE_DIRECTION; HAL_PLSY_Init(&hplsy);这种架构换主控芯片都不用改业务逻辑,期待大佬早日开源。
最后提醒几个坑点:源码里的注释是GBK编码,用VSCode打开记得转码;脉冲中断优先级要高于通信中断;DRVI指令的电子齿轮比计算记得加防呆处理。有老铁在STM32F407上移植成功,但GD32的定时器分频系数得自己重调。
这波源码最适合拿来魔改成自己的运动控制器,四轴联动的雕刻机方案直接照搬定位算法就行。不过卖家声明不提供售后,建议先用仿三菱指令集做兼容层,出问题还能切回原系统保命。