当前位置: 首页 > wzjs >正文

哪个网站可以做推手优化公司怎么优化网站的

哪个网站可以做推手,优化公司怎么优化网站的,漯河北京网站建设,网站友情链接怎么做项目进一步往下做的时候,要上实物了,需要用到达妙电机,虽然有说明书和例程,但是STM32控制电机的具体时间还是花了些时间,我的板子和例程的有些区别,中间很多地方都需要进行修改完善,而且还补充了…

项目进一步往下做的时候,要上实物了,需要用到达妙电机,虽然有说明书和例程,但是STM32控制电机的具体时间还是花了些时间,我的板子和例程的有些区别,中间很多地方都需要进行修改完善,而且还补充了串口通信和lcd反馈等功能,以便于实现后期的上位机控制。现在下层的控制代码基本实现,很开心,特此记录下:)

一、达妙电机CAN通信报文格式汇总

达妙电机CAN通信采用的是标准帧格式,波特率是1Mbps,以下是根据达妙电机说明书及例程代码总结的CAN通信报文格式汇总表。

二、CAN接收与CAN发送的实现

所有的CAN通信无非就是实现两个操作,一个是发送报文,一个是接收报文。达妙电机也不例外。

1.发送报文

对于发送帧,我们有了上面的报文格式后,就可以结合报文格式,组成形成需要发送的报文,再调用CAN发送函数,就可以实现报文发送。我以电机使能和MIT控制函数为例,对相应的报文发送进行介绍,其余的方法类似。

1.1 CAN报文发送函数:

从以下函数可以看出,我们发送报文的时候需要获取3个内容,第一个是发送报文的ID,第二个是发送报文的数据msg,第三个是发送报文的数据长度len。

实际调用的流程就是2步:1. 获取对应参数(ID和Data),2. 调用can_send_msg函数发送报文

uint8_t can_send_msg(uint32_t id, uint8_t *msg, uint8_t len)
{uint16_t t = 0; //用于计时,放置发送超时uint32_t TxMailbox = CAN_TX_MAILBOX0;       //指定发送邮箱号// 安全断言if(len > 8 || msg == NULL) return 1;// 分别处理标准帧和扩展帧if(id <= 0x7FF){g_canx_txheader.StdId = id & 0x7FF;         /* 标准标识符,确保11位ID */g_canx_txheader.ExtId = 0; g_canx_txheader.IDE = CAN_ID_STD;}else{g_canx_txheader.ExtId = id & 0x1FFFFFFF;    /* 扩展标识符(29位) */g_canx_txheader.StdId = 0; g_canx_txheader.IDE = CAN_ID_EXT;}g_canx_txheader.RTR = CAN_RTR_DATA; /* 数据帧 */g_canx_txheader.DLC = len;//尝试发送if (HAL_CAN_AddTxMessage(&g_canx_handler, &g_canx_txheader, msg, &TxMailbox) != HAL_OK) /* 发送消息 */{return 1;}//等待发送完成(优化版)while (HAL_CAN_GetTxMailboxesFreeLevel(&g_canx_handler) != 3)   /* 等待发送完成,所有邮箱为空 */{t++;if (t > 0xFFF){HAL_CAN_AbortTxRequest(&g_canx_handler, TxMailbox);     /* 超时,直接中止邮箱的发送请求 */return 1; //发送超时}}return 0;  //发送成功且未超时
}

1.2 MIT控制模式报文发送

这个是MIT控制模式,首先它的ID组成就是我们设置的电机ID(motor_id)加上一个模式ID,模式ID有固定的宏定义,具体如下。

#define MIT_MODE            0x000    //对应MIT模式

#define POS_MODE            0x100    //对应位置速度模式

#define SPD_MODE            0x200    //对应速度模式

#define PSI_MODE            0x300

1.2.1 获取报文ID

我们首先需要得到报文的ID:就是motor_id 和mode_id的组合

uint16_t id = motor_id + MIT_MODE;
1.2.2 获取数据Data

获得报文ID后,我们进一步需要获取数据位,其中数据位格式就是在这个图里面,对应数据位进行赋值就可以得到data。

但需要注意,数据位里面的pos_tmp,vel_tmp,kp_tmp,kd_tmp,tor_tmp不是浮点数,需要进行数据转换,数据转化的时候需要提前给定各个参数的范围。 例程代码里面有提前进行设定,但具体值是否与电机内部的设定一致,可以利用调试助手读一下相关的参数。

    //浮点数转化为整型pos_tmp = float_to_uint(pos, -motor->tmp.PMAX, motor->tmp.PMAX, 16);vel_tmp = float_to_uint(vel, -motor->tmp.VMAX, motor->tmp.VMAX, 12);tor_tmp = float_to_uint(tor, -motor->tmp.TMAX, motor->tmp.TMAX, 12);kp_tmp  = float_to_uint(kp,  KP_MIN, KP_MAX, 12);kd_tmp  = float_to_uint(kd,  KD_MIN, KD_MAX, 12);//已经修改,确保数据不出错data[0] = (pos_tmp >> 8) & 0xFF;  //pos高8位data[1] = pos_tmp & 0xFF;  //pos低8位data[2] = (vel_tmp >> 4) & 0xFF;  //vel 高8位data[3] = ((vel_tmp & 0xF) << 4) | ((kp_tmp >> 8) & 0xF);  //vel 低4位与 kp 高4位组合data[4] = kp_tmp & 0xFF;  //kp低8位data[5] = (kd_tmp >> 4) & 0xFF;  //kd高8位data[6] = ((kd_tmp & 0xF) << 4) | ((tor_tmp >> 8) & 0xF);  //kd低4位 与 tor 高4位组合data[7] = tor_tmp & 0xFF; //tor 低8位

