嵌入式开发--汇川伺服干扰造成FDCAN模块错误过多导致死机
情况描述
FDCAN运行时,会有一个FDCAN_ECR寄存器来统计出错的情况,我遇到的情况就是TEC和REC数值过大,导致FDCAN模块挂起。
一般来说,只要总线上的噪声情况不是很严重的话,这两个值都不会很大的。而且当正常发送或正常接收数据包时,这两个计数器的值还会变小。
但我的情况是汇川的伺服驱动器会在CAN总线上发出噪声信号,如下图:
很规律的,每10ms来一组脉冲,持续时间约为2.5ms,大约占用25%的总线时间。这些脉冲会造成FDCAN错误计数器的值增加。
干扰脉冲在伺服上电的时候是没有的,当向0x6040写6,7,0f,1f,2f的过程中,写完0f后,干扰立即出现。
对红圈中的一个干扰脉冲放大后如下图:
其中一组小脉冲总持续时间约0.5ms, 频率约为25MHz。
咨询汇川,说是没法关掉,需要工程师上门检测。这是外地客户寄来给我的样品,而且我手上就只有这一个伺服,开发时间也很紧张,不能寄回去,于是作罢。
尝试解决办法
1 试图清除ECR寄存器
这玩意是只读寄存器,是不能直接清零的。
于是通过重新初始化FDCAN模块来尝试清零。
试过的办法
MX_FDCAN1_Init();
HAL_FDCAN_Init(&hfdcan1) ;
HAL_FDCAN_DeInit(&hfdcan1) ;
HAL_FDCAN_Init(&hfdcan1) ;
RESET引脚
各种初始化办法都不行,当然按复位键是可以清零的,或者说控制RESET引脚是可以的。但如果这样搞会严重影响其他设备的运行。这个芯片级复位的方案不可接受,只能说万不得已才用。
模块级复位
最后解决的办法是模块级复位,即只复位FDCAN模块
__HAL_RCC_FDCAN_FORCE_RESET(); //对CAN1外设实施强制复位
delay_us(100);
__HAL_RCC_FDCAN_FORCE_RESET();//释放对CAN1外设的强制复位
通过设置RCC_APB1RSTR1的FDCAN RST位进行FDCAN模块的复位。
代码如下:
//检测到过多错误时,重新初始化FDCAN模块
void LL_fdcan_check_err(void)
{FDCAN_ErrorCountersTypeDef err1;HAL_FDCAN_GetErrorCounters(&hfdcan1, &err1);if((err1.RxErrorCnt>0x40) || (err1.TxErrorCnt > 0x40)){__HAL_RCC_FDCAN_FORCE_RESET();delay_us(100);__HAL_RCC_FDCAN_RELEASE_RESET();//HAL_FDCAN_Init(&hfdcan1);MX_FDCAN1_Init();LL_can_init();HAL_FDCAN_Start(&hfdcan1);}
}
解决及后续
当然,解决干扰源的问题才是正道,但我手上就这么一个伺服驱动器,等后续开发完成,再继续更新吧。
如果有哪位知道怎么解决汇川伺服干扰源的问题,请留言告知,感谢。