swjtutl 发表于 2015-9-6 20:06:41

请教高手,如何提高arduino的执行速度

本帖最后由 swjtutl 于 2015-9-6 20:08 编辑

最近用arduino来处理一个数字传感器的信号,传感器输出采用10us的脉宽调制。
用基于mega2560,328p和32u4的arduino都不能正常读数,无论采用中断还是pulsein()函数。
后来测试了下,上面这些arduino执行一次digitalread()的时间就需要5~6us。
不得已换成了arduino due,执行单次digitalread()的时间只要1us,采用pulsein可以完美处理10us脉宽的数据。
可是,arduino due耗电巨大,难以用电池解决。
而基于328p的arduino都已经有了完美的休眠方案,特别是采用最小系统的时候。
所以,还是希望能够通过普通的uno解决10us脉宽数据的读取问题,不知道有没有好方法。

邓维安 发表于 2015-9-6 22:51:19

能不能将10us的脉宽先放大到10ms再检测呢,我只是举个例子,另外arduino编译器可以支持avr的库涵数,为何不试试手动编写digitalread,这些都只是方法,

suoma 发表于 2015-9-6 23:15:55

使用arduino DUE

swjtutl 发表于 2015-9-7 08:49:24

邓维安 发表于 2015-9-6 22:51 static/image/common/back.gif
能不能将10us的脉宽先放大到10ms再检测呢,我只是举个例子,另外arduino编译器可以支持avr的库涵数,为何不 ...

如果能有一个芯片把10us的脉宽拉宽就没问题,不过我实在没听说过有这种芯片,如果通过单片机就失去意义了。
avr gcc是个办法,没玩过,正在学习中,如果有哪位tx熟悉的,帮忙测试下编一个digitalread的执行时间就好了。

swjtutl 发表于 2015-9-7 08:51:35

suoma 发表于 2015-9-6 23:15 static/image/common/back.gif
使用arduino DUE

arduino due可以用的,就是找不到最小系统和省电的方法,因为,开发最终是要用电池供电的,没有休眠和最小系统很难用于成品,只能测试。

eddiewwm 发表于 2015-9-7 09:59:30

"传感器输出采用10us的脉宽调制....",

最小和最大的波形情況能寫清楚一點嗎?如有圖會更好,如能說明是甚麼的傳感器則更有幫助。

zoologist 发表于 2015-9-7 10:55:59

信号幅度是多高?

用中断行不行?

提升采样频率行不行?

suoma 发表于 2015-9-7 21:13:01

swjtutl 发表于 2015-9-7 08:51 static/image/common/back.gif
arduino due可以用的,就是找不到最小系统和省电的方法,因为,开发最终是要用电池供电的,没有休眠和最小 ...

最新系统由复位电路、晶振电路组成,你自己可以设计

swjtutl 发表于 2015-9-11 13:18:43

zoologist 发表于 2015-9-7 10:55 static/image/common/back.gif
信号幅度是多高?

用中断行不行?


信号是经过比较器调理过的5V。
用过中断试过,貌似更慢。
提升采样频率?不懂

swjtutl 发表于 2015-9-11 13:19:31

suoma 发表于 2015-9-7 21:13 static/image/common/back.gif
最新系统由复位电路、晶振电路组成,你自己可以设计

资料好少,能不能给个链接学习下。

suoma 发表于 2015-9-11 21:04:37

swjtutl 发表于 2015-9-11 13:19 static/image/common/back.gif
资料好少,能不能给个链接学习下。

参考51单片机的最小系统设计,网上很多

swjtutl 发表于 2015-9-13 19:41:06

基本上搞定了,用的AVR编程,1us脉宽的脉冲都能够扑捉到了。
谢谢各位的帮助。
#include <avr/io.h>
#include <util/delay.h>
#define PORT_LOW PORTB &= ~(1 << PB7) // leonardo 引脚11=PB7
#define PORT_HIGH PORTB |= (1 << PB7)
void setup()
{
DDRB |= (1<<PB7);//DDRB寄存器置位写状态
}

void loop()
{
// 发送脉宽1us的脉冲:
    PORT_HIGH;
    delayMicroseconds(1);
    PORT_LOW;
    delay(1000);
}

上面是发脉冲的代码,下面是接收脉冲的代码,用了两个leonardo调试
#include <avr/io.h>
#include <util/delay.h>
unsigned long starttime;
unsigned long stoptime;
void setup()
{
Serial.begin(9600);
    while (!Serial);
DDRB &= ~(1<<PB7);
}

void loop()
{
    if(bitRead(PINB,PB7)==1)
    {
      starttime=micros();
      while(bitRead(PINB,PB7)==1);
      stoptime=micros();
      Serial.print("PULSE WIDTH IS:   ");
      Serial.println(stoptime-starttime);
    }
}
页: [1]
查看完整版本: 请教高手,如何提高arduino的执行速度