找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

为什么stm32f103不能驱动超声波模块hcsr04?

查看数: 2879 | 评论数: 7 | 收藏 1
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2021-8-12 17:00

正文摘要:

#include "delay.h" #include "sys.h" #include "usart.h" #include "hcsr04.h"          int main(void) {         ...

回复

ID:160860 发表于 2021-8-17 12:09
我这里有一个工程你看一下


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

#define Trig GPIO_Pin_7//超声发射引脚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);
        //中断优先级管理
        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);
       
       
}
//外部中断服务函数
void EXTI9_5_IRQHandler(void)
{
        delay_us(10);
        if(EXTI_GetITStatus(EXTI_Line6)!=RESET)//Echo检测到高电平
        {
                TIM_SetCounter(TIM3,0);//开启定时器
                TIM_Cmd(TIM3,ENABLE);//使能定时器
                while(GPIO_ReadInputDataBit(GPIOB,Echo));//等待Echo出现低电平
               
                TIM_Cmd(TIM3,DISABLE);//关闭定时器
               
        EXTI_ClearITPendingBit(EXTI_Line6);//清除中断标志
  }
}
//超声波工作条件
//Trig产生一个不低于10us的高电平信号

u8 Wave_SRD_Strat(u8 time)
{
        if(time>10)
        {
        GPIO_SetBits(GPIOB,Trig);//设置Trig为高电平输出
        delay_us(time);
        GPIO_ResetBits(GPIOB,Trig);
        return 0;//产生高于10us高电平,返回0
        }
        else return 1;//为产生高于10us高电平返回1
}

主函数里
初始化:
        Wave_SRD_Init();//初始化超声波
        while(Wave_SRD_Strat(t))
        {
        }

while循环:
//距离计算
                Wave_SRD_Strat(t);                             //产生高于10Us的高电平与OLED上显示超声波所测距离
                Juli = TIM_GetCounter(TIM3)*340/200.0;
                printf("%f",Juli);
ID:592807 发表于 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的时钟
       
        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)  电平被拉高后开启定时器
ECHO (PA6)  电平拉低后关闭定时器并且读取时间


测试距离 = (高电平时间(S) * 340M/S)/2
模块测距范围2-400cm
因此高电平时间范围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("超时\r\t");
                                return 0;               
                }
               
                GPIO_SetBits(GPIOA,GPIO_Pin_7);
                delay_us(20);
                GPIO_ResetBits(GPIOA,GPIO_Pin_7);//触发信号
                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);//时钟1S 10000节拍。1节拍0.1ms 100us
                TIM1->CNT = 0;
               
                return usTime;
               




}








时间和距离的转换没您好,也没怎么滤波。

51hei截图20210814122750.png (22.81 KB, 下载次数: 116)

51hei截图20210814122750.png
ID:592807 发表于 2021-8-13 20:32
123689 发表于 2021-8-13 16:34
这个连最开始的“超声波初始化”都没得!

我找时间试一下。买了买还用

P10813-202936.jpg (2.46 MB, 下载次数: 114)

P10813-202936.jpg
ID:660005 发表于 2021-8-13 16:34
黄youhui 发表于 2021-8-13 13:38
length=gettime();
  printf("距离为:%.3f cm\n",length);//打印总的距离

这个连最开始的“超声波初始化”都没得!
ID:660005 发表于 2021-8-13 16:33
黄youhui 发表于 2021-8-13 13:38
length=gettime();
  printf("距离为:%.3f cm\n",length);//打印总的距离

就算加上return t,串口助手还是没得反应
ID:592807 发表于 2021-8-13 13:38

   length=gettime();
  printf("距离为:%.3f cm\n",length);//打印总的距离

u32 gettime(void)//时间获取函数
{
u32 t=0;
        t=msHcCount*1000;
        t+=TIM_GetCounter(TIM2);
        TIM2->CNT=0;
        delay_ms(50);
}
没有renturn数值  你获取时间获取了个寂寞
ID:57657 发表于 2021-8-12 17:46
具体请用逻辑分析仪检测一下波形、时序是否正确。

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表