sadr0b0t / arduino-timer-api

Cross-platform Arduino timer API
GNU Lesser General Public License v3.0
35 stars 18 forks source link

Таймер на Arduino Due (SAM) копит ошибку #8

Open sadr0b0t opened 6 years ago

sadr0b0t commented 6 years ago

Сделал замеры по периодам таймеров на Arduino Due (SAM), получил, что на сумме из 1000 периодов накапливается существенная ошибка.

например, на 10КГц период должен быть 100мкс. На одном периоде замер показывает время между точками замера 100-101мкс (это ок). Но на 1000 периодов время между точками замера получается 100428мкс (лишние 428 микросекунд - это очень много).

    // period = 100us
    // PIC32MX (ChipKIT Uno32): 100us (ok)
    // AVR (Arduino Leonardo): 96/100/104us, x2=200/204us (ok)
    // SAM (Arduino Due): 100/101us, x1000=100428us (?ok)
    timer_init_ISR_10KHz(TIMER_DEFAULT);

На PIC32/ChipKIT, AVR/Leonardo все отлично, такой погрешности нет (на PIC32 идеально 100000, на AVR - +/- 4 мкс).

те же ~420мкс вылезают и на других частотах:

    // period = 5us
    // PIC32MX (ChipKIT Uno32): 5us, x10=50us (ok)
    // AVR (Arduino Leonardo): 12/16us, x2=20us, x10=84us (fail)
    // SAM (Arduino Due): 5/6us, x2=11us, x10=54/55us, x1000=5460us (fail)
    //timer_init_ISR_200KHz(TIMER_DEFAULT);

    // period = 10us
    // PIC32MX (ChipKIT Uno32): 10us (ok)
    // AVR (Arduino Leonardo): 12us, x2=20us, x10=100/104/108us, x1000=10000  (~ok)
    // SAM (Arduino Due): 10/11us, x1000=10397/10425 (?ok)
    //timer_init_ISR_100KHz(TIMER_DEFAULT);

    // period = 20us
    // PIC32MX (ChipKIT Uno32): 20us (ok)
    // AVR (Arduino Leonardo): 12/20/24us, x2=40/44/48us, x1000=19996/20000/20004 (~ok)
    // SAM (Arduino Due): 20/21us (ok), x1000=20405/20416us (?ok)
    //timer_init_ISR_50KHz(TIMER_DEFAULT);

    // period = 50us
    // PIC32MX (ChipKIT Uno32): 50us (ok)
    // AVR (Arduino Leonardo): 48/52/56us, x2=100us (ok)
    // SAM (Arduino Due): 50/51us, x1000=50410 (?ok)
    //timer_init_ISR_20KHz(TIMER_DEFAULT);

Будем надеяться, что проблема может быть в или в значениях для установки частоты или в настройках режима таймера, а не в особенностях железа.