ROS小车搭建(一)——底层STM32使用

最近在弄ROS小车,做一些分享吧。

由于实验室的需求需要搭建一个智能移动平台,平台是两个轮子的差速运动模型。同时也是比较常见的模型,在创客智造上也有相关的代码和说明。自己也在此基础上做了修改,同时也也有之前实验室的师兄留下的代码,做了一些修改。

1前期准备工作

需要准备的材料: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的部分网上有很多,我觉得这位博主的还行关于CAN,需要注意的是终端电阻的配置,一般为120欧。其次是伺服直流电机驱动器和STM32的连接情况,就是“高接高,低接低”,CAN_H和CAN_H对应,CAN_L和CAN_L对应。其次就是CAN-USB的分析仪,这个设备在CAN调试上有着至关重要的作用。给个图,嘿嘿。这个图是在网上找的,我实际上用的和这个差不多,不过比这个圆润多了。

CAN-USB

前期的准备工作已经差不多了,主要是在各种接线和一些初始化的配置。这个根据每个人不同的情况来定。接下来就是在STM32上进行编程设计了。

2CAN的配置和使用

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
  • 10
    点赞
  • 116
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值