gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:38:56 26 4
gpt4 key购买 nike

嘿,我有超声波传感器测量距离,不管我的变量“范围”是哪种类型(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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com