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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1349|回復: 1
打印 上一主題 下一主題
收起左側

寄存器寫的stm32單片機驅動超聲波模塊,一直卡在檢測回響信號那里

[復制鏈接]
跳轉到指定樓層
樓主
寄存器寫的stm32驅動超聲波模塊,一直就在檢測上升沿電平那里出不來。用的串口獲得詳細數據,
已解決,模塊電壓問題,應接5V電壓,我接成3.3V,32搞長了,忘記當初做51時是5V供電了。
  1. //#include "stm32f10x.h"
  2. #include "led.h"
  3. #include "sys.h"
  4. #include "sysclock.h"
  5. #include "key.h"
  6. #include "exti.h"
  7. #include "time.h"
  8. #include "pwm.h"
  9. #include "usart.h"<div class="blockcode"><blockquote>#include"hc04.h"

  10. u8 msHcCount = 0;//ms計數

  11. void Hr_hc04_Init(void)        
  12. {
  13.         TIM2_Init(1000-1,72-1);//分頻系數72,循環1000次1000us
  14.         
  15.         RCC->APB1ENR |= 1<<6; //GPIOE時鐘使能
  16.         
  17.         GPIOE->CRL &= 0xfffff00f;//設置位重置 E1、E2
  18.         
  19.         //E1推挽輸出
  20.         GPIOE->CRL |= 0x1<<4;
  21.         //E2浮空輸入
  22.         GPIOE->CRL |= 0x4<<8;
  23.         
  24.         GPIOE->ODR|=~(1<<1);//E1一開始低電平
  25.         GPIOE->ODR|=~(1<<2);//E2一開始低電平
  26. }


  27. static void OpenTimer()        //打開定時器
  28. {
  29.   //清除計數器
  30.         TIM_SetCounter(TIM2,0);
  31.         msHcCount = 0;
  32.         TIM_Cmd(TIM2,ENABLE);//使能定時器
  33.         USARTx_Send_String(USART1,"定時器開啟\r\n");
  34. }

  35. static void CloseTimer()        //關閉定時器
  36. {
  37.        //        /*關閉計數器使能*/
  38.         TIM_Cmd(TIM2,DISABLE);
  39. }

  40. //獲取定時器時間
  41. u32 GetEchoTimer(void)
  42. {
  43.    u32 time = 0;
  44.         /*//當回響信號很長是,計數值溢出后重復計數,overCount用中斷來保存溢出次數*/
  45.         time = msHcCount*1000;//overCount每++一次,代表overCount毫秒,time微妙
  46.         time += TIM_GetCounter(TIM2);//獲取計TIM2數寄存器中的計數值,一邊計算回響信號時間
  47.         TIM6->CNT = 0;  //將TIM2計數寄存器的計數值清零
  48.         delay_ms(50);
  49.         USARTx_Send_String(USART1,"獲取定時器時間:");
  50.         USARTx_Send_number(USART1,time);
  51.         USARTx_Send_String(USART1,"\r\n");
  52.         return time;

  53. }

  54. /*
  55.                 trig_T = 1;//trig拉高信號,發出高電平
  56. //                GPIOE->ODR |= 1<<1;
  57.                 if((GPIOE->IDR & 0x0002));//echo等待回響
  58.                 {
  59.                         USARTx_Send_String(USART1,"trig_T置高位成功\r\n");
  60.                 }
  61.                 delay_us(20);//持續時間超過10us
  62. //                trig_T = 0;
  63.                 GPIOE->ODR |= ~(1<<1);
  64.                 USARTx_Send_String(USART1,"開啟信號已發出456\n");
  65.                 while(!(GPIOE->IDR & 0x0004))//echo等待回響
  66.                 {
  67.                         i++;
  68.                         if(i>=10000)
  69.                         {
  70.                                 USARTx_Send_String(USART1,"回響信號檢測失敗\n");
  71.                                 break;
  72.                         }
  73.                 }
  74.                 USARTx_Send_String(USART1,"等待結束,計時中789\r\n");
  75.                 delay_ms(50);
  76.                
  77.                
  78. */

  79. float Hcsr04GetLength(void )
  80. {
  81.         /*測5次數據計算一次平均值*/
  82.         float length = 0;
  83.         float t = 0;
  84.         float sum = 0;
  85.         u16          i = 0;
  86.         u16 ttt;
  87.         while(i != 5)
  88.         {
  89.                
  90.                 trig_T = 1;//trig拉高信號,發出高電平
  91. //                GPIOE->ODR |= 1<<1;
  92.                
  93.                 if((GPIOE->IDR & 0x0002));//echo等待回響
  94.                 {
  95.                         USARTx_Send_String(USART1,"trig_T置高位成功\r\n");
  96.                 }
  97.                 delay_us(20);//持續時間超過10us
  98.                
  99. //                trig_T = 0;
  100.                 GPIOE->ODR |= ~(1<<1);
  101.                 USARTx_Send_String(USART1,"開啟信號已發出\r\n");
  102.                
  103.                 /*Echo發出信號 等待回響信號*/
  104.                 /*輸入方波后,模塊會自動發射8個40KHz的聲波,與此同時回波引腳(echo)端的電平會由0變為1;
  105.                 (此時應該啟動定時器計時);當超聲波返回被模塊接收到時,回波引 腳端的電平會由1變為0;
  106.                 (此時應該停止定時器計數),定時器記下的這個時間即為
  107.                         超聲波由發射到返回的總時長;*/
  108. //                while(echo_R == 0);//echo等待回響
  109.                 while(!(GPIOE->IDR & 0x0004))//echo等待回響
  110.                 {
  111.                         ttt++;
  112.                         if(ttt>=50000)
  113.                         {
  114.                                 USARTx_Send_String(USART1,"回響信號檢測失敗\r\n");
  115.                                 break;
  116.                         }
  117.                 }
  118.                 USARTx_Send_String(USART1,"等待結束,計時中\r\n");
  119.                 /*開啟定時器*/
  120.                 OpenTimer();
  121.                 i = i+1; //每收到一次回響信號+1,收到5次就計算均值
  122. //                while(echo_R == 1);
  123.                 while((GPIOE->IDR & 0x0004))//echo等待回響
  124.                 {
  125.                         ttt++;
  126.                         if(ttt>=50000)
  127.                         {
  128.                                 USARTx_Send_String(USART1,"等待回響失敗\r\n");
  129.                                 break;
  130.                         }
  131.                 }
  132.                 /*關閉定時器*/
  133.                 CloseTimer();
  134.                 /*獲取Echo高電平時間時間*/
  135.                 t = GetEchoTimer();
  136.                 length = (float)t/58;//單位時cm
  137.                 sum += length;               
  138.         }
  139.         length = sum/5;//五次平均值
  140.         
  141.         return length;
  142. }

  143. void TIM2_IRQHandler(void)
  144. {
  145.         if(TIM2->SR &0X0001)//溢出中斷
  146.         {
  147.                 msHcCount++;
  148.                 TIM2->SR &=~(1<<0);//清除中斷標志位
  149.         }
  150. }


