你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【年中粉丝节】+超声波距离传感器

[复制链接]
liuxingkeji 发布时间:2021-6-10 22:29
【年中粉丝节】+超声波距离传感器
今天分享下板子上比较大的传感器,就是超声波距离传感器。使用超声波距离传感器就比较简单了。
1.png
首先看下超声波测距传感器的原理,一端发射声波,当声波被物体阻挡就会反射回来。被接收端收到,只要我们算好这中间的时间差,加上声音传播速度就能算出距离,有如下公式:
2.png
3.png
原理图是这样的比较负责了,用了一个555定时器产生38Khz的方波,接收端其实是使用了一个CX20106A的红外解码芯片,其实这样是频率对上了,之后是为了程序方便,初始化一个定时器中断,每10US中断一次,然后把接收端也放一个中断,这样,开始发射时计数清空,然后定时器中断计数,这样来算时间,之后通过IO中断,来判断接收到了。在根据上面公式就能算出距离了。
  1. void Ultrasonic_Port()
  2. {
  3.        GPIO_InitTypeDef GPIO_InitStructure;
  4.         
  5.        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);
  6.        RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
  7.   //改变指定管脚的映射  GPIO_Remap_SWJ_JTAGDisable  JTAG-DP 失能 + SW-DP使能
  8.    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
  9.        //PB6-SCL  PC2-ADDR
  10.        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //PA15
  11.        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  12.        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //复用推挽输出
  13.        GPIO_Init(GPIOA, &GPIO_InitStructure);
  14.       
  15.        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  16.        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  17.        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  18.        GPIO_Init(GPIOB,&GPIO_InitStructure);
  19. }
  20. void Ultrasonic_TIM(uint16_t arr,uint16_t psc)
  21. {
  22.       
  23.        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  24.        NVIC_InitTypeDef NVIC_InitStructure;
  25.        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
  26.       
  27.        //定时器TIM3初始化
  28.        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
  29.        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
  30.        //TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
  31.        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
  32.        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
  33.        //中断优先级NVIC设置
  34.        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
  35.        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
  36.        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 8;  //从优先级3级
  37.        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
  38.        NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器
  39.        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
  40.        TIM_Cmd(TIM3, DISABLE);  //使能TIMx         
  41. }
  42. void Ultrasonic_EXTI()
  43. {
  44.        EXTI_InitTypeDef EXTI_InitStructure;
  45.       NVIC_InitTypeDef NVIC_InitStructure;
  46.       
  47.        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  48.       
  49.       RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能复用功能时钟
  50.     //GPIOE.2 中断线以及中断初始化配置   下降沿触发
  51.       GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource8);
  52.       EXTI_InitStructure.EXTI_Line=EXTI_Line8;    //KEY2
  53.       EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;   
  54.       EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  55.       EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  56.       EXTI_Init(&EXTI_InitStructure);           //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
  57.       
  58.        NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;                  //使能按键KEY2所在的外部中断通道
  59.       NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级2,
  60.       NVIC_InitStructure.NVIC_IRQChannelSubPriority = 7;                                  //子优先级2
  61.       NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                      //使能外部中断通道
  62.       NVIC_Init(&NVIC_InitStructure);
  63. }
  64. void Ultrasonic_Init()
  65. {
  66.        Ultrasonic_Port();
  67.        Ultrasonic_TIM(9,71);//10us
  68.        Ultrasonic_EXTI();
  69. }
  70. //超声波测距
  71. void Ultrasonic_Ranging()
  72. {
  73.     INC = 1;               //关发射         
  74.        delay_us(3);
  75.     INC = 0;
  76.        TIM_Cmd(TIM3,ENABLE);
  77.        //EXTI_ClearITPendingBit(EXTI_Line4);
  78.        TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
  79.       
  80.     Ultrasonic_Num  = 0;                // 定时器清零
  81.        delay_ms(30);               //等待一段时间,等待发送超声波控制信号
  82.        INC = 1;
  83.        delay_ms(5);
  84. }
  85. //定时器3中断服务程序
  86. void TIM3_IRQHandler(void)   //TIM3中断
  87. {
  88.        if (TIM_GetITStatus(TIM3, TIM_IT_Update) == SET)  //检查TIM3更新中断发生与否
  89.        {
  90.               Ultrasonic_Num++;
  91.        }
  92.        TIM_ClearITPendingBit(TIM3, TIM_IT_Update);  //清除TIMx更新中断标志
  93. }
  94. //外部中断2服务程序
  95. void EXTI9_5_IRQHandler(void)
  96. {
  97.        if(EXTI_GetITStatus(EXTI_Line8) == SET)
  98.        {
  99.               if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8) == RESET)
  100.               {     
  101.                      TIM_Cmd(TIM3,DISABLE);
  102.                      Ultrasonic_Value = Ultrasonic_Num;
  103.                      Ultrasonic_Value =(float)Ultrasonic_Value*1.73;       // 计算距离定时10us,S=Vt/2(减2是误差补尝)
  104.                      dis = (uint16_t)Ultrasonic_Value;
  105.               }
  106.               EXTI_ClearITPendingBit(EXTI_Line8);
  107.        }              
  108. }
复制代码
4.png
实际测算还是会有点误差的。
收藏 评论0 发布时间:2021-6-10 22:29

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版