找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1665|回复: 0
打印 上一主题 下一主题
收起左侧

stm32超声波模块测距

[复制链接]
跳转到指定楼层
楼主
ID:283304 发表于 2018-10-9 17:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/******************** *******************************************************
* 文件名  : UltrasonicWave.c
* 描述    :超声波测距模块,
                                                初始化 Ultrasonic_Init()
            UltrasonicWave_StartMeasure 发送超声波启动
                                                返回中断Echo中得到高电平时间,从而获取距离
                                                exti ISR 中调ultrasonic_calculate();
                                                注意本模块使用到timer2
*********************************************************************************/

struct UltrasonicDefine U_GPIO_Define;
volatile uint16_t ultrasonic_wave_measure_data;
/*************************************************************
  Function   :Ultrasonic_Config  
  Description:超声波的引脚配置
  Input      : UltrasonicDefine类型源参数   
  return     : none
*************************************************************/
void ultrasonic_configuratioin(struct UltrasonicDefine defines)
{
        struct UltrasonicDefine def = defines;
        GPIO_InitTypeDef GPIO_InitStructure;       
        EXTI_InitTypeDef EXTI_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
        U_GPIO_Define = defines;       

  GPIO_InitStructure.GPIO_Pin   = def.pin_of_trig;                                         
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;         
  GPIO_Init(def.pin_of_trig_group, &GPIO_InitStructure);                         

  GPIO_InitStructure.GPIO_Pin  = def.pin_of_echo;                                    
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
  GPIO_Init(def.pin_of_echo_group, &GPIO_InitStructure);                                                 

  SYSCFG_EXTILineConfig(def.gpio_portsource, def.gpio_pinsource);

        EXTI_InitStructure.EXTI_Line    = def.exit_line_no;
  EXTI_InitStructure.EXTI_Mode    = EXTI_Mode_Interrupt;       
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);       
               
        NVIC_InitStructure.NVIC_IRQChannel                   = def.irqn;                       
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;       
  NVIC_InitStructure.NVIC_IRQChannelSubPriority        = 0;                                       
  NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;                                                               
  NVIC_Init(&NVIC_InitStructure);           
}

/*************************************************************
  Function   :Timer2_Init  
  Description:通用定时器中断初始化 这里使用的是TIM2 系统时钟system_sclk是16MHZ
  Input      : arr:自动重装值。 psc:时钟预分频数      
  return     : none   
*************************************************************/
static void timer2_init(uint16_t arr,uint16_t psc)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

        TIM_TimeBaseStructure.TIM_Period                                 =  arr;                                                                 //设置在下一个更新事件装入活动的自动重装载寄存器周期的值         计数到5000为500ms
        TIM_TimeBaseStructure.TIM_Prescaler                 =         (psc-1);                                                        //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率  
        TIM_TimeBaseStructure.TIM_ClockDivision =  TIM_CKD_DIV1;                                 //设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode         =  TIM_CounterMode_Up;  //TIM向上计数模式
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);                                                                
}
/*************************************************************
  Function   :Ultrasonic_Init  
  Description:初始化 Ultrasonic Module Pins以及记录高电平(返回信号)时间的timer 初始化
  Input      : none        
  return     : none   
*************************************************************/
void ultrasonic_init(void)
{       
        timer2_init(5000, 3200);                          //500ms  for sysclk = 32MHz
}       

/*************************************************************
  Function   :UltrasonicWave_StartMeasure  
  Description:发送一个大于10us的高电平
                                |--------|
        ------|        |------  > 10us
  Input      : none   
  return     : none
*************************************************************/
void ultrasonicWave_startMeasure(void)
{
  GPIO_SetBits(U_GPIO_Define.pin_of_trig_group,U_GPIO_Define.pin_of_trig);                   //送>10US的高电平
  Delay_nus(15);                                      //延时15US
  GPIO_ResetBits(U_GPIO_Define.pin_of_trig_group,U_GPIO_Define.pin_of_trig);
}
/*************************************************************
  Function   :Ultrasonic_GetData  
  Description:统计返回echo的高电平时间,得到距离的精度是17mm
  Input      : none   
  return     : 得到的距离,单位是mm   
*************************************************************/
uint16_t ultrasonic_calculate(void)
{
                uint16_t UltrasonicWave_Distance;                                                             
       
                TIM_SetCounter( TIM2, 0 );
                TIM_Cmd( TIM2, ENABLE );                              
                while(GPIO_ReadInputDataBit( U_GPIO_Define.pin_of_echo_group,
                                U_GPIO_Define.pin_of_echo ) );                          
                TIM_Cmd( TIM2, DISABLE );                                               
                UltrasonicWave_Distance = TIM_GetCounter(TIM2)*17;       
                return UltrasonicWave_Distance;
}


uint16_t ultrasonic_wave_get_result(void)
{
        return ultrasonic_wave_measure_data;
}


void clear_last_measure_result(void)
{
        ultrasonic_wave_measure_data = 0;
}       

void ultrasonic_wave_test(void)
{
        uint16_t distance_ultrasonic;
       
        distance_ultrasonic = ultrasonic_wave_get_result();       
        {               
                printf("get ultrasonic wave distance : %d \n", distance_ultrasonic);
                OLED_ShowString(10, 0, "Ultra"  );
                OLED_ShowString(0 , 2, "Distance:(mm)" );
                OLED_ShowNum   (50, 4, distance_ultrasonic , 3, 16);
                clear_last_measure_result();
        }
        ultrasonicWave_startMeasure();
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表