找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1518|回复: 3
打印 上一主题 下一主题
收起左侧

stm32控制超声波模块最大距离就显示168cm,用例程代码255多,搞不明白

[复制链接]
跳转到指定楼层
楼主
ID:751817 发表于 2020-7-6 23:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "hc_sr04.h"

float Distance;

void hcgpio_init(void)
{
        GPIO_InitTypeDef        gpio_struct;
        NVIC_InitTypeDef        nvic_struct;
        EXTI_InitTypeDef        exti_struct;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOA |
                                RCC_APB2Periph_AFIO, ENABLE);

        gpio_struct.GPIO_Pin            =       GPIO_Pin_0;
        gpio_struct.GPIO_Mode           =       GPIO_Mode_Out_PP;
        gpio_struct.GPIO_Speed          =       GPIO_Speed_50MHz;
        GPIO_Init(GPIOC,&gpio_struct);

        gpio_struct.GPIO_Pin            =       GPIO_Pin_1;
        gpio_struct.GPIO_Mode           =       GPIO_Mode_IPD;
        gpio_struct.GPIO_Speed          =       GPIO_Speed_50MHz;
        GPIO_Init(GPIOC,&gpio_struct);

        GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource1);

        exti_struct.EXTI_Line           =       EXTI_Line1;
        exti_struct.EXTI_Mode           =       EXTI_Mode_Interrupt;
        exti_struct.EXTI_Trigger        =       EXTI_Trigger_Rising;
        exti_struct.EXTI_LineCmd        =       ENABLE;
        EXTI_Init(&exti_struct);

        nvic_struct.NVIC_IRQChannel     =       EXTI1_IRQn;
        nvic_struct.NVIC_IRQChannelCmd  =       ENABLE;
        nvic_struct.NVIC_IRQChannelPreemptionPriority   =       2;
        nvic_struct.NVIC_IRQChannelSubPriority          =       2;
        NVIC_Init(&nvic_struct);

}

void EXTI1_IRQHandler(void)
{
        delay_us(10);

        if(EXTI_GetITStatus(EXTI_Line1) !=RESET)
        {
                TIM_SetCounter(TIM2,0);
                TIM_Cmd(TIM2,ENABLE);
               
                while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_1));  //μè′yμíμçƽ
               
                TIM_Cmd(TIM2,DISABLE);
               
                Distance=TIM_GetCounter(TIM2)*340/200.0;
               
                if(Distance>0)
                {
                        printf("Distance:%f cm\r\n",Distance);
                }
                       
                EXTI_ClearITPendingBit(EXTI_Line1);


        }
}

void hc_sr04(void)
{
        GPIO_SetBits(GPIOC,GPIO_Pin_0);
        delay_us(20);
        GPIO_ResetBits(GPIOC,GPIO_Pin_0);

}

#include "hc_time.h"

void hctime_init(void)
{
        TIM_TimeBaseInitTypeDef         time_struct;
        NVIC_InitTypeDef                nvic_struct;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 ,ENABLE);

        time_struct.TIM_Period          =       5000;
        time_struct.TIM_Prescaler       =       7199;
        time_struct.TIM_CounterMode     =       TIM_CounterMode_Up;
        time_struct.TIM_ClockDivision   =       0;
        //tim2
        TIM_TimeBaseInit(TIM2,&time_struct);

        TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
        TIM_ITConfig(TIM2,TIM_IT_Trigger,ENABLE);

        nvic_struct.NVIC_IRQChannel     =       TIM2_IRQn;
        nvic_struct.NVIC_IRQChannelCmd  =       ENABLE;
        nvic_struct.NVIC_IRQChannelPreemptionPriority   =  1;
        nvic_struct.NVIC_IRQChannelSubPriority          =  0;

        NVIC_Init(&nvic_struct);
}

void TIM2_IRQHandler(void)
{
        if(TIM_GetITStatus(TIM2,TIM_IT_Update) != RESET)
        {
                TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
        }

}





分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:476215 发表于 2020-7-7 00:12 | 只看该作者
是不是超声波模块信号多次反射了,可以降低超声波的发射频率试一下;还有一种可能是你计时的定时器出了问题,对比这查看下
回复

使用道具 举报

板凳
ID:764088 发表于 2020-7-7 10:33 | 只看该作者
这个例程 有这些毛病:接收反馈回波,中断处理开头就延时,处理内用过杂, 过多,甚至打印。
本来超声波模块是通过 发送波及回波间隔,来测试 距离的,
回复

使用道具 举报

地板
ID:751817 发表于 2020-7-7 10:58 | 只看该作者
qee654 发表于 2020-7-7 00:12
是不是超声波模块信号多次反射了,可以降低超声波的发射频率试一下;还有一种可能是你计时的定时器出了问题 ...

频率减低了,也不行;定时器的问题不清楚
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

Powered by 单片机教程网

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