《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 InitBumpervoid)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    
      //Bumper LeftPD8) MiddlePB15) RightPB14)

      //Config Clock 配置时钟
    RCC_APB2PeriphClockCmdRCC_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_InitGPIOB, &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_InitGPIOD, &GPIO_InitStruct);//传入结构GPIO_InitStruct,配置GPIOD
}

2)传感器数据更新函数

void BumperUpdatevoid)
{
    static u8 lastBumperStatus=0;//上一次碰撞传感器状态
    static u8 lastPrintfStatus=0;//上次打印时碰撞传感器状态
    u8 currBumperStatus =0;      //当前碰撞传感器状态
    //_BumperStatus bit2-0:LeftPD8) MiddlePB15) RightPB14)
    //Bumper LeftPD8) MiddlePB15) RightPB14)
    
    ifGPIO_ReadInputDataBitGPIOD,GPIO_Pin_8)) {currBumperStatus&=0xFB;}else {currBumperStatus|=0x04;}//若PD8高电平,碰撞没被按下,则将currBumperStatus第3位设0,否则将currBumperStatus第3位设1
    ifGPIO_ReadInputDataBitGPIOB,GPIO_Pin_15)){currBumperStatus&=0xFD;}else {currBumperStatus|=0x02;}
    ifGPIO_ReadInputDataBitGPIOB,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 mainvoid)
{        
    NVIC_PriorityGroupConfigNVIC_PriorityGroup_2); //PriorityGroupConfig NVIC中断分组设置 组22位抢占优先级,2位响应优先级)
    initDebugSerial500000);//初始化调试串口USART1,波特率500000
    initSysTick);//初始化滴答定时器和TIM4定时器
    showVersion);//显示版本
    InitBumper); //初始化 BUMP1-3
    
    while1)
    {
      BumperUpdate);//更新
        delay_ms10);//间隔10ms,消除抖动影响
    }
}

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

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注