c - 超声波传感器与 AVR 接口(interface)

标签 c microcontroller sensors avr

我正在开发一个项目的一部分,用超声波传感器进行一些读取并通过串行通信发送它,我编写了代码,它给出随机读取,有时给出 0 作为读取,这是我用于查找的公式距离正确!?或者还有另一个公式,我正在使用带有内部 8MHz 时钟的 Atmega32,有人可以帮助我并知道我的代码有什么问题吗!?。

#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

void inti_serial();

static volatile int pulse = 0;
static volatile int change = 0;

int main(void)
{ 

/* Replace with your application code */
inti_serial();

MCUCR |= (1 << ISC00); //Any logical change on INT0
GICR |= (1 << INT0); //Enable INT0

TCCR1A=0;
sei();

while (1) 
{
PORTC |= (1<<0);
_delay_us(15);
PORTC &= ~(1<<0);
while(!(UCSRA & (1<<UDRE)));
UDR = ((pulse/2)*1*(1/F_CPU)*343) ;
_delay_ms(100);
}
}

ISR(INT0_vect){


if (change==1)//when logic from HIGH to LOW

{

    TCCR1B=0;//disabling counter

    pulse=TCNT1;//count memory is updated to integer

    TCNT1=0;//resetting the counter memory

    change=0;

}

if (change==0)//when logic change from LOW to HIGH

{

    TCCR1B|=(1<<CS10);//enabling counter

    change=1;

}
}

void inti_serial()
{
 UCSRB |= (1<<TXEN);
 UCSRC |= (1<<UCSZ0) | (1<<UCSZ1) | (1<<URSEL);
 UBRRL = 0x33;
}

最佳答案

我看到了一些改进您的发展的选项:

  • 您正在将 ISR 中的示例写入变量,并从主循环中连续读取它并输出它。相反,您应该只输出一次新样本(使串行数据更小并且更容易集中于实际内容和样本计时)

  • 在考虑正确的公式之前,您应该验证您的抽样机制是否正确。无论如何,如果没有有关传感器的详细信息,这里没有人可以判断您的公式。

  • 您可以使用处理器的输入捕获电路,而不是对自由运行的计数器进行采样(更准确,由于中断延迟而导致的抖动更少)

  • 无需将计数器寄存器重置为零,您可以将两个连续样本相减(由于中断延迟而导致样本抖动减少)

  • 不要从切换标志中推导出边沿,而是向硬件询问引脚的状态或哪个边沿触发了中断(或捕获)

关于c - 超声波传感器与 AVR 接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46777877/

相关文章:

c - 如何在 C 中实现通用宏?

python - 如何在 ctypes 中从 C 写入字符串缓冲区?

c++ - 关于 ints 和 static_assert 的特化

iphone - iOS adhoc wifi 传感器数据

android - 如何获得陀螺仪计算的初始方向?

python - Python 中的 C 函数 : Return an Array and Variables

c - char* 究竟定义了什么?如果它定义了一个字符串数组,我如何输出单个元素?

c - '&' 操作后存储的值是多少

c - 需要 C 语言的 main 函数,用于微 Controller

java - 如何模拟 ECG(心电图)