ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
19 мая
225423 Топик полностью
Ксения (05.12.2010 05:30 - 05:41, просмотров: 169) ответил alexdos на Алгоритм поиска минимума
Алгоритм: То, о чем вы пишите, это не глобальный минимум (минимум от всех замеров АЦП), а минимум на каком-то обозримом/фиксированном участке предыстории. Например, задаваясь длиной участка 100, вы вычисляете минимум среди последних 100 отсчетов АЦП. Такой минимум назовем локальным, в отличие от глобального минимума, находимого по всем когда-либо полученным отсчетам АЦП. Глобальный минимум вычисляется очень легко, хотя он вам не нужен, т.к. вы намереваетесь обнаруживать изменение минимума от вращения ручки резистора. Ведь локальный минимум ничуть бы не изменился от повышения напряжения этой ручкой. А раз вы ожидаете от этих действий изменение минимума, то, видимо, подразумеваете минимум не глобальный, а локальный - относящийся лишь к последним нескольким секундам измерения. Если мои предположения о характере вашей задачи верны, то надо держать кольцевой буфер (массив данных), таких размеров, чтобы данные за последнюю секунду туда помещались. Либо взять буфер разумных размеров, не привязываясь к конкретному времени. Разумным может оказаться буфер на 256 последних замеров, т.к. его проще всего сделать кольцевым - достаточно взять указатель типа char (один байт), который будет сам сбрасываться на ноль при переполнении. Для пущей ясности я продемонстрирую алгоритм на буфере для последних 12 отсчетов, т.к. здесь кольцевание буфера будет подобно стрелочным часам, где после 12 часов снова наступает 1 час. Для работы нам понадобятся: int буфер[12] = {}; // буфер на последние 12 отсчетов, в самом начале заполняется самым большим числом, которое туда помещается (INTMAX). char стрелка = 0; // стрелка, указывающая на текущий час, для связи с языком C цифры на часах нумеруются от 0 до 11, а не от 1 до 12. int выемка; // переменная для хранения выемки из буфера int минимум = INTMAX; // вычисляемый локальный минимум Порядок действий таков: 1) вынимаем самый старый элемент буфера, на который указывает стрелка: выемка = буфер[стрелка]; 2) Кладем на его место очередной замер АЦП: буфер[стрелка] = АЦП; 3) переводим стрелку на следующее деление на циферблате: if( ++стрелка > 11) стрелка=0; Заметим, что через 12 шагов все максимальные значения INTMAX будут заменены на реальные замеры АЦП, а стрелка будет указывать на самый старый замер, подлежащий в следующей раз замене. 4) проверяем, не выкинули ли мы из буфера минимальную точку: if( выемка != минимум) goto 1; // вынутое не есть минимальная точка, локальный минимум остался прежним - возвращаемся к пункту 1) 5) Минимум мог измениться, поэтому находим новый минимум среди всех элементов буфера минимум = min(буфер); // такой функции нет, ее надо писать самим 6) Распечатываем новое значение минимума или куда-то его посылаем. 7) Возвращаемся к пункту 1) Вот и все! Надо только предусмотреть внутри этого цикла выход из него, когда это занятие надоест.