与AVR接口的超声波传感器
问题描述:
我正在使用超声波传感器读取一些项目的一部分,并用串行通信发送它,我编写代码并给出了随机读取,有时给出0作为读取,是公式我用于找到正确的距离!?,或者有另一个公式,我使用内部8MHz时钟的Atmega32,有人可以帮助我,并知道我的代码有什么问题!与AVR接口的超声波传感器
#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中的数据结构]的可能重复(https://*.com/questions/371371/serialize-data-structures-in-c) –
@GianlucaGhettini这个问题与序列化无关,但远程地,与*串行通讯*。 – JimmyB