Цитата(Elsystems @ Dec 3 2014, 00:19)

Zreal := abs(Impedance) * cos(Z0);
Zimag := abs(Impedance) * sin(Z0);
if (cnt = 40) then
begin
Edit25.Text := Inttostr(Round(Zreal));
Edit26.Text := Inttostr(Round(Zimag));
if ((strtoint(edit23.Text) <> 0) and (Zimag <> 0)) then Edit27.Text := Inttostr(Round(1000000 / (2 * Pi * strtoint(edit23.Text) * Zimag)));
cnt := 0;
end;
cnt := cnt + 1;
end;
вот это самое интересное и не совсем понятное.
Код
Inttostr(Round(1000000 / (2 * Pi * strtoint(edit23.Text) * Zimag)))
это формула вычисления емкости как я поняимаю
а что это за цикл и почему циклов 40? т.е. во время этого цикла что-то проверяется и циклически "доводится" значение емкости до нужного значения. Что за функции Edit25, Edit26, Edit23? Это обрезание дробной части? Поясните пожалуйста смысл этого цикла и что там происходит
Цитата(Elsystems @ Dec 3 2014, 00:19)

Чтобы сказать что то конкретное, нужно глянуть Вашу схему и алгоритм ПО (не на ассемблере, а в виде блок схемы)
Набросал алгоритм, который есть на данный момент. Если будет время взгляните, пожалуйста:
1. Включение генератора. Если ошибок на шине I2C не возникло и полученные после записи параметры совпали с записываемыми - продолжаю (т.е. сделал контрольное чтение регистров AD5933 после их записи). Если ошибка - включаю аварийный индикатор и не продолжаю. В дальнейшем описании алгоритма не буду включать проверку на ошибки, но проверку делаю на все возможные ошибки после каждой операции.
2. Выжидаю 2 секунды перед командой на измерение. Затем даю команду измерить (Setteling cycles тоже на максимум x512). Решил пока все задержки сделать максимальными. После команды на измерение МК не отправляю в сон (понятно, что лучше отправлять, но этот марафет буду наводить уже после).
3. Дожидаюсь валидности данных опрашивая регистр статуса.
4. Получаю содержимое регистров Real и Imaginery Data.
5. Получаю модули значений (в отдельные переменные).
6. Получаю квадраты модулей (в отдельные переменные).
7. Получаю сумму квадратов (в отдельную переменную).
8. Вычисляю Magnitude = квадратный корень из полученной суммы квадратов (в отдельную переменную).
9. По полученным Real и Imaginery Data (не модулям, а реальным) вычисляю квадрат в котором произошло измерениеи собственно арктангенс отношения I/R. На выходе получаю значение нормализованное к шкале 0...359999999 (т.е. градусы). Записываю в отдельную переменную.
10. Вычисляю калибровочный GainFactor = Magnitude * (calib_r + calib_ri). Это значение используется если я кнопкой даю команду калибровки. Т.е. по команде кнопки происходит только запись в EEPROM уже готового калибровочного значения, которое получено еще до нажатия кнопки (мне показалось так удобней). calib_r - это известное сопротивление в Омах (в моем случае 51000), которое подключается при калибровке, calib_ri - это известное сопротивление Rsense в Омах (в моем случае 10000). Одновременно с записью в EEPROM калибровочного значения Gain Factor я записываю в EEPROM системную фазу, которую получил в предыдущем шаге.
11. Вычисляю комплексное сопротивление Impedance = (GainFactor / Magnitude) - calib_ri. Если GainFactor == 0 или 0xFFFFFF, то ничего не вычисляю (т.е. не было предварительной калибровки и записи в EEPROM).
12. Вычисляю угол фазового сдвига относительно системного значения сдвига (угол со знаком). Т.е. беру калибровочное значение фазы из EEPROM и вычитаю из него текущее значение фазы. Если сдвиг фазы более чем на 180 градусов (чего быть не может), то вычетаю получившееся значение из 360 градусов (произошел перход через 0, к примеру, системная фаза 320 градусов, а текущая 50 градусов). Записываю в отдельную переменную.
13. Вычисляю синус и косинус полученной разницы через тангенс половинного угла (в одной функции). Записываю в две отдельные переменные.
14. Далее шаг на котором я завис. Т.е. я множу комплексное сопротивление Impedance на косинус, чтобы получить активное сопротивление (Zreal) и на синус, чтобы получить реактивное сопротивление (Zimag).
15. Мыслей несколько.. чтобы получить емкость я должен воспользоваться формулой C = 1 / (2 * pi * F * Zimag)? + мне кажется что-то с фазой не то, мне кажется сдвиг фазы имеет какую-то дополнительную прибавку в зависимости от нагрузки/частоты, которую как-то нужно вычислять и прибавлять? нет?
Edit - это просто структура/массив с текстовыми переменными в Delphi? Тогда что содержится в элементе 23 этого массива? Что не должно быть равно 0 при проверке в цикле?