C 超声波传感器距离测量,可变溢流
Hy,我有超声波传感器测量距离,但不知道哪种类型是我的变量“范围”(uint8_t,uint16_t,32,64)我总是溢出,然后传感器又从0开始..有什么方法可以限制“范围”变量,或者我必须用脉冲宽度以更难的方式限制它。。。谢谢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
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)。在这一行中,你很少进行计算。它们不是一次完成的。每个操作符(如“*”和“+”)只在两个参数上运行,并且该操作的结果必须存储在某个地方(即使您只用于进一步的计算)。这些中间变量也有限制(与普通变量相同)。