zoukankan      html  css  js  c++  java
  • 《SLAM机器人基础教程》第三章 单片机与STM32:碰撞传感器实验

    3.8节 碰撞传感器实验

     碰撞传感器是机器人重要的安全传感器之一,下面介绍如何编写碰撞传感器的驱动程序。

    a.实验准备:碰撞传感器,USB转串口模块,ST-Llink下载器,CHEAPX机器人控制板

    b.实验目的:STM32实现碰撞传感器的数据采集

    c.相关知识点:

    本次碰撞模块使用开关按键式碰撞,开关按键常常伴有抖动,因此需要软件消除抖动。

    d.编程及运行

    (1)初始化3个碰撞传感器

    //硬件接口关系:
    //H1 BUMP1 PD8
    //H2 BUMP2 PB15
    //H3 BUMP3 PB14
    //H4 BUMP4 PB13
    //H5 BUMP5 PB12      
    void InitBumper(void)
    {
        GPIO_InitTypeDef GPIO_InitStruct;
        
          //Bumper Left(PD8) Middle(PB15) Right(PB14)
    
          //Config Clock 配置时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD, ENABLE);//打开GPIOB GPIOD时钟
        
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_14 | GPIO_Pin_15;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;//GPIO_Mode GPIO模式:上拉输入模式
        GPIO_Init(GPIOB, &GPIO_InitStruct);//传入结构GPIO_InitStruct,配置GPIOB
        
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;//GPIO_Mode GPIO模式:上拉输入模式
        GPIO_Init(GPIOD, &GPIO_InitStruct);//传入结构GPIO_InitStruct,配置GPIOD
    }

    (2)传感器数据更新函数

    void BumperUpdate(void)
    {
        static u8 lastBumperStatus=0;//上一次碰撞传感器状态
        static u8 lastPrintfStatus=0;//上次打印时碰撞传感器状态
        u8 currBumperStatus =0;      //当前碰撞传感器状态
        //_BumperStatus bit2-0:Left(PD8) Middle(PB15) Right(PB14)
        //Bumper Left(PD8) Middle(PB15) Right(PB14)
        
        if(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_8)) {currBumperStatus&=0xFB;}else {currBumperStatus|=0x04;}//若PD8高电平,碰撞没被按下,则将currBumperStatus第3位设0,否则将currBumperStatus第3位设1
        if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)){currBumperStatus&=0xFD;}else {currBumperStatus|=0x02;}
        if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)){currBumperStatus&=0xFE;}else {currBumperStatus|=0x01;}
        _BumperStatus = currBumperStatus & lastBumperStatus;//统计滤波:两次值均为1,才认定碰撞开关按下
        lastBumperStatus = currBumperStatus;
        if(_BumperStatus>0)
            if(_BumperStatus!=lastPrintfStatus)
            {
                printf("Bumper ");
                if(_BumperStatus&0x04)printf("1 ");
                if(_BumperStatus&0x02)printf("2 ");
                if(_BumperStatus&0x01)printf("3 ");
                printf("触发
    ");
                
            }
        lastPrintfStatus=_BumperStatus;
    
    }

    (3)主函数:每隔10毫秒运行一次碰撞传感器更新函数BumperUpdate(),读取一次碰撞传感器的状态

    //碰撞传感器实验
    int main(void)
    {        
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //PriorityGroupConfig NVIC中断分组设置 组2(2位抢占优先级,2位响应优先级)
        initDebugSerial(500000);//初始化调试串口USART1,波特率500000
        initSysTick();//初始化滴答定时器和TIM4定时器
        showVersion();//显示版本
        InitBumper(); //初始化 BUMP1-3
        
        while(1)
        {
          BumperUpdate();//更新
            delay_ms(10);//间隔10ms,消除抖动影响
        }
    }

    (4)实验结果:按下开关,串口打印出碰撞开关的编号

  • 相关阅读:
    设计模式(十八)备忘录模式
    六种常见的系统架构
    设计模式(十七)中介者模式
    设计模式(十六)观察者模式
    设计模式(十五)迭代器模式
    js实现对象深拷贝
    js中for in与for of使用
    在使用一些UI框架的某些组件的时候,,取消事件冒泡
    js开根号,使用二分法迭代
    js逆向递归 一个多维数组根据子节点ID查找所有父节点ID
  • 原文地址:https://www.cnblogs.com/Baron-Lu/p/13378664.html
Copyright © 2011-2022 走看看