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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2742|回復(fù): 7
打印 上一主題 下一主題
收起左側(cè)

為什么stm32f103不能驅(qū)動(dòng)超聲波模塊hcsr04?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "hcsr04.h"


        

int main(void)
{        
         float length;
                 delay_init();                     //延時(shí)函數(shù)初始化         
         uart_init(115200);         //串口初始化為115200
         HCSR04_Init();
         printf("超聲波初始化成功");//檢測(cè)超聲波是否初始化
   length=gettime();
         printf("距離為:%.3f cm\n",length);//打印總的距離        
        
        
}        
//以上是主函數(shù)模塊
#include "hcsr04.h"
#include "delay.h"

u16 msHcCount =0;
void HCSR04_Init(void)
{
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        GPIO_InitTypeDef  GPIO_InitStructure;
        
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);         //使能PB端口時(shí)鐘
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;                                 //PB.13 端口配置
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽輸出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度為50MHz
        GPIO_Init(GPIOB, &GPIO_InitStructure);                                         //根據(jù)設(shè)定參數(shù)初始化GPIOB.13

                        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;                                 //PB.14 端口配置
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;                  //下拉輸入
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度為50MHz
        GPIO_Init(GPIOB, &GPIO_InitStructure);                                         //根據(jù)設(shè)定參數(shù)初始化GPIOB.14

        
                //定時(shí)器TIM3初始化
        TIM_TimeBaseStructure.TIM_Period =10000-1; //設(shè)置在下一個(gè)更新事件裝入活動(dòng)的自動(dòng)重裝載寄存器周期的值        
        TIM_TimeBaseStructure.TIM_Prescaler =7200-1; //設(shè)置用來作為TIMx時(shí)鐘頻率除數(shù)的預(yù)分頻值
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設(shè)置時(shí)鐘分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上計(jì)數(shù)模式
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根據(jù)指定的參數(shù)初始化TIMx的時(shí)間基數(shù)單位

        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中斷,允許更新中斷

        //中斷優(yōu)先級(jí)NVIC設(shè)置
               
        
        TIM_ClearFlag(TIM3,TIM_FLAG_Update);
        TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);
        hcsr04_NVIC();
        TIM_Cmd(TIM3,ENABLE);
}

static void opentimerhc()
{
        TIM_SetCounter(TIM2,0);
        msHcCount=0;
        TIM_Cmd (TIM2,ENABLE);
}        
static void closeimerhc()
{
        TIM_Cmd(TIM2,DISABLE);
}
        
        
void hcsr04_NVIC(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí)

//         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí)
        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中斷
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  //先占優(yōu)先級(jí)1級(jí)
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //從優(yōu)先級(jí)0級(jí)
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
        NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器

}


void TIM3_IRQHandler(void)   //TIM3中斷
{
        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //檢查TIM3更新中斷發(fā)生與否
                {
                        TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中斷標(biāo)志
                        msHcCount++;
                }
               
}
u32 gettime(void)//時(shí)間獲取函數(shù)
{
u32 t=0;
        t=msHcCount*1000;
        t+=TIM_GetCounter(TIM2);
        TIM2->CNT=0;
        delay_ms(50);
}
float hcgetlength(void)
{
u32 t=0;
        int i=0;
        float lengthTemp=0;
        float sum=0;
        while(i!=5)
        {
                GPIO_ResetBits(GPIOB,GPIO_Pin_13);                //預(yù)拉低trig引腳
                delay_ms(20);
                GPIO_SetBits(GPIOB,GPIO_Pin_13);
                delay_ms(20);
                GPIO_ResetBits(GPIOB,GPIO_Pin_13);//發(fā)出脈沖
                while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==0)//等待信號(hào)發(fā)出,信號(hào)發(fā)出,計(jì)數(shù)器置0,同時(shí)變?yōu)楦唠娖?br />                 {
                        opentimerhc();
                        i=i+1;
                }        
                while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==1)//等待信號(hào)接收,信號(hào)發(fā)出時(shí),引腳一直置1
                {
                        closeimerhc();
                        t=gettime();
                        lengthTemp=((float)t*170/1000);
                        sum=lengthTemp+sum;
                }        
        lengthTemp=sum/5.0;
                return lengthTemp;
        }
}
這是超聲波模塊


是程序?qū)戝e(cuò)了嗎?
如果有人能指出錯(cuò)誤,請(qǐng)私我
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:57657 發(fā)表于 2021-8-12 17:46 | 只看該作者
具體請(qǐng)用邏輯分析儀檢測(cè)一下波形、時(shí)序是否正確。
回復(fù)

使用道具 舉報(bào)

