赞
踩
最近在弄ROS小车,做一些分享吧。
由于实验室的需求需要搭建一个智能移动平台,平台是两个轮子的差速运动模型。同时也是比较常见的模型,在创客智造上也有相关的代码和说明。自己也在此基础上做了修改,同时也也有之前实验室的师兄留下的代码,做了一些修改。
需要准备的材料:STM32板子(stm32vet6,100引脚)、伺服直流电机以及驱动器、减速器、轮子、串口转USB的线、USB-CAN分析仪,上位机电脑、keil5软件、串口调试助手、USB-CAN监控软件(CAN_TEST)等。
因为相关的机械结构已经制作好了,不需要再多余的安装相关机械设施,主要把重点集中在STM32的调试上。首先需要说一下整体的思路如下图所示:
其实原理上是很简单的,就是通过上位机发送通过串口发送指令给STM32,STM32通过检测到串口发送的命令进行分析并通过CAN分配给两个电机一定的速度,同时STM32通过CAN接收到电机的位置反馈信息,经过计算得到里程计信息再经过串口发送给上位机。
驱动器电机配置
因为驱动器和伺服电机已经是采购好的,所以需要通过厂家给定的上位机软件对其进行设置即可,具体如下图所示。
上图中黄色框部分我基本上没有改动,厂家给定的参数即可。蓝色框部分是我用到的部分,需要选择模式,上方的是PC端输入,下方是速度控制即转速控制。中间黑色框部分是设置CAN报文的时间即多长时间发送报文,我设置的是0,因为我在STM32身上会发送相关请求指令,关键的是CAN的波特率一定和STM32的对应上,否则会有一些麻烦,还有就是可以再软件上设置CAN的ID号和组号,通过设置ID可以使STM32识别不同的电机并且发送相关指令。右侧的红色框是PID调节部分,这一部分需要自己调节,一般厂家也会设置好,这里面很方便不会占用很长时间。一般PID调节的首先需要使ID为0,开始调节P值,从小到大,然后在接近目标速度时需要将此时的值记下并乘以0.75,然后开始调节I,使波动范围最小确定下此时的I值,最后调节PI以及D的值使其更精确,一般都用PI调节。最右侧的红色框表示对电压以及电流的转速等的监控。最后驱动器连接好的如下图所示。
上图中左侧的“网线”是和上位机进行232通讯,配置相关参数即上位机软件,此口也会用到和STM32进行CAN通讯的连接。中间的连线接电机,右侧红黑线是电源。相关的参数是电机48V,200W,编码器码盘线数2500,4倍频。其实以上说的这些都是厂家给的资料信息,其中有些接线是自己制作的。
一般CAN的部分网上有很多,我觉得这位博主的还行关于CAN,需要注意的是终端电阻的配置,一般为120欧。其次是伺服直流电机驱动器和STM32的连接情况,就是“高接高,低接低”,CAN_H和CAN_H对应,CAN_L和CAN_L对应。其次就是CAN-USB的分析仪,这个设备在CAN调试上有着至关重要的作用。给个图,嘿嘿。这个图是在网上找的,我实际上用的和这个差不多,不过比这个圆润多了。
前期的准备工作已经差不多了,主要是在各种接线和一些初始化的配置。这个根据每个人不同的情况来定。接下来就是在STM32上进行编程设计了。
STM32这个工控板是含有一个CAN通讯接口的,下面就需要在软件上对其进行一定的配置。具体代码如下:
- void CAN1_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
- CAN_InitTypeDef CAN_InitStructure;
- CAN_FilterInitTypeDef CAN_FilterInitStructure;
-
- /* 复用功能和GPIOB端口时钟使能*/
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB, ENABLE);
-
- /* CAN1 模块时钟使能 */
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
-
- /* Configure CAN pin: RX */ // PB8
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入
- GPIO_Init(GPIOB, &GPIO_InitStructure);
-
- /* Configure CAN pin: TX */ // PB9
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出
- GPIO_Init(GPIOB, &GPIO_InitStructure);
-
- //#define GPIO_Remap_CAN GPIO_Remap1_CAN1 本实验没有用到重映射I/O
- GPIO_PinRemapConfig(GPIO_Remap1_CAN1, ENABLE);
-
- //CAN_NVIC_Configuration(); //CAN中断初始化
- /* Configure the NVIC Preemption Priority Bits */
- //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
-
- #ifdef VECT_TAB_RAM
- /* Set the Vector Table base location at 0x20000000 */
- NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
- #else /* VECT_TAB_FLASH */
- /* Set the Vector Table base location at 0x08000000 */
- NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
- #endif
-
- /* enabling interrupt */
- NVIC_InitStructure.NVIC_IRQChannel=USB_LP_CAN1_RX0_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
-
- //CAN_INIT();//CA初始化N模块
- /* CAN register init */
- CAN_DeInit(CAN1); //将外设CAN的全部寄存器重设为缺省值
- CAN_StructInit(&CAN_InitStructure);//把CAN_InitStruct中的每一个参数按缺省值填入
-
- /* CAN cell init */
- CAN_InitStructure.CAN_TTCM=DISABLE; //没有使能时间触发模式
- CAN_InitStructure.CAN_ABOM=DISABLE; //没有使能自动离线管理
- CAN_InitStructure.CAN_AWUM=DISABLE; //没有使能自动唤醒模式
- CAN_InitStructure.CAN_NART=DISABLE; //没有使能非自动重传模式
- CAN_InitStructure.CAN_RFLM=DISABLE; //没有使能接收FIFO锁定模式
- CAN_InitStructure.CAN_TXFP=DISABLE; //没有使能发送FIFO优先级
- CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;//CAN设置为正常模式
- CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; //重新同步跳跃宽度1个时间单位
- CAN_InitStructure.CAN_BS1=CAN_BS1
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。