完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我正在使用 XMC4500 relax kit 对 MIT Cheetah 马达 AK80-9 进行编程和运行。 代码是正确的,当电机显示绿灯时,但当我尝试调试和运行时,电机却没有正确响应。 尝试 20 次后,电机可能会响应一两次并显示绿灯。 我检查了 c/c++ 设置、电机 CAN id。
是我漏掉了什么,还是哪里出了问题? 我使用的是 DAVE 4.4.2 密码 /* * main.c * * 创建于: 2024 年 2 月 26 日 16:44:40 * 作者:拉贾尔-纳格韦卡尔拉杰尔-纳格韦卡尔 */ #include " dave.h "//来自 DAVE 代码生成的声明(包括 SFR 声明) #include #include char str[200]; bool sys_on = 0; int start = 0; #define P_MIN -12.5f #define P_MAX 12.5f #define V_MIN -50.0f #define V_MAX 50.0f #define KP_MIN 0.0f #define KP_MAX 500.0f #define KD_MIN 0.0f #define KD_MAX 5.0f #define T_MIN -18.0f #define T_MAX 18.0f //初始化电机输入值 浮点数 p_int = 0.0; 浮点 v_int = 0.0; float kp_int = 0.0; float kd_int = 0.0; float t_int = 0.0; //t_int(+ve)--向下,t_int(-ve)--向上 // 读取电机输出的初始化变量 float p_out = 0.0f; float v_out = 0.0f; float t_out = 0.0f; int id; float p1,v1,t1,p2,v2,t2,p1o,v1o,t1o,p2o,v2o,t2o,po,vo,to; uint8_t motor_on[8] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC }; uint8_t zeroo_position[8] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE }; uint8_t motor_off[8] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD }; uint8_t *update_data; CAN_NODE_STATUS_t mo_tranmit_status; unsigned int float_to_uint(float x, float x_min, float x_max, int bits) { float span = x_max - x_min; float offset = x_min; 返回 (unsigned int) ((x - offset) * ((float) ((1<< bits) - 1)) / span); } float uint_to_float(unsigned int x_int,float x_min,float x_max,int bits) { /// 根据给定的范围和位数,将无符号 int 转换为 float /// float span = x_max - x_min; float offset = x_min; return ((float) x_int) * span / ((float) ((1<< bits) - 1)) + offset; } void motorInitialize(int x) { update_data = motor_on; CAN_NODE_MO_UpdateData(( Request_Node)->lmobj_ptr[x],update_data); mo_tranmit_status = CAN_NODE_MO_Transmit(( Request_Node)->lmobj_ptr[x]); } void setZero(int x) { update_data = zero_position; CAN_NODE_MO_UpdateData(( Request_Node)->lmobj_ptr[x],update_data); mo_tranmit_status = CAN_NODE_MO_Transmit(( Request_Node)->lmobj_ptr[x]); } //向电机发送信息 void motorStop(int x) { update_data = motor_off; CAN_NODE_MO_UpdateData(( Request_Node)->lmobj_ptr[x],update_data); CAN_NODE_MO_Transmit(( Request_Node)->lmobj_ptr[x]); } void transmitMessage(int x, float *p, float *v, float *t) { *p = p_int; *v = v_int; *t = t_int; //检查输入值是否在限制范围内 float p_des = fminf(fmaxf(P_MIN, p_int), P_MAX); float v_des = fminf(fmaxf(V_MIN, v_int), V_MAX); float kp = fminf(fmaxf(KP_MIN, kp_int), KP_MAX); float kd = fminf(fmaxf(KD_MIN, kd_int), KD_MAX); float t_ff = fminf(fmaxf(T_MIN, t_int), T_MAX); //将浮点数转换为无符号整数 unsigned int p_uint = float_too_uint(p_des, P_MIN, P_MAX, 16); unsigned int v_uint = float_too_uint(v_des, V_MIN, V_MAX, 12); unsigned int kp_uint = float_too_uint(kp, KP_MIN, KP_MAX, 12); unsigned int kd_uint = float_too_uint(kd, KD_MIN, KD_MAX, 12); unsigned int t_uint = float_too_uint(t_ff, T_MIN, T_MAX, 12); // 为 can 数据分配 uint 值,以便传输 XMC_CAN_MO_t *transmit_objecct = ( Request_Node)->lmobj_ptr[x]->mo_ptr; transmit_objecct->can_data_byte[0] = p_uint>> 8; transmit_objecct->can_data_byte[1] = p_uint 0xFF; transmit_objecct->can_data_byte[2] = v_uint>> 4; transmit_objecct->can_data_byte[3] = ((v_uint 0xF)<< 4 | (kp_uint>> 8)); transmit_objecct->can_data_byte[4] = kp_uint 0xFF; transmit_objecct->can_data_byte[5] = kd_uint>> 4; transmit_objecct->can_data_byte[6] = ((kd_uint 0xF)<< 4 | (t_uint>> 8)); transmit_objecct->can_data_byte[7] = t_uint 0xFF; CAN_NODE_MO_Init(( Request_Node)->lmobj_ptr[x]); //{0x7F, 0XFF, 0x7F, 0XF0, 0x00, 0x00, 0x07, 0xFF} CAN_NODE_MO_Transmit(( Request_Node)->lmobj_ptr[x]); p_uint = (transmit_objecct->can_data_byte[0]<< | transmit_objecct->can_data_byte[1]; v_uint = (transmit_objecct->can_data_byte[2]<< 4) | (transmit_objecct->can_data_byte[3]>> 4); kp_uint = ((transmit_objecct->can_data_byte[3] 0xF)<< | transmit_objecct->can_data_byte[4]; kd_uint = (transmit_objecct->can_data_byte[5]<< 4) | (transmit_objecct->can_data_byte[6]>> 4); t_uint = ((transmit_objecct->can_data_byte[6] 0xF)<< | transmit_objecct->can_data_byte[7]; p_des = uint_too_float(p_uint, P_MIN, P_MAX, 16); v_des = uint_too_float(v_uint, V_MIN, V_MAX, 12); kp = uint_too_float(kp_uint, KP_MIN, KP_MAX, 12); kd = uint_too_float(kd_uint, KD_MIN, KD_MAX, 12); t_ff = uint_too_float(t_uint, T_MIN, T_MAX, 12); } void receiveMessage(int x, int *id, float *p, float *v, float *t) { XMC_CAN_MO_t *receive_objecct = ( Request_Node)->lmobj_ptr[x]->mo_ptr; CAN_NODE_MO_Receive(( Request_Node)->lmobj_ptr[x]); // CAN_NODE_MO_ReceiveData(( Request_Node)->lmobj_ptr[1]); *id = receive_objecct->can_data_byte[0]; unsigned int p_out = (receive_objecct->can_data_byte[1]<< | receive_objecct->can_data_byte[2]; unsigned int v_out = (receive_objecct->can_data_byte[3]<< 4) | (receive_objecct->can_data_byte[4]>> 4); unsigned int i_out = ((receive_objecct->can_data_byte[4] 0xF)<< | receive_objecct->can_data_byte[5]; *p = uint_too_float(p_out, P_MIN, P_MAX, 16); *v = uint_too_float(v_out, V_MIN, V_MAX, 12); *t = uint_to_float(i_out,T_MIN,T_MAX,12); /* sprintf(str,"%d,%.2f,%.2f,%.2frn",id,); SEGGER_RTT_WriteString(0, str);*/ } /** * @brief main ()-应用程序入口点 * * 函数的详细信息 * 此例程是应用程序的入口点。 它由设备启动代码调用。 它负责 * 调用 APP 初始化调度器例程-dave_init () 并托管用户应用程序的占位符 * 代码。 */ int main(空白) { dave_status_T 状态; 状态 = dave_init ();/* DAVE 应用程序的初始化*/ 如果(状态!= DAVE_STATUS_SUCCESS) { /* 错误处理程序代码的占位符。 下面的 while 循环 CAN 替换为用户错误处理程序。 */ XMC_DEBUG("DAVE 应用程序初始化失败 n);" 而 (1U) { } } motorInitialize(0); setZero(0); start = 1; /* 用户应用程序代码的占位符。 下面的 while 循环 CAN 替换为用户应用程序代码。 */ while(start) { p_int = p_int + 0.01; transmitMessage(0, p1, v1, t1); receiveMessage(1, id, p1o, v1o, t1o); sprintf(str,"%d,%.2f,%.2f,%.2f,%.2f,%.2f,%.2frn",id,p1,v1,t1,p1o,v1o,t1o); SEGGER_RTT_WriteString(0, str); } } smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/XMC/XMC4500/td-p/711673 |
|
相关推荐
1个回答
|
|
根据您提供的信息,您正在使用XMC4500 relax kit对MIT Cheetah马达AK80-9进行编程和运行。您已经检查了C/C++设置和电机CAN ID,但电机仍然没有正确响应。以下是一些建议和可能的原因:
1. **硬件连接**:确保XMC4500 relax kit与MIT Cheetah马达AK80-9之间的硬件连接正确无误。检查电缆、连接器和电机驱动器是否连接正确。 2. **电源**:确保XMC4500 relax kit和MIT Cheetah马达AK80-9都已正确连接到电源,并具有足够的电源供应。 3. **固件版本**:检查您的XMC4500 relax kit和MIT Cheetah马达AK80-9的固件版本是否兼容。如果不兼容,尝试更新固件到最新版本。 4. **CAN通信**:检查CAN通信设置,确保CAN速率、节点地址和其他参数正确配置。您可以尝试使用其他设备(如CAN分析器)来测试CAN通信。 5. **代码逻辑**:虽然您提到代码是正确的,但仍然建议仔细检查代码逻辑,确保没有错误或遗漏。特别是检查与电机控制相关的部分,如PWM信号、速度设置等。 6. **调试工具**:使用调试工具(如DAVE 4.4.2)逐步执行代码,观察程序在运行过程中的行为。这有助于找到可能导致问题的代码段。 7. **硬件故障**:如果以上步骤都无法解决问题,可能是XMC4500 relax kit或MIT Cheetah马达AK80-9本身存在硬件故障。尝试更换硬件部件,看看问题是否得到解决。 8. **软件问题**:如果问题仍然存在,可能是DAVE 4.4.2或其他软件工具的问题。尝试更新软件到最新版本,或者寻求技术支持。 总之,要解决这个问题,您需要从硬件连接、电源、固件版本、CAN通信、代码逻辑、调试工具、硬件故障和软件问题等方面进行排查。希望这些建议能帮助您找到问题所在并解决它。 |
|
|
|
只有小组成员才能发言,加入小组>>
TLE9879_BLDC电机启动需要用手拨一下才能转动,怎么解决?
5637 浏览 2 评论
4083 浏览 9 评论
请问TLE5012B_E1000 启动后为什么位置不能正确获取
3598 浏览 9 评论
1208 浏览 8 评论
3502 浏览 7 评论
421浏览 2评论
252浏览 2评论
359浏览 2评论
TLE9879_BLDC电机启动需要用手拨一下才能转动,怎么解决?
5638浏览 2评论
如果是打开已有的dave工程,怎么查看这个工程选择的mcu型号?
427浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-1 09:02 , Processed in 0.476992 second(s), Total 47, Slave 41 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号