板凳
ID:592807 發(fā)表于 2021-8-13 13:38 | 只看該作者

   length=gettime();
  printf("距離為:%.3f cm\n",length);//打印總的距離

u32 gettime(void)//時(shí)間獲取函數(shù)
{
u32 t=0;
        t=msHcCount*1000;
        t+=TIM_GetCounter(TIM2);
        TIM2->CNT=0;
        delay_ms(50);
}
沒有renturn數(shù)值  你獲取時(shí)間獲取了個(gè)寂寞
回復(fù)

使用道具 舉報(bào)

地板
ID:660005 發(fā)表于 2021-8-13 16:33 | 只看該作者
黃youhui 發(fā)表于 2021-8-13 13:38
length=gettime();
  printf("距離為:%.3f cm\n",length);//打印總的距離

就算加上return t,串口助手還是沒得反應(yīng)
回復(fù)

使用道具 舉報(bào)

5#
ID:660005 發(fā)表于 2021-8-13 16:34 | 只看該作者
黃youhui 發(fā)表于 2021-8-13 13:38
length=gettime();
  printf("距離為:%.3f cm\n",length);//打印總的距離

這個(gè)連最開始的“超聲波初始化”都沒得!
回復(fù)

使用道具 舉報(bào)

6#
ID:592807 發(fā)表于 2021-8-13 20:32 | 只看該作者
123689 發(fā)表于 2021-8-13 16:34
這個(gè)連最開始的“超聲波初始化”都沒得!

我找時(shí)間試一下。買了買還用

P10813-202936.jpg (2.46 MB, 下載次數(shù): 114)

P10813-202936.jpg
回復(fù)

使用道具 舉報(bào)

7#
ID:592807 發(fā)表于 2021-8-14 12:29 | 只看該作者


u8 combuff[2048];
u8 combuff1[2048];


int main(void)
{
        double cm_length = 0;
        u8 i = 0;
       
        delay_init();
        USART1_Init(9600);
        TIM3_Init(1,1);//1ms
        TIM16_Init(1,1);//1ms
        HC_RC04_Init();
        while(1)
        {
                delay_ms(1000);delay_ms(1000);delay_ms(1000);delay_ms(1000);delay_ms(1000);
                for(i = 0;i<5;i++)
                {
                        cm_length += (Start_HC_RC04()/5);
                }
//length * 2 /340
                cm_length = (cm_length / 170) * 100;
                u1_printf("距離 = %1f\r\n",cm_length);
                cm_length=0;
                delay_ms(1000);delay_ms(1000);delay_ms(1000);delay_ms(1000);delay_ms(1000);               
        }
}


/*
GPIO        初始化
VCC = 3.3V
GND = 0V
TRIG = PA7   
ECHO = PA6   
*/


void HC_RC04_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
       
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);  //使能GPIOA的時(shí)鐘
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_Init(GPIOA, &GPIO_InitStructure);


        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_Init(GPIOA, &GPIO_InitStructure);


}


u16 msHC_RC04;


/*
1ms中斷
*/
void TIM3_IRQHandler(void)
{
        u8 i;
       
  if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
  {
                msHC_RC04+=1;


    TIM_ClearFlag(TIM3, TIM_FLAG_Update);       
               
        }

}
/*
ECHO(PA6) 先確保        ECH處于低電平
TRIG(PA7) 先拉高20us以上、
ECHO (PA6)  電平被拉高后開啟定時(shí)器
ECHO (PA6)  電平拉低后關(guān)閉定時(shí)器并且讀取時(shí)間


測(cè)試距離 = (高電平時(shí)間(S) * 340M/S)/2
模塊測(cè)距范圍2-400cm
因此高電平時(shí)間范圍0.1ms - 23ms


*/
u32 Start_HC_RC04(void)
{
        u16 time_out = 0;
        u32 usTime = 0;
       
        GPIO_ResetBits(GPIOA,GPIO_Pin_7);
        delay_us(20);
        while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6) != 0)
                {
                        delay_ms(1);
                        time_out += 1;
                        if(time_out >= 1000)
                                u1_printf("超時(shí)\r\t");
                                return 0;               
                }
               
                GPIO_SetBits(GPIOA,GPIO_Pin_7);
                delay_us(20);
                GPIO_ResetBits(GPIOA,GPIO_Pin_7);//觸發(fā)信號(hào)
                while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6) == 0)
                {
                        ;
                }
               
                msHC_RC04 = 0;
                TIM_Cmd(TIM3, ENABLE);
                while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6) == 1)
                {
                        ;
                }
                TIM_Cmd(TIM3, DISABLE);
                usTime = msHC_RC04 * 1000;
                usTime += (TIM_GetCounter(TIM3)*100);//時(shí)鐘1S 10000節(jié)拍。1節(jié)拍0.1ms 100us
                TIM1->CNT = 0;
               
                return usTime;
               




}








