Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 超声波传感器距离测量,可变溢流_C_Avr_Robotics - Fatal编程技术网

C 超声波传感器距离测量,可变溢流

C 超声波传感器距离测量,可变溢流,c,avr,robotics,C,Avr,Robotics,Hy,我有超声波传感器测量距离,但不知道哪种类型是我的变量“范围”(uint8_t,uint16_t,32,64)我总是溢出,然后传感器又从0开始..有什么方法可以限制“范围”变量,或者我必须用脉冲宽度以更难的方式限制它。。。谢谢 SENSOR_DDR |= (1<<TRIGGER_PIN); SENSOR_DDR &= ~(1<<ECHO_PIN) & ~(1<<PB3) & ~(1<<PB2) & ~(1&l

Hy,我有超声波传感器测量距离,但不知道哪种类型是我的变量“范围”(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);

}
SENSOR_DDR |=(1计算

256*timer0counter+TCNT0
将临时值保存为'default'size 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;

明确说明类型确实可以保护您的皮肤。

请更具体地说明如何从传感器获取数据。现在我添加了一些代码,希望它能帮助您,以便您能帮助我:)但现在我再想想,我的变量timer0counter只在Timer0TCNT0寄存器溢出之前计数,这是255…所以timer0counter是一个不能溢出的变量…TCNT0可以,但这没关系,这就是为什么我将溢出数(timer0counter)乘以256(timer 0寄存器TCNT0)…我不知道我是否正确理解你的问题。我只是指出,当运行整数乘法时,结果也是一个整数,它在AVR上可以存储-32k到+32k之间的数字。这不是很多:)您运行(256*timer0counter+TCNT0)*32。。。这就好像如果你认为最大的32 K,(256×Time0Cald+TCNT0)必须小于1K,那么TimeReC计数器必须小于4…所以,Time0C计数器是一个变量,每次TCNT0(定时器0登记)溢出时,它都会增加自身。变量计时器0计数器不能溢出..好的。例如,如果TCNT是100,timer0counter是5。计算如下:256*5+100,即1380;然后你将它乘以32,结果变成44160,这将不适合整数,你得到丑陋的(错误的^^^)值(可能是-24576),然后你将它乘以0.017(类型为double),得到-417.xx左右的值(同样是double)。在这一行中,你很少进行计算。它们不是一次完成的。每个操作符(如“*”和“+”)只在两个参数上运行,并且该操作的结果必须存储在某个地方(即使您只用于进一步的计算)。这些中间变量也有限制(与普通变量相同)。