c - 超声波传感器距离测量,可变溢出

标签 c avr robotics

嘿,我有超声波传感器测量距离,不管我的变量“范围”是哪种类型(uint8_t、uint16_t、32、64),我总是会溢出,然后传感器再次从 0 开始..有没有办法我可以限制“范围”变量,或者我必须用脉冲宽度以更困难的方式限制它......谢谢

SENSOR_DDR |= (1<<TRIGGER_PIN);  
SENSOR_DDR &= ~(1<<ECHO_PIN) & ~(1<<PB3) & ~(1<<PB2) & ~(1<<PB1) & ~(1<<PB0); 
DDRD = DDRD | _BV(4); 
PORTD = PORTD | _BV(4);
ENGINE_DDR = 0xff; 
ENGINE_PORT = 0;

lcd_init(LCD_DISP_ON);
lcd_clrscr();
lcd_puts("Something wrong...");


while(1)
{

PORTB |= (1<<PB4); //Send Trigger
_delay_us(10);
PORTB &= ~(1<<PB4); //Send trigger


timer0counter=0;
TCNT0=0; //Clear timer
while(bit_is_clear(PINB,5)); //Wait for rising edge
TCCR0 |= (1<<CS02); //Select prescalar 256
TIMSK |= (1<<TOIE0) | (1<<TOIE2); //Enable timer0 overflow interrupt

lcd_clrscr();

while(bit_is_set(PINB,5) && timer0counter<9) //wait for falling edge of echo
{
_delay_us(5);
}
TCCR0 &= ~(1<<CS02); //Stop timer
TIMSK &= ~(1<<TOIE0);
if(bit_is_set(PINB,5))
{
lcd_puts("No OBSTACLE");
}
else
{
range=(256*timer0counter+TCNT0)*32*0.017; //range conversion

lcd_clrscr();
lcd_puts("Distance:");
lcd_puts(itoa(range,buffer,10));
lcd_puts_P("cm");
}
if(range<15){
...

ISR(TIMER0_OVF_vect) 
{
TIMSK &= ~(1<<TOIE0);
TCNT0=0;
timer0counter++;

TIMSK |= (1<<TOIE0);

if(timer0counter>8)
{
TCCR0 &= ~(1<<CS02);
TIMSK &= ~(1<<TOIE0);

}

最佳答案

计算

256*timer0counter+TCNT0

以“默认”大小 int 保存临时值,在 AVR 上为 16b。因此,每当timer0counter高于256时,无论变量的最终类型如何,它都会溢出。

而不是做

range=(256*timer0counter+TCNT0)*32*0.017;

尝试使用:

double range_real = 256.0 * (double)timer0counter + (double)TCNT0 * 32.0 * 0.017;
range = (int) range_real;

明确类型确实可以节省你的时间。

关于c - 超声波传感器距离测量,可变溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21999921/

相关文章:

c - 如何从 xmega 读取输入然后将其显示在 super 终端上

c++ - C/C++ 预处理错误

c -++*p++的输出

c -/usr/include 和/include 之间的区别

c - 在 AVR Atmega324A 上多路复用七段显示器

c++ - C/C++ 中用于 AVR 的数组不断追加

java - 在 Roomba 上获取 Java(机器人)

algorithm - 轮径和轮距之比对车辆的定位和所需航向有什么影响?

opencv - 在二维图像中寻找路径障碍物

c - 编写一个函数 any(s1, s2) 返回字符串 s1 中字符串 s2 中任意字符出现的第一个位置