极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 30004|回复: 11

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

[复制链接]
发表于 2015-9-6 20:06:41 | 显示全部楼层 |阅读模式
本帖最后由 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,这些都只是方法,
回复 支持 反对

使用道具 举报

发表于 2015-9-6 23:15:55 | 显示全部楼层
使用arduino DUE
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-7 08:49:24 | 显示全部楼层
邓维安 发表于 2015-9-6 22:51
能不能将10us的脉宽先放大到10ms再检测呢,我只是举个例子,另外arduino编译器可以支持avr的库涵数,为何不 ...

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

使用道具 举报

 楼主| 发表于 2015-9-7 08:51:35 | 显示全部楼层
suoma 发表于 2015-9-6 23:15
使用arduino DUE

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

使用道具 举报

发表于 2015-9-7 09:59:30 | 显示全部楼层
"传感器输出采用10us的脉宽调制....",

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

使用道具 举报

发表于 2015-9-7 10:55:59 | 显示全部楼层
信号幅度是多高?

用中断行不行?

提升采样频率行不行?
回复 支持 反对

使用道具 举报

发表于 2015-9-7 21:13:01 | 显示全部楼层
swjtutl 发表于 2015-9-7 08:51
arduino due可以用的,就是找不到最小系统和省电的方法,因为,开发最终是要用电池供电的,没有休眠和最小 ...

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

使用道具 举报

 楼主| 发表于 2015-9-11 13:18:43 | 显示全部楼层
zoologist 发表于 2015-9-7 10:55
信号幅度是多高?

用中断行不行?

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

使用道具 举报

 楼主| 发表于 2015-9-11 13:19:31 | 显示全部楼层
suoma 发表于 2015-9-7 21:13
最新系统由复位电路、晶振电路组成,你自己可以设计

资料好少,能不能给个链接学习下。
回复 支持 反对

使用道具 举报

发表于 2015-9-11 21:04:37 | 显示全部楼层
swjtutl 发表于 2015-9-11 13:19
资料好少,能不能给个链接学习下。

参考51单片机的最小系统设计,网上很多
回复 支持 反对

使用道具 举报

 楼主| 发表于 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);
    }
}
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-16 23:22 , Processed in 0.035627 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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