久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

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

作者: xiaozi1111    時(shí)間: 2018-10-9 17:40
標(biāo)題: stm32超聲波模塊測距
/******************** *******************************************************
* 文件名  : UltrasonicWave.c
* 描述    :超聲波測距模塊,
                                                初始化 Ultrasonic_Init()
            UltrasonicWave_StartMeasure 發(fā)送超聲波啟動
                                                返回中斷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類型源參數(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:自動重裝值。 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è)更新事件裝入活動的自動重裝載寄存器周期的值         計(jì)數(shù)到5000為500ms
        TIM_TimeBaseStructure.TIM_Prescaler                 =         (psc-1);                                                        //設(shè)置用來作為TIMx時(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以及記錄高電平(返回信號)時(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.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 日韩高清不卡 | 黄视频欧美 | 在线91 | 中文字幕在线观看av | 天天操夜夜艹 | 亚洲欧美日韩在线一区二区 | 精品久草 | 91精品中文字幕一区二区三区 | 一区二区三区视频在线 | 亚洲精品在线免费看 | 国产三区av | 成人午夜影院 | www.中文字幕.com | 在线观看电影av | www.成人在线视频 | 亚洲视频中文字幕 | 欧美国产日韩在线观看 | 伊人久久麻豆 | 国产精品亚洲欧美日韩一区在线 | 国产精品人人做人人爽 | 免费国产视频 | 亚洲精品免费观看 | 91动漫在线观看 | 精品视频99 | av首页在线| 亚洲欧美日本国产 | 久久久久高清 | 精品国产一区二区三区性色 | www午夜视频 | 欧美在线视频一区二区 | 精品亚洲一区二区三区四区五区 | 婷婷久久久久 | 在线亚洲人成电影网站色www | 国产一区二区三区久久久久久久久 | 久久久久久久久久久福利观看 | 户外露出一区二区三区 | 91精品欧美久久久久久久 | 精品九九九| 一区二区三区四区五区在线视频 | 欧美黄色一区 | 国产伊人精品 |