R2_UP/User/task/can_task.c

85 lines
2.5 KiB
C
Raw Normal View History

2025-03-12 10:46:02 +08:00
/*
CAN总线数据处理
CAN总线收到的电机数据
*/
#include "can_task.h"
#include "can_use.h"
#include "user_task.h"
#ifdef DEBUG
CAN_t can;
CAN_Output_t can_out;
CAN_RawRx_t can_rx;
#else
static CAN_t can;
static CAN_Output_t can_out;
static CAN_RawRx_t can_rx;
#endif
void Task_can(void *argument)
{
(void)argument;
const uint32_t delay_tick = osKernelGetTickFreq() / TASK_FREQ_CAN;
/* Device Setup */
CAN_Init(&can, &(task_runtime.config.chassis_config->can));
uint32_t tick = osKernelGetTickCount(); /* 控制任务运行频率的计算 */
/* Task Setup */
while (1) {
#ifdef DEBUG
task_runtime.stack_water_mark.can = osThreadGetStackSpace(osThreadGetId());//osThreadGetStackSpace 是一个函数,用于获取指定线程的剩余堆栈空间
#endif
while (osMessageQueueGet(can.msgq_raw, &can_rx, 0, 0)==osOK)
{
CAN_StoreMsg(&can, &can_rx);
}
// //一问一答sick数据指令
// CAN_Sick_Control(&can);
//
/*can设备数据存入队列*/
osMessageQueueReset(task_runtime.msgq.can.feedback.CAN_feedback );
osMessageQueuePut(task_runtime.msgq.can.feedback.CAN_feedback , &can, 0, 0);
osMessageQueueReset(task_runtime.msgq.can.feedback.shoot5065_feedback);
osMessageQueuePut(task_runtime.msgq.can.feedback.shoot5065_feedback, &can, 0, 0);
/*电机控制*/
if (osMessageQueueGet(task_runtime.msgq.can.output.pitch6020,
&(can_out.pitch6020),0,0) == osOK) {
CAN_DJIMotor_Control(CAN_MOTOR_PITCH6020,&can_out,&can);
}
if (osMessageQueueGet(task_runtime.msgq.can.output.chassis3508,
&(can_out.motor3508), 0, 0) == osOK) {
CAN_DJIMotor_Control(CAN_MOTOR_3508,&can_out,&can);
}
if (osMessageQueueGet(task_runtime.msgq.can.output.chassis6020,
&(can_out.chassis6020),0,0) == osOK) {
CAN_DJIMotor_Control(CAN_MOTOR_CHASSIS6020,&can_out,&can);
}
if (osMessageQueueGet(task_runtime.msgq.can.output.shoot5065,
&(can_out.chassis5065), 0, 0) == osOK) {
CAN_VESC_Control(1,CAN_MOTOR_CHASSIS5065, &can_out ,&can);
}
if (osMessageQueueGet(task_runtime.msgq.can.output.shoot5065,
&(can_out.chassis5065), 0, 0) == osOK) {
CAN_VESC_Control(2,CAN_MOTOR_CHASSIS5065, &can_out ,&can);
}
tick += delay_tick; /* 计算下一个唤醒时刻 */
osDelayUntil(tick); /* 运行结束,等待下一个周期唤醒 */
}
}