|
寄存器寫的stm32驅動超聲波模塊,一直就在檢測上升沿電平那里出不來。用的串口獲得詳細數據,
已解決,模塊電壓問題,應接5V電壓,我接成3.3V,32搞長了,忘記當初做51時是5V供電了。
- //#include "stm32f10x.h"
- #include "led.h"
- #include "sys.h"
- #include "sysclock.h"
- #include "key.h"
- #include "exti.h"
- #include "time.h"
- #include "pwm.h"
- #include "usart.h"<div class="blockcode"><blockquote>#include"hc04.h"
- u8 msHcCount = 0;//ms計數
- void Hr_hc04_Init(void)
- {
- TIM2_Init(1000-1,72-1);//分頻系數72,循環1000次1000us
-
- RCC->APB1ENR |= 1<<6; //GPIOE時鐘使能
-
- GPIOE->CRL &= 0xfffff00f;//設置位重置 E1、E2
-
- //E1推挽輸出
- GPIOE->CRL |= 0x1<<4;
- //E2浮空輸入
- GPIOE->CRL |= 0x4<<8;
-
- GPIOE->ODR|=~(1<<1);//E1一開始低電平
- GPIOE->ODR|=~(1<<2);//E2一開始低電平
- }
- static void OpenTimer() //打開定時器
- {
- //清除計數器
- TIM_SetCounter(TIM2,0);
- msHcCount = 0;
- TIM_Cmd(TIM2,ENABLE);//使能定時器
- USARTx_Send_String(USART1,"定時器開啟\r\n");
- }
-
- static void CloseTimer() //關閉定時器
- {
- // /*關閉計數器使能*/
- TIM_Cmd(TIM2,DISABLE);
- }
- //獲取定時器時間
- u32 GetEchoTimer(void)
- {
- u32 time = 0;
- /*//當回響信號很長是,計數值溢出后重復計數,overCount用中斷來保存溢出次數*/
- time = msHcCount*1000;//overCount每++一次,代表overCount毫秒,time微妙
- time += TIM_GetCounter(TIM2);//獲取計TIM2數寄存器中的計數值,一邊計算回響信號時間
- TIM6->CNT = 0; //將TIM2計數寄存器的計數值清零
- delay_ms(50);
- USARTx_Send_String(USART1,"獲取定時器時間:");
- USARTx_Send_number(USART1,time);
- USARTx_Send_String(USART1,"\r\n");
- return time;
-
- }
- /*
- trig_T = 1;//trig拉高信號,發出高電平
- // GPIOE->ODR |= 1<<1;
- if((GPIOE->IDR & 0x0002));//echo等待回響
- {
- USARTx_Send_String(USART1,"trig_T置高位成功\r\n");
- }
- delay_us(20);//持續時間超過10us
- // trig_T = 0;
- GPIOE->ODR |= ~(1<<1);
- USARTx_Send_String(USART1,"開啟信號已發出456\n");
- while(!(GPIOE->IDR & 0x0004))//echo等待回響
- {
- i++;
- if(i>=10000)
- {
- USARTx_Send_String(USART1,"回響信號檢測失敗\n");
- break;
- }
- }
- USARTx_Send_String(USART1,"等待結束,計時中789\r\n");
- delay_ms(50);
-
-
- */
- float Hcsr04GetLength(void )
- {
- /*測5次數據計算一次平均值*/
- float length = 0;
- float t = 0;
- float sum = 0;
- u16 i = 0;
- u16 ttt;
- while(i != 5)
- {
-
- trig_T = 1;//trig拉高信號,發出高電平
- // GPIOE->ODR |= 1<<1;
-
- if((GPIOE->IDR & 0x0002));//echo等待回響
- {
- USARTx_Send_String(USART1,"trig_T置高位成功\r\n");
- }
- delay_us(20);//持續時間超過10us
-
- // trig_T = 0;
- GPIOE->ODR |= ~(1<<1);
- USARTx_Send_String(USART1,"開啟信號已發出\r\n");
-
- /*Echo發出信號 等待回響信號*/
- /*輸入方波后,模塊會自動發射8個40KHz的聲波,與此同時回波引腳(echo)端的電平會由0變為1;
- (此時應該啟動定時器計時);當超聲波返回被模塊接收到時,回波引 腳端的電平會由1變為0;
- (此時應該停止定時器計數),定時器記下的這個時間即為
- 超聲波由發射到返回的總時長;*/
- // while(echo_R == 0);//echo等待回響
- while(!(GPIOE->IDR & 0x0004))//echo等待回響
- {
- ttt++;
- if(ttt>=50000)
- {
- USARTx_Send_String(USART1,"回響信號檢測失敗\r\n");
- break;
- }
- }
- USARTx_Send_String(USART1,"等待結束,計時中\r\n");
- /*開啟定時器*/
- OpenTimer();
- i = i+1; //每收到一次回響信號+1,收到5次就計算均值
- // while(echo_R == 1);
- while((GPIOE->IDR & 0x0004))//echo等待回響
- {
- ttt++;
- if(ttt>=50000)
- {
- USARTx_Send_String(USART1,"等待回響失敗\r\n");
- break;
- }
- }
- /*關閉定時器*/
- CloseTimer();
- /*獲取Echo高電平時間時間*/
- t = GetEchoTimer();
- length = (float)t/58;//單位時cm
- sum += length;
- }
- length = sum/5;//五次平均值
-
- return length;
- }
- void TIM2_IRQHandler(void)
- {
- if(TIM2->SR &0X0001)//溢出中斷
- {
- msHcCount++;
- TIM2->SR &=~(1<<0);//清除中斷標志位
- }
- }
復制代碼- #ifndef __hc04_h
- #define __hc04_h
- #include "sys.h"
- #include "stm32f10x.h"
- #include "time.h"
- #include "sysclock.h"
- #include "usart.h"
- #define trig_T PEout(1)
- #define echo_R PEin(2)
- void Hr_hc04_Init(void);
- float Hcsr04GetLength(void );
- #endif
復制代碼- #include "time.h"
- //設置 TIMx 計數器寄存器值
- void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter)
- {
- /* Set the Counter Register value */
- TIMx->CNT = Counter;
- }
- //使能或者失能 TIMx 外設
- void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)
- {
-
- if (NewState != DISABLE)
- {
- /* Enable the TIM Counter */
- TIMx->CR1 |= TIM_CR1_CEN;
- }
- else
- {
- /* Disable the TIM Counter */
- TIMx->CR1 &= (uint16_t)(~((uint16_t)TIM_CR1_CEN));
- }
- }
- //獲取計時次數
- uint16_t TIM_GetCounter(TIM_TypeDef* TIMx)
- {
- return TIMx->CNT;
- }
- //自動裝載寄存器 (TIMx_ARR)
- //預分頻器寄存器 (TIMx_PSC)
- //AHB不分頻;APB2不分頻;APB1二分頻 APB1=72/2 TIM_CLk=72
- void TIM2_Init(u16 arr,u16 psc)
- {
- RCC->APB1ENR|=1<<0; //使能TIM2時鐘
-
- TIM2->PSC=psc; //預分頻器寄存器
- TIM2->ARR=arr; //自動裝載寄存器
-
- TIM2->DIER|=1<<0; //允許更新中斷
- TIM2->DIER|=1<<6; //使能觸發中斷
-
- // TIM2->CR1|=1<<0; //使能計數器 //外部函數TIM_Cmd 實現
-
- NVIC_Init(2,1,TIM2_IRQn,2);
- }
- /*超聲波中設置
- void TIM2_IRQHandler(void)
- {
- if(TIM2->SR &0X0001)//溢出中斷
- LED1=!LED1;
-
- TIM2->SR &=~(1<<0);//清除中斷標志位
- }
- */
復制代碼- #ifndef _time_h
- #define _time_h
- #include "exti.h"
- #include "sysclock.h"
- void TIM2_Init(u16 arr,u16 psc);
- //設置 TIMx 計數器寄存器值
- void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter);
- //使能或者失能 TIMx 外設
- void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);
- //獲取計時次數
- uint16_t TIM_GetCounter(TIM_TypeDef* TIMx);
- #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)
{
}
|
|