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)实验结果:按下开关,串口打印出碰撞开关的编号