基于ARM Cortex-M3的STM32系列嵌入式微控制器应用实践
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第4章 STM32单片机中断编程与机器人触觉导航

通过前面几章的学习,你已经掌握如何用单片机的I/O接口来控制机器人的各种运动。当时,连接机器人伺服电机的单片机端口是作为输出使用,而且使用非常简单。

本章你将学习如何使用这些端口来获取外界信息,即将STM32单片机端口作为输入端口使用。比如获取按键的信息进行人机交互,或给机器人小车增加触觉传感器判断是否碰到了障碍物。实际上,对于任何一个嵌入式系统,如自动控制系统,都可能需要通过传感器获取外界信息,由计算机或单片机根据反馈的信息进行计算和决策,生成控制命令,然后通过输出端口去控制系统相应的执行机构,完成相关任务。因此,学习如何使用STM32单片机的输入接口同学习使用输出接口同等重要。本章除了学习按键检测方法外,你还可以在机器人前端安装并测试一个称为胡须的触觉开关,通过编程来监视触觉开关的状态,以及决定当它遇到障碍物时如何动作。最终的结果就是通过触觉实现机器人自动导航。

4.1 TM32单片机按键输入检测

为了检测按键是否被按下,可以将按键与STM32单片机的I/O端口相连,电路图如图4.1所示。当有键按下是相应端口为低电平,没有键按下则为高电平。

图4.1 按键电路图

任务一 按键检测

下面这段代码的功能是当某个按键按下时,与之对应的发光二极管亮灭状态交替变化一次。PC8端口的KEY1键与PB8端口的发光二极管对应,PC9端口的KEY2键与PB9端口的发光二极管对应,PC10端口的KEY3键与PC12端口的发光二极管对应,PC11端口的KEY4键与PC13端口的发光二极管对应。

例程:KeyNoEINT.c

      #include "stm32f10x_heads.h"
      #include "HelloRobot.h"
      int main(void)
      {
        BSP_Init(); //开发板初始化函数
        USART_Configuration();
        printf("Program Running!\n");
        while (1)
        {
          if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_8)==0)
          {
            if(GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_8)==0)
              GPIO_SetBits(GPIOB, GPIO_Pin_8);
            else
              GPIO_ResetBits(GPIOB, GPIO_Pin_8);
          }
          if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_9)==0)
          {
            if(GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_9)==0)
              GPIO_SetBits(GPIOB, GPIO_Pin_9);
            else
              GPIO_ResetBits(GPIOB, GPIO_Pin_9);
          }
          if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_10)==0)
          {
            if(GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_12)==0)
              GPIO_SetBits(GPIOC, GPIO_Pin_12);
            else
              GPIO_ResetBits(GPIOC, GPIO_Pin_12);
          }
          if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_11)==0)
          {
            if(GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_13)==0)
              GPIO_SetBits(GPIOC, GPIO_Pin_13);
            else
              GPIO_ResetBits(GPIOC, GPIO_Pin_13);
          }
          delay_nms(120);
          }
      }

在GPIO配置函数GPIO_Configuration中,我们已将PC8、PC9、PC10、PC11设置为按键输入引脚,下面的代码是将PC11端口设置为浮空输入模式:

      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOC, &GPIO_InitStructure);

许多自动化机械都依赖于各种触觉型开关,如当机器人碰到障碍物时,接触开关就会察觉,通过编程让机器人躲开障碍物;旅客登机桥在靠近飞机时为了保护昂贵的飞机,在登机桥接口安装触须,当登机桥离飞机很近后触须就会碰到飞机,立即通知控制器提醒离飞机已经很近了,需要降低靠近速度;工厂利用触觉开关来计量生产线上的工件数量;在工业加工过程中,也被用来排列物体。在所有这些实例中,触觉开关提供的输入通过计算机或者单片机处理后生成其他形式的程序化的输出。