support писал(а):В китайских ардуинках стоят не самые лучшие кварцы. Частота может плавать. Как вариант могу посоветовать подключить к контроллеру либо более менее точный осцилограф (или частотомер) если есть и с помощью параметров блока генератора выставить точное значение длительности периода (частоты). Ну и конечно эти параметры будут разные для каждого экземпляра ардуинки.
Вообще то есть еще проблема логики работы самого генератора.
Сейчас если выставить скажем 1 секунду, то импульс будет генерироваться не через секунду ровна, а через 1сек + плюс время программного цикла. Т.е. всегда есть небольшое расхождение и при том его величина может плавать.
Пока программа меленькая, эффект мало заметен, а если программа становится медленной (время программного цикла 10 и 100 млсек), ситуация становится уже сильно заметна.
Уже довольна давно делал блок
Генератор секунд , он работает на основе прерываний аппаратного таймера Timer1. Тестировал результат значительно более стабильный. Но из-за использования аппаратного таймера есть свои ограничения, могут быть конфликты с тем где он тоже используется
Добавлено (25.09.2017, 14:36)
---------------------------------------------
support, Вообще мне кажется, что можно немого доработать код программы.
Сейчас код семерично генератора с периодом 500мс такой (только кусок):
if (_gen1I) { if ( _isTimer (
_gen1P ,
500 )) {
_gen1P =
millis(); _gen1O = ! _gen1O;}}
Переделать так
if (_gen1I) { if ( _isTimer (
_gen1P ,
500 )) {
_gen1P =
millis()-_gen1P+500; _gen1O = ! _gen1O;}}
Можно свести накопления ошибки к минимуму.
Так как, это сделает программу тяжелея, а это точность часто избыточна, можно в настройках блока генератор добавить галочку "Повышенная точность".