[C] 纯文本查看 复制代码 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM17) //没有采用htim == canopenNodeSTM32->timerHandle
{
canopen_app_interrupt();
}
/* USER CODE END Callback 1 */
}
[C] 纯文本查看 复制代码 void ctlPP(uint8_t nodeID,int32_t target_position){
CO_NMT_sendCommand(CO->NMT, CO_NMT_ENTER_OPERATIONAL, nodeID);//节点进入操作状态
CO_SYNCsend(CO->SYNC);
printf("%d joint position_actual_value=%ld\r\n",nodeID,OD_RAM.x2727_position_actual_value_m64_0);
OD_RAM.x2700_controlword_m40_0 = 0x06;
OD_RAM.x274F_target_position_m7A_0 = 0;
CO_TPDOsendRequest(&CO->TPDO[JOINT1_PDO_CH1]);//关闭
canopen_app_interrupt();
OD_RAM.x2700_controlword_m40_0 = 0x07;
OD_RAM.x274F_target_position_m7A_0 = 0;
CO_TPDOsendRequest(&CO->TPDO[JOINT1_PDO_CH1]);//准备使能
canopen_app_interrupt();
OD_RAM.x2700_controlword_m40_0 = 0x0f;
OD_RAM.x274F_target_position_m7A_0 = 0;
CO_TPDOsendRequest(&CO->TPDO[JOINT1_PDO_CH1]);//使能
canopen_app_interrupt();
//06->07->0F
CO_SYNCsend(CO->SYNC);
OD_RAM.x2700_controlword_m40_0 = 0x2f;
OD_RAM.x274F_target_position_m7A_0 = 0;
CO_TPDOsendRequest(&CO->TPDO[JOINT1_PDO_CH1]);//发TPO0
canopen_app_interrupt();
OD_RAM.x2700_controlword_m40_0 = 0x3f;
OD_RAM.x274F_target_position_m7A_0 = target_position;
CO_TPDOsendRequest(&CO->TPDO[JOINT1_PDO_CH1]);//发TPO0
}
1.我是在freeRTOS中使用的,原来的代码是htim == canopenNodeSTM32->timerHandle没法使用,改成了上面的。pdo不能够即时触发,[CANopenNode协议栈使用CO_TPDOsendRequest函数只有最后一条生效]之前已经说过,我在代码中穿插入canopen_app_interrupt()就能即时发送了。
2.第二个问题是配置了rpdo,CO_SYNCsend(CO->SYNC),OD_RAM.x2727_position_actual_value_m64_0是一直都是上次获得的值。也就是需要连续两次sync触发CO_SYNCsend(CO->SYNC)才能正确同步,在代码里面写两个CO_SYNCsend或者加延时都是没有用的。
|