復制代碼
  1. #ifndef __hc04_h
  2. #define __hc04_h

  3. #include "sys.h"
  4. #include "stm32f10x.h"
  5. #include "time.h"
  6. #include "sysclock.h"
  7. #include "usart.h"

  8. #define trig_T  PEout(1)
  9. #define echo_R  PEin(2)

  10. void Hr_hc04_Init(void);
  11. float Hcsr04GetLength(void );


  12. #endif

復制代碼
  1. #include "time.h"



  2. //設置 TIMx 計數器寄存器值
  3. void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter)
  4. {

  5.   /* Set the Counter Register value */
  6.   TIMx->CNT = Counter;
  7. }



  8. //使能或者失能 TIMx 外設
  9. void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)
  10. {
  11.   
  12.   if (NewState != DISABLE)
  13.   {
  14.     /* Enable the TIM Counter */
  15.     TIMx->CR1 |= TIM_CR1_CEN;
  16.   }
  17.   else
  18.   {
  19.     /* Disable the TIM Counter */
  20.     TIMx->CR1 &= (uint16_t)(~((uint16_t)TIM_CR1_CEN));
  21.   }
  22. }



  23. //獲取計時次數
  24. uint16_t TIM_GetCounter(TIM_TypeDef* TIMx)
  25. {
  26.   return TIMx->CNT;
  27. }


  28. //自動裝載寄存器 (TIMx_ARR)
  29. //預分頻器寄存器 (TIMx_PSC)
  30. //AHB不分頻;APB2不分頻;APB1二分頻 APB1=72/2 TIM_CLk=72
  31. void TIM2_Init(u16 arr,u16 psc)
  32. {
  33.         RCC->APB1ENR|=1<<0;        //使能TIM2時鐘
  34.         
  35.         TIM2->PSC=psc;        //預分頻器寄存器
  36.         TIM2->ARR=arr;        //自動裝載寄存器
  37.         
  38.         TIM2->DIER|=1<<0;        //允許更新中斷
  39.         TIM2->DIER|=1<<6;        //使能觸發中斷
  40.         
  41. //        TIM2->CR1|=1<<0;        //使能計數器  //外部函數TIM_Cmd 實現
  42.         
  43.         NVIC_Init(2,1,TIM2_IRQn,2);
  44. }

  45. /*超聲波中設置
  46. void TIM2_IRQHandler(void)
  47. {
  48.         if(TIM2->SR &0X0001)//溢出中斷
  49.                 LED1=!LED1;
  50.         
  51.         TIM2->SR &=~(1<<0);//清除中斷標志位
  52. }

  53. */
