首页 文章

Arduino中断处理

提问于
浏览
1

背景

我需要一个在“Arduino兼容”chipKit UNO32板上运行的数据记录应用程序,它带有一个连接的传感器 . 数据应记录在“Arduino无线SD屏蔽”上的SD卡中 . 传感器通过I2C连接 .

我的问题是当我使用Arduino SD库时写入很慢:每次打印()操作25毫秒,这给我最大40赫兹,与我的传感器的100-800Hz数据速率相比,这是可笑的 .

我的错误解决方案

幸运的是,传感器配备了片上FIFO,可存储32个传感器值 . 这意味着我可以在没有任何麻烦的情况下达到至少200Hz,因为填充FIFO的时间比写入卡的时间大 . 但我仍然真的想达到至少400Hz,所以我想我有以下设置:

  • 告诉传感器将数据放入FIFO

  • 当FIFO几乎满时,传感器触发中断(传感器执行此操作,它可以工作,我可以捕获中断)

  • 当Arduino收到中断时,它会轮询传感器以获取数据(通过I2C)并将数据存储在SRAM中的缓冲区中 .

  • 当SRAM缓冲区满时,将其内容写入SD卡 .

不幸的是,这似乎不起作用,因为处理I2C的Arduino Wire库使用中断,并且无法从中断处理程序中调用 . 我试过了,它冻结了微控制器 .

我的问题

似乎Arduino的其他I2C库不依赖于中断 . 我应该尝试那条路线吗?

或者从一开始我的思维方式(在ISR中抓取大量数据)是不是很糟糕?我应该采取另一种方法吗?

1 回答

  • 0

    只需使用中断设置标志并完成ISR . 从主循环执行调用I2C而不是直接从ISR调用 .

    boolean fifoFull = false;
    
    void fifoISR() {
        fifoFull = true;
    }
    
    void loop() {
        if(fifoFull) {
            // Do I2C
            fifoFull = false;
        }
    }
    

相关问题