利用arduino测速,速度大于1.8m/s时不准确。-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 496|回复: 9

[未解决] 利用arduino测速,速度大于1.8m/s时不准确。

[复制链接]
发表于 2022-8-25 11:15 | 显示全部楼层 |阅读模式

装置:arduino uno,光电门,icd显示器测定长物体遮挡光电门的速度。问题是在速度较小时测得的结果很准确(大概<1.5m/s)。在速度大于1.8m/s时不准确,会重复出现几个速度值。
代码如下:

#include <LiquidCrystal_I2C.h>#include <LiquidCrystal.h>#include <Wire.h>#ifndef cbi#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))#endif#ifndef sbi#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))#endifLiquidCrystal_I2C lcd(0x27,16,2); //将LCD地址设置为0x27以显示16个字符和2行int photoPin = A0;  //定义传感管脚unsigned long start;    unsigned long whole;  //定义两个时间变量float a = 0;float b = 0;int value = 0;void setup() {// set prescale to 16sbi(ADCSRA,ADPS2) ;sbi(ADCSRA,ADPS1) ;sbi(ADCSRA,ADPS0) ;    lcd.init();  lcd.backlight();  pinMode(photoPin, INPUT);  Serial.begin(9600);    //开串  lcd.setCursor(0, 0); // 转到第一行开头  lcd.print("The Speed is: ");}void loop() {  while ( analogRead(photoPin) > 500){};   start = micros() ;    //记录起始点时间  while ( analogRead(photoPin)< 500){};    //等待物体离开  whole = micros();  //记录结束时间  a = (whole - start) / 1000;  b = 38.8/a;  // 速度计算公式  lcd.setCursor(0, 1); //转到第二行开头  lcd.print(b);        //LCD 屏幕显示速度  lcd.print(" m/s");   //LCD串口显示速度单位  delay(500);}


 楼主| 发表于 2022-8-25 11:23 | 显示全部楼层
上面代码不知咋的连起来了,重新发一下
#include <LiquidCrystal_I2C.h>
#include <LiquidCrystal.h>
#include <Wire.h>

#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif

LiquidCrystal_I2C lcd(0x27,16,2); //将LCD地址设置为0x27以显示16个字符和2行

int photoPin = A0;  //定义传感管脚
unsigned long start;   
unsigned long whole;  //定义两个时间变量
float a = 0;
float b = 0;
int value = 0;

void setup()
{
// set prescale to 16
sbi(ADCSRA,ADPS2) ;
sbi(ADCSRA,ADPS1) ;
sbi(ADCSRA,ADPS0) ;  

  lcd.init();
  lcd.backlight();

  pinMode(photoPin, INPUT);
  Serial.begin(9600);    //开串
  lcd.setCursor(0, 0); // 转到第一行开头
  lcd.print("The Speed is: ");
}

void loop()
{
  while ( analogRead(photoPin) > 500){};
  start = micros() ;    //记录起始点时间
  while ( analogRead(photoPin)< 500){};    //等待物体离开
  whole = micros();  //记录结束时间

  a = (whole - start) / 1000;
  b = 38.8/a;  // 速度计算公式

  lcd.setCursor(0, 1); //转到第二行开头
  lcd.print(b);        //LCD 屏幕显示速度
  lcd.print(" m/s");   //LCD串口显示速度单位
  delay(500);
}
发表于 2022-8-25 13:15 | 显示全部楼层
是不是时间小于 1ms了?
 楼主| 发表于 2022-8-25 14:08 | 显示全部楼层
Zoologist 发表于 2022-8-25 13:15
是不是时间小于 1ms了?

可以说得细一点吗?因为时间低于1ms所以引起这个问题的机理是啥?
发表于 2022-8-25 15:51 | 显示全部楼层
嗨呀你个瓜皮怪 发表于 2022-8-25 14:08
可以说得细一点吗?因为时间低于1ms所以引起这个问题的机理是啥?

噢 你用的是 micros(),分辨率是 4us 左右。

你有示波器吗,看一下光电门速度
 楼主| 发表于 2022-8-25 15:59 | 显示全部楼层
Zoologist 发表于 2022-8-25 15:51
噢 你用的是 micros(),分辨率是 4us 左右。

你有示波器吗,看一下光电门速度 ...

我们没有示波器,但是有市面上买的测速仪。在低速时arduino和测速仪测出来的差不多,高速时就不准了,并且频繁出现1.69m/s和2.16m/s
发表于 2022-8-25 16:16 | 显示全部楼层
用Arduino内部的模拟比较器去触发定时器计时,最后通过计数值和时钟分频和主频计算结果
 楼主| 发表于 2022-8-25 16:19 | 显示全部楼层
XlinliY.Zhang 发表于 2022-8-25 16:16
用Arduino内部的模拟比较器去触发定时器计时,最后通过计数值和时钟分频和主频计算结果 ...

谢谢。
我再多问一嘴,我用的这种方法在高速时计算结果不准确的原因是啥?
发表于 2022-8-25 16:20 | 显示全部楼层
嗨呀你个瓜皮怪 发表于 2022-8-25 16:19
谢谢。
我再多问一嘴,我用的这种方法在高速时计算结果不准确的原因是啥? ...

处理太慢,而且adc没有增加窗口值
发表于 2022-8-25 18:00 | 显示全部楼层
本帖最后由 cxg 于 2022-8-25 18:06 编辑

直接用中断来处理不就行了, 还要注意光电门的上升沿,需要加一个比较器, 否则会存在抖动, 导致不准确,
用模拟口读取肯定不靠谱


电路图参考, 我这个是两个光电门的图:

QQ截图20220825180526.png



您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 00:31 , Processed in 0.263022 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表