Хранитель Атлантиды
В процессе отлаживания прошивки для микроконтроллера столкнулся с явлением, исследование которого вылилось в небольшое увлекательное исследование.
Суть работы измерительной части программы такова, что по сигналу с компаратора, регистрирующего падение напряжения на делителе, запускается его оцифровка, на основании которой можно судить, какая же кнопка была нажата. Пока код компилировался в режиме отладки, никаких проблем не возникало и все кнопки определялись уверенно. Стоило же попробовать переключиться в Release со всеми оптимизациями в компиляторе, как кнопки спорадически начали определяться неверно.
С самого начала я предполагал, что из-за того, что в цепи стоит конденсатор для защиты от помех и дребезга контактов, АЦП может успевать ловить переходные процессы, поскольку между срабатыванием компаратора и полной стабилизацией напряжения в цепи проходит какое-то время — около 2-3 миллисекунд в максимуме, как показали замеры осциллографом. Я еще тогда удивился, что они никак не сказываются на точности, но теперь стало очевидно, что быстродействие кода тогда банально было недостаточным, чтобы это проявилось. Теперь же, когда были включены все оптимизации, скорость выполнения программы возросла настолько, что система теперь еще до стабилизации цепи успевает сделать несколько замеров. Заинтересовавшись, что же успевает увидеть микроконтроллер за это время, я добавил в код немного сбора данных, чтобы заодно лучше понять, как лучше будет фильтровать переходные процессы. Получилась довольно интересная картина:


Очевидно, что чем больше номинал сопротивления, включаемого кнопкой, тем дольше разряжается конденсатор. В случае максимального (6,8 кОм) значения, даже через 20 замеров цепь с при емкости используемого конденсатора ~47 нФ только-только успевает стабилизироваться, что вполне соответствует тому, что было на осциллограммах.
Вот таким вот образом быстродействие современных систем может породить порой трудноуловимые проблемы, если не знать о возможности их существования. Лично я к этому был готов и заранее предусмотрел, что буду делать в этом случае, но всегда интересно не только знать о теоретической возможности существования явления, но и увидеть и подтвердить его практикой. Это весьма и весьма увлекательно =)
Суть работы измерительной части программы такова, что по сигналу с компаратора, регистрирующего падение напряжения на делителе, запускается его оцифровка, на основании которой можно судить, какая же кнопка была нажата. Пока код компилировался в режиме отладки, никаких проблем не возникало и все кнопки определялись уверенно. Стоило же попробовать переключиться в Release со всеми оптимизациями в компиляторе, как кнопки спорадически начали определяться неверно.
С самого начала я предполагал, что из-за того, что в цепи стоит конденсатор для защиты от помех и дребезга контактов, АЦП может успевать ловить переходные процессы, поскольку между срабатыванием компаратора и полной стабилизацией напряжения в цепи проходит какое-то время — около 2-3 миллисекунд в максимуме, как показали замеры осциллографом. Я еще тогда удивился, что они никак не сказываются на точности, но теперь стало очевидно, что быстродействие кода тогда банально было недостаточным, чтобы это проявилось. Теперь же, когда были включены все оптимизации, скорость выполнения программы возросла настолько, что система теперь еще до стабилизации цепи успевает сделать несколько замеров. Заинтересовавшись, что же успевает увидеть микроконтроллер за это время, я добавил в код немного сбора данных, чтобы заодно лучше понять, как лучше будет фильтровать переходные процессы. Получилась довольно интересная картина:



Очевидно, что чем больше номинал сопротивления, включаемого кнопкой, тем дольше разряжается конденсатор. В случае максимального (6,8 кОм) значения, даже через 20 замеров цепь с при емкости используемого конденсатора ~47 нФ только-только успевает стабилизироваться, что вполне соответствует тому, что было на осциллограммах.
Вот таким вот образом быстродействие современных систем может породить порой трудноуловимые проблемы, если не знать о возможности их существования. Лично я к этому был готов и заранее предусмотрел, что буду делать в этом случае, но всегда интересно не только знать о теоретической возможности существования явления, но и увидеть и подтвердить его практикой. Это весьма и весьма увлекательно =)