復制代碼
  1. #ifndef _time_h
  2. #define _time_h
  3. #include "exti.h"
  4. #include "sysclock.h"

  5. void TIM2_Init(u16 arr,u16 psc);
  6. //設置 TIMx 計數器寄存器值
  7. void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter);
  8. //使能或者失能 TIMx 外設
  9. void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);
  10. //獲取計時次數
  11. uint16_t TIM_GetCounter(TIM_TypeDef* TIMx);

  12. #endif
復制代碼


#include "hc04.h"
int main()
{
        int temp=0;
        System_clock(9);
        SysTick_init(72);
        uart_init(72,9600);//時鐘頻率(Mhz) 波特率
        LED_Init();
//        TIM2_Init(1000-1,72-1);//分頻系數72,循環1000次1000us  //放在hc04.c里了
        Hr_hc04_Init();
        delay_ms(50);
        while(1)
  {
                delay_ms(500);
        
                USARTx_Send_String(USART1,"測試距離:123");
                delay_ms(10);
                temp=Hcsr04GetLength();
                delay_ms(10);
                USARTx_Send_number(USART1,temp);
                delay_ms(10);
                USARTx_Send_String(USART1,"cm\r\n");
                delay_ms(10);
                LED4=!LED4;
                delay_ms(10);
  }
}


void SystemInit(void)
{

}




20210226191003352.png (106.98 KB, 下載次數: 58)

20210226191003352.png

新建文件夾.7z

205.5 KB, 下載次數: 2

工程文件

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:997450 發表于 2022-10-22 21:00 | 只看該作者
實錘了,我是蠢貨,我給HC-SR04超聲波的供電一直是3.3V,怪不得卡在電平檢測環節。對于單片機來說,電平就是0和1,我的被卡住的電平檢測環節檢測的電平就是由我的超聲波模塊的echo引腳電平,模塊給單片機發送信號,由自身供電,本該接5V電壓,接了3.3V。供電不足,模塊發出的高電平信號可能就上不去,就一直是0而不是1了。這是我的個人理解,也許供電不足模塊根本無法工作,壓根沒開始。

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品1区2区 | 中文字幕视频在线观看 | 玖操| www.日日操| 成人二区 | 狠狠爱一区二区三区 | 在线免费小视频 | 日韩在线精品视频 | 亚洲男人的天堂网站 | 久久精品一区二区视频 | 国产精品久久久久久 | 1000部精品久久久久久久久 | 日日骚网 | 黑人久久久 | 高清亚洲| 中文字幕成人av | 亚洲午夜精品在线观看 | 成人免费一区二区 | 国产精品小视频在线观看 | 午夜电影网 | 丝袜久久| 精品欧美一区免费观看α√ | 久久精品国产一区二区三区不卡 | 久久在视频 | 国产极品粉嫩美女呻吟在线看人 | 中文字幕视频在线免费 | a级在线 | 久久久免费少妇高潮毛片 | 免费成人av | 国产精品视频一二三区 | 亚洲精品电影网在线观看 | 视频一区 国产精品 | 精品1区| 黄网站在线播放 | 在线观看视频一区 | 国产日韩一区二区三免费高清 | 91精品久久久久久久久中文字幕 | 91精品国产综合久久久久久丝袜 | 成人精品鲁一区一区二区 | 97精品超碰一区二区三区 | 成人精品毛片 |