時(shí)間和距離的轉(zhuǎn)換沒您好,也沒怎么濾波。

51hei截圖20210814122750.png (22.81 KB, 下載次數(shù): 116)

51hei截圖20210814122750.png
回復(fù)

使用道具 舉報(bào)

8#
ID:160860 發(fā)表于 2021-8-17 12:09 | 只看該作者
我這里有一個(gè)工程你看一下


#include "wave.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"

#define Trig GPIO_Pin_7//超聲發(fā)射引腳pb7
#define Echo GPIO_Pin_6//超聲波接受引腳pb6

void Wave_SRD_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStruct;
        EXTI_InitTypeDef EXTI_InitStruct;
        NVIC_InitTypeDef NVIC_InitStruct;
        //初始化超聲波
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOB,ENABLE);
       
        GPIO_InitStruct.GPIO_Pin=Trig;
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
        GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_InitStruct);
       
        GPIO_InitStruct.GPIO_Pin=Echo;
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPD;
        GPIO_Init(GPIOB,&GPIO_InitStruct);
        //外部中斷與引腳的配置,中斷與端口6的映射
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource6);
        //外部中斷配置
        EXTI_InitStruct.EXTI_Line=EXTI_Line6;
        EXTI_InitStruct.EXTI_LineCmd= ENABLE;
        EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
        EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising;
        EXTI_Init(&EXTI_InitStruct);
        //中斷優(yōu)先級(jí)管理
        NVIC_InitStruct.NVIC_IRQChannel=EXTI9_5_IRQn;
        NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
        NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;
        NVIC_InitStruct.NVIC_IRQChannelSubPriority=0;
        NVIC_Init(&NVIC_InitStruct);
       
       
}
//外部中斷服務(wù)函數(shù)
void EXTI9_5_IRQHandler(void)
{
        delay_us(10);
        if(EXTI_GetITStatus(EXTI_Line6)!=RESET)//Echo檢測(cè)到高電平
        {
                TIM_SetCounter(TIM3,0);//開啟定時(shí)器
                TIM_Cmd(TIM3,ENABLE);//使能定時(shí)器
                while(GPIO_ReadInputDataBit(GPIOB,Echo));//等待Echo出現(xiàn)低電平
               
                TIM_Cmd(TIM3,DISABLE);//關(guān)閉定時(shí)器
               
        EXTI_ClearITPendingBit(EXTI_Line6);//清除中斷標(biāo)志
  }
}
//超聲波工作條件
//Trig產(chǎn)生一個(gè)不低于10us的高電平信號(hào)

u8 Wave_SRD_Strat(u8 time)
{
        if(time>10)
        {
        GPIO_SetBits(GPIOB,Trig);//設(shè)置Trig為高電平輸出
        delay_us(time);
        GPIO_ResetBits(GPIOB,Trig);
        return 0;//產(chǎn)生高于10us高電平,返回0
        }
        else return 1;//為產(chǎn)生高于10us高電平返回1
}

主函數(shù)里
初始化:
        Wave_SRD_Init();//初始化超聲波
        while(Wave_SRD_Strat(t))
        {
        }

while循環(huán):
//距離計(jì)算
                Wave_SRD_Strat(t);                             //產(chǎn)生高于10Us的高電平與OLED上顯示超聲波所測(cè)距離
                Juli = TIM_GetCounter(TIM3)*340/200.0;
                printf("%f",Juli);
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 情侣酒店偷拍一区二区在线播放 | 福利二区 | 成人在线一区二区 | 精品国产乱码久久久久久中文 | 一区二区成人 | 久久久精品网 | 久久久久久久久久一区二区 | 欧美在线色视频 | 久草电影网 | 久久免费香蕉视频 | 麻豆久久精品 | www.久草.com | 亚洲精品中文字幕在线 | 中文av在线播放 | 国产精品福利网 | 在线看av的网址 | av一区在线 | 免费 视频 1级 | 亚洲第1页 | 精品91久久久 | 黄色大片观看 | 一区精品在线观看 | 天堂综合网 | 97久久超碰 | 久久首页 | 久久99精品久久久 | 性网站免费 | 在线免费国产视频 | 一区视频在线免费观看 | 日本黄色的视频 | 久久久久久亚洲精品 | 成人av免费 | 亚洲精品一区二 | 在线观看视频一区二区三区 | 99在线免费视频 | 欧美日韩不卡在线 | 欧美一级欧美三级在线观看 | 日韩视频91| 婷婷五月色综合香五月 | 日本在线看 | 国产操操操 |