这个图片里面是我的电机的范围限定值,需要根据自己的电机确定哦: 

1.2.3 发送报文

直接调用can_send_msg就可以了

can_send_msg( id, data, 8);

整体mit控制函数如下:

需注意由于对应的参数给定时可能会超出范围,所以调用前需要进行范围监测,以使得程序更加安全。 

void mit_ctrl( motor_t *motor, uint16_t motor_id, float pos, float vel,float kp, float kd, float tor)
{uint8_t data[8];uint16_t pos_tmp,vel_tmp,kp_tmp,kd_tmp,tor_tmp; //转换成0-65535,或者0-4095uint16_t id = motor_id + MIT_MODE;//浮点数转化为整型pos_tmp = float_to_uint(pos, -motor->tmp.PMAX, motor->tmp.PMAX, 16);vel_tmp = float_to_uint(vel, -motor->tmp.VMAX, motor->tmp.VMAX, 12);tor_tmp = float_to_uint(tor, -motor->tmp.TMAX, motor->tmp.TMAX, 12);kp_tmp  = float_to_uint(kp,  KP_MIN, KP_MAX, 12);kd_tmp  = float_to_uint(kd,  KD_MIN, KD_MAX, 12);//已经修改,确保数据不出错data[0] = (pos_tmp >> 8) & 0xFF;  //pos高8位data[1] = pos_tmp & 0xFF;  //pos低8位data[2] = (vel_tmp >> 4) & 0xFF;  //vel 高8位data[3] = ((vel_tmp & 0xF) << 4) | ((kp_tmp >> 8) & 0xF);  //vel 低4位与 kp 高4位组合data[4] = kp_tmp & 0xFF;  //kp低8位data[5] = (kd_tmp >> 4) & 0xFF;  //kd高8位data[6] = ((kd_tmp & 0xF) << 4) | ((tor_tmp >> 8) & 0xF);  //kd低4位 与 tor 高4位组合data[7] = tor_tmp & 0xFF; //tor 低8位//发送报文can_send_msg( id, data, 8);
}

1.3 电机使能 

电机使能,相比上面这个MIT控制的报文发送就更加简单,因为它的数据位是固定的,那我们直接给定就可以了,具体如下:

void enable_motor_mode( uint16_t motor_id, uint16_t mode_id)
{uint16_t id = motor_id + mode_id; //id帧格式= 电机ID+ 模式编号uint8_t data[8] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC}; can_send_msg( id, data, 8);
}

2.接收反馈报文

对于反馈帧,我们只需要进行对应接收即可。反馈帧反馈回来的ID是总线的ID,所以接收反馈帧的时候,我们只需要选择接收主CAN的数据即可,具体接收函数如下:其中,id = mst_id。

CAN接收函数:

uint8_t can_receive_msg(uint32_t id, uint8_t *buf)
{//参数检查if(buf == NULL) return 0;//检查FIFO0是否接收数据,如果没有数据,返回0if (HAL_CAN_GetRxFifoFillLevel(&g_canx_handler, CAN_RX_FIFO0) == 0)     /* 没有接收到数据 */{return 0;//报错}if (HAL_CAN_GetRxMessage(&g_canx_handler, CAN_RX_FIFO0, &g_canx_rxheader, buf) != HAL_OK)  /* 读取数据 */{return 0;//报错}//帧类型自动识别验证, 必须位数据帧if(g_canx_rxheader.RTR != CAN_RTR_DATA){return 0;//报错}//根据实际接收的帧类型进行ID验证if(g_canx_rxheader.IDE == CAN_ID_STD){if((g_canx_rxheader.StdId & 0x7FF) != (id & 0x7FF)){return 0;//报错}}else{if((g_canx_rxheader.ExtId & 0x1FFFFFFF) != (id & 0x1FFFFFFF)){return 0;//报错}}//消息验证通过,返回接收的数据长度return g_canx_rxheader.DLC ;
}

三、实验

达妙电机控制实验_哔哩哔哩_bilibili

http://www.dtcms.com/wzjs/378266.html

相关文章:

  • 做网站需要工商执照吗友情链接例子
  • asp网站建设教程广州seo快速排名
  • 艺客网站首页网站流量查询网站统计查询
  • 360免费wifi怎么连接西安区seo搜索排名优化
  • 各类东莞微信网站建设b站推广网站2024
  • 广东建设安全协会网站代运营公司靠谱吗
  • 外贸免费建设网站制作百度一下就知道百度首页
  • 做网站资源知乎整站优化和关键词优化的区别
  • 外贸型网站建设公司盘多多网盘搜索
  • 成功卡耐基网站建设企业管理8大系统
  • 做私服网站电话nba赛程排名
  • 网站建设技术进行开发网络推广服务费
  • 页面设计制作网站网址之家
  • 上海网站运营上海外包seo
  • 企业门户网站模板html上线抚州seo排名
  • 陕西营销型手机网站建设seo国外英文论坛
  • 网站建设修改教程视频教程seo教程seo官网优化详细方法
  • 大连投诉网站网络营销心得体会300字
  • 网址大全下载安装短视频seo软件
  • ai网站seo站内优化
  • 网站怎么做公司百度网页版下载安装
  • 东莞厚街家具批发市场搜索引擎优化涉及的内容
  • 粉丝网站制作seoul是什么国家
  • 网站开发的心得体会seo软件优化
  • 下载jsp网站开发用啥工具企业网络策划
  • 设计图网址2020站群seo系统
  • 免费做电脑网站吗seo算法是什么
  • oa系统网站建设方案2021最新免费的推广引流软件
  • 菜鸟教程网站首页制作东莞网络公司网络推广
  • 谁做视频网站品牌策略怎么写