1024手机基地看电影,午夜福利视频导航,国产精品福利在线一区,亚洲欧美日韩另类成人,在线观看午夜日本理论片,成年超爽免费网站,国产精品成人免费,精品动作一级毛片,成人免费观看网站,97精品伊人久久大香蕉

標(biāo)題: stm32超聲波模塊測(cè)距 [打印本頁(yè)]

作者: xiaozi1111    時(shí)間: 2018-10-9 17:40
標(biāo)題: stm32超聲波模塊測(cè)距
/******************** *******************************************************
* 文件名  : UltrasonicWave.c
* 描述    :超聲波測(cè)距模塊,
                                                初始化 Ultrasonic_Init()
            UltrasonicWave_StartMeasure 發(fā)送超聲波啟動(dòng)
                                                返回中斷Echo中得到高電平時(shí)間,從而獲取距離
                                                exti ISR 中調(diào)ultrasonic_calculate();
                                                注意本模塊使用到timer2
*********************************************************************************/

struct UltrasonicDefine U_GPIO_Define;
volatile uint16_t ultrasonic_wave_measure_data;
/*************************************************************
  Function   :Ultrasonic_Config  
  Description:超聲波的引腳配置
  Input      : UltrasonicDefine類(lèi)型源參數(shù)   
  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:通用定時(shí)器中斷初始化 這里使用的是TIM2 系統(tǒng)時(shí)鐘system_sclk是16MHZ
  Input      : arr:自動(dòng)重裝值。 psc:時(shí)鐘預(yù)分頻數(shù)      
  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;                                                                 //設(shè)置在下一個(gè)更新事件裝入活動(dòng)的自動(dòng)重裝載寄存器周期的值         計(jì)數(shù)到5000為500ms
        TIM_TimeBaseStructure.TIM_Prescaler                 =         (psc-1);                                                        //設(shè)置用來(lái)作為T(mén)IMx時(shí)鐘頻率除數(shù)的預(yù)分頻值  10Khz的計(jì)數(shù)頻率  
        TIM_TimeBaseStructure.TIM_ClockDivision =  TIM_CKD_DIV1;                                 //設(shè)置時(shí)鐘分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode         =  TIM_CounterMode_Up;  //TIM向上計(jì)數(shù)模式
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);                                                                
}
/*************************************************************
  Function   :Ultrasonic_Init  
  Description:初始化 Ultrasonic Module Pins以及記錄高電平(返回信號(hào))時(shí)間的timer 初始化
  Input      : none        
  return     : none   
*************************************************************/
void ultrasonic_init(void)
{       
        timer2_init(5000, 3200);                          //500ms  for sysclk = 32MHz
}       

/*************************************************************
  Function   :UltrasonicWave_StartMeasure  
  Description:發(fā)送一個(gè)大于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);                                      //延時(shí)15US
  GPIO_ResetBits(U_GPIO_Define.pin_of_trig_group,U_GPIO_Define.pin_of_trig);
}
/*************************************************************
  Function   :Ultrasonic_GetData  
  Description:統(tǒng)計(jì)返回echo的高電平時(shí)間,得到距離的精度是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();
}







歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1