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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1654|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 天天干在线播放 | 欧美一区二区三区 | 看亚洲a级一级毛片 | 日韩在线看片 | 国产综合久久久 | 日韩精品在线网站 | 黄色国产大片 | 成人在线一区二区 | 一区二区高清不卡 | 欧美一级在线观看 | 国产在线观看av | 国产高清精品在线 | 亚洲一区电影 | 国产精品伦一区二区三级视频 | 国产丝袜一区二区三区免费视频 | 成人亚洲片 | 久久精品视频播放 | 国产精品久久久久久久久久三级 | 免费黄色的视频 | 美女黄18岁以下禁止观看 | 久久久久久亚洲欧洲 | 成人永久免费视频 | 欧美激情黄色 | 免费啪啪| 欧美日韩一卡二卡 | 精品中文字幕一区二区 | 一区二区高清 | 91大神在线资源观看无广告 | 成人午夜在线观看 | 色资源站| 亚洲国产精品一区二区三区 | 天天插日日操 | 日韩中文一区 | 国产精品69av | 久久av网 | 亚洲一区二区在线播放 | 欧美精品久久 | 9久久精品 | 国产精品视频不卡 | 亚洲成av | 中文字幕一区在线观看视频 |