开源改变世界

步进器移动缓慢时 SPI 故障 #144

推推 grbl 2年前 (2023-01-21) 104次浏览

关闭
MakeMagazinDE 开启了这个issue 2017 年 2 月 28 日 · 1条评论
关闭

步进器移动缓慢时 SPI 故障#144

MakeMagazinDE 开启了这个issue 2017 年 2 月 28 日 · 1条评论

注释

步进器移动缓慢时 SPI 故障 #144
MakeMagazinDE 评论了 2017 年 2 月 28 日  

你好,

我即将完成我的 GRBL 1.1f 端口到 ATmega644,以及一些不错的附加功能(CNC 手轮/拨号盘和用于慢跑的模拟操纵杆连接,将 XYZ 位置数据实时 SPI 传输到外部 16×2 显示器,通过移位增加 32 个 I/O连接到 SPI 的寄存器、用于覆盖的按钮接口等)。由于您在源代码文档方面的巨大努力,现在一切正常。

但是:我不得不为经典的 SPI 传输实现一个变通方法(写 SPDR,轮询 SPIF 传输完成标志被设置)。

当步进器移动非常慢时,SPIF 将(随机地)不由处理器内核设置,尽管传输很久以前就完成了(用逻辑分析仪检查过)。所以我做了一个超时循环来防止在轮询 SPIF 时冻结。绝对不涉及 ISR,是的,我将 SS 端口位 DDR 设置为输出。我还检查了您的代码中是否使用了 SPI 寄存器。没有。

这也发生在斜坡开始/结束时以加快移动速度。为了进行测试,我删除了所有添加的固件,只是为了仅在 for(;;) 之后直接在 protocol_main_loop() 中测试 SPI 问题、SPI tx 和 SPIF 轮询循环。仍然在那里,它甚至发生在普通的 GRBL 上。也许是因为中断嵌套(sei();在步进 ISR 中)?任何的想法?

当我完成我的项目时,我肯定会发布我的资源。

顺便说一句:是否允许将 gc_state.position 传递给 mc_line?这简化了我的手轮代码:


gc_state.position[dial_axis] += dial_delta_f; // update selected axis pos.   
mc_line(gc_state.position, pl_data); 
if (sys.state == STATE_IDLE) {  ...
  if (plan_get_current_block() != NULL) { ...

这同样适用于我的操纵杆代码,我将 ADC 值传递给进给覆盖,以便在 mc_line() 开始移动后连续控制点动速度:


loop...
 if (adc_value_has_changed) {
   sys.f_override = adc_value_scaled;
   plan_update_velocity_profile_parameters();
   plan_cycle_reinitialize();
  ...
..until joystick released

问候,卡斯滕

步进器移动缓慢时 SPI 故障 #144
贡献者

@heise: 抱歉帮不了你。我对 SPI 如何在 AVR 上工作还不够熟悉,无法给你任何建议。鉴于这与具有自定义功能的端口有关,我将关闭此问题,因为它与主要 Grbl 代码无关。如果您找出导致触发器失败的原因,请告诉我。

喜欢 (0)