首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >STM32F4发现

STM32F4发现
EN

Stack Overflow用户
提问于 2017-12-15 19:01:58
回答 2查看 147关注 0票数 0

我有STM32F4发现。我使用IAR embedded Workbench。我是第一次接触这个工具包。我想测量一下距离。我的代码没有给出错误。距离始终为零。可能的错误是什么?请帮帮我。谢谢大家

代码语言:javascript
复制
#include "stm32f4_discovery.h"
#include "delay.h"

uint32_t Read_Distance(void);
void Init();

uint32_t distance ;

int main()
{  
    Init();   // initialisation de pin
    SysTick_Init(); // pour pouvoire utiliser la fonction delay :)

    while (1)
    {
        distance=Read_Distance();
        delay_nms(100);
    }
}


void Init()
{
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

    GPIO_InitTypeDef gpioStructure;

    gpioStructure.GPIO_Pin = GPIO_Pin_10;
    gpioStructure.GPIO_Mode = GPIO_Mode_OUT;
    gpioStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_Init(GPIOD, &gpioStructure);

    gpioStructure.GPIO_Pin = GPIO_Pin_11;
    gpioStructure.GPIO_Mode = GPIO_Mode_IN;
    GPIO_Init(GPIOD, &gpioStructure);
}

//Les Pins pour le Test sont PD10 (Trig) et PD11(echo) 

uint32_t Read_Distance(void)
{
    __IO uint8_t flag=0;
    __IO uint32_t disTime=0;
    GPIO_SetBits(GPIOD,GPIO_Pin_10);
    delay_nus(10);
    GPIO_ResetBits(GPIOD,GPIO_Pin_10);

    while(flag == 0)
    {
        while(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_11) == SET)
        {
            disTime++;
            flag = 1;
        }
    }
    return disTime;
}
EN

回答 2

Stack Overflow用户

发布于 2018-07-16 20:35:45

看起来你用的是超声波测距模块

试试这个:

代码语言:javascript
复制
while(flag == 0)
{
   disTime++;
   if(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_11) == SET)
   {
     flag = 1;
   }
}

您应该使用其中一个硬件计时器来获得更准确的时间度量。

现在我有时间再考虑一下了,我想起来了,你会得到一个宽度与距离成正比的脉冲。我认为这是正确的答案:

代码语言:javascript
复制
// Wait for pulse to start
while (GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_11) == RESET)
{
    NOP;
}

// Measure pulse width
while(flag == 0)
{
   disTime++;
   // Has pulse ended
   if(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_11) == RESET)
   {
     flag = 1;
   }
}

您可能还希望处理从未接收到脉冲的情况,因为这可能会永远阻塞。

票数 1
EN

Stack Overflow用户

发布于 2018-03-09 02:45:23

如果我理解正确的话,D10连接到了D11,您想要检查您的信号保持高电平的时间。如果是这种情况,当引脚为高电平时,应在定时器中断处理程序中递增计数器,并在读取后重置该计数器变量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47830985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档