реклама на сайте
подробности

 
 
> Работа с AD5933 при заземленной нагрузке
vazz
сообщение Nov 15 2014, 16:54
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 189
Регистрация: 21-01-10
Пользователь №: 54 971



За исходный вариант взял AN-847 (Measuring a Grounded Impedance Profile Using the AD5933 by Sean Brennan). По его повествованию сваял схему. Вместо инструментального ОУ применил 4 ОУ в одном корпусе общего применения (работают они не хуже). На странице 6 указанного документа приведен рисунок Figure 5, на котором приведено условие "REQUIRED OUTPUT SIGNAL" равное 1Vp-p. Собственно условие это у меня выполняется. НО! Тыкаю я осциллом в точку соединения двух 100кОмных сопротивлений и вижу фигу, т.е. отсутствие какого-либо синуса в этой точке (эти два сопротивления можно наблюдать на рисунках Figure 2 и Figure 3). Думается мне, что в этой точке должно быть ну хоть что-то, не так ли? У кого есть опыт пользования AD5933 прошу помощи/подсказок!
Ссылка на упомянутый документ: http://www.analog.com/static/imported-file...otes/AN-847.pdf


--------------------
Не так страшна автоматизация, как её малюют.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Elsystems
сообщение Dec 2 2014, 20:19
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 265
Регистрация: 19-01-12
Пользователь №: 69 736



В принципе Вы далеко продвинулись. Чтобы сказать что то конкретное, нужно глянуть Вашу схему и алгоритм ПО (не на ассемблере, а в виде блок схемы). Могу сказать общие рекомендации:
1. На входе в микросхему сигнал не должен выходить за пределы ее рабочего диапазона 0...1В при любой нагрузке.
2. Сигнал который входит в микросхему должен иметь точно такое же смещение относительно нуля как и выходной.
3. Нужно без отступлений реализовать формулы из дата шита из разделов GAIN FACTOR CALCULATION, IMPEDANCE CALCULATION USING GAIN FACTOR, MEASURING THE PHASE ACROSS AN IMPEDANCE.
4. Проще сначала все отладить на одной частоте. Снятие характеристик от частоты - более сложный этап.
5. Вот кусок кода на Delphi, надеюсь он вам поможет:
procedure TForm1.Button3Click(Sender: TObject);//Калибровка, должен быть подключен резистор 499 ом.
begin
RealDR_cal := RealDR;
ImaginaryDR_cal := ImaginaryDR;
R_cal := 499;
end;
.........
.........
MagnitudeGF := sqrt((RealDR_cal * RealDR_cal) + (ImaginaryDR_cal * ImaginaryDR_cal));
Vsystem := ArcTan2(ImaginaryDR_cal, RealDR_cal);
if (MagnitudeGF <> 0) then GainFactor := (R_cal / MagnitudeGF);

if ((RealDR <> 0) and (ImaginaryDR <> 0)) then
begin
Magnitude := sqrt((RealDR * RealDR) + (ImaginaryDR * ImaginaryDR));
Impedance := (GainFactor * Magnitude);
Phase := ArcTan2(ImaginaryDR, RealDR);
Z0 := Phase - Vsystem;
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;
Go to the top of the page
 
+Quote Post
vazz
сообщение Dec 3 2014, 13:24
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 189
Регистрация: 21-01-10
Пользователь №: 54 971



Цитата(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 при проверке в цикле?


--------------------
Не так страшна автоматизация, как её малюют.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- vazz   Работа с AD5933 при заземленной нагрузке   Nov 15 2014, 16:54
- - Herz   Цитата(vazz @ Nov 15 2014, 18:54) Думаетс...   Nov 15 2014, 17:24
- - vazz   Да, действительно. Все меряет, все работает как на...   Nov 17 2014, 23:03
- - vazz   выспался, вопрос снимается)   Nov 18 2014, 10:03
- - MrYuran   Цитата(vazz @ Nov 15 2014, 20:54) У кого ...   Nov 18 2014, 13:33
|- - vazz   Цитата(MrYuran @ Nov 18 2014, 17:33) точн...   Nov 19 2014, 08:40
|- - MrYuran   Цитата(vazz @ Nov 19 2014, 12:40) Вот раз...   Nov 19 2014, 09:49
|- - vazz   Цитата(MrYuran @ Nov 19 2014, 13:49) Наск...   Nov 19 2014, 11:06
- - vazz   Прошу помощи, а то закипаю Из описания демо-платы...   Nov 20 2014, 10:00
|- - MrYuran   Цитата(vazz @ Nov 20 2014, 14:00) Прошу п...   Nov 21 2014, 07:49
- - vazz   Довел уже до блеска алгоритм вычисления арктангенс...   Nov 24 2014, 23:45
- - vazz   Нашел ошибку в вычислении квадрата, нелепость кака...   Nov 25 2014, 13:53
- - vazz   Мудреная эта хреновина (AD5933). То ли я туповат. ...   Dec 1 2014, 00:45
|- - vazz   Цитата(Elsystems @ Dec 3 2014, 00:19) В п...   Dec 2 2014, 21:36
- - Elsystems   Да, я немного не так написал про входное напряжени...   Dec 3 2014, 08:27
- - Elsystems   Edit - ввод-вывод с формы. Цикл был чтобы на экран...   Dec 3 2014, 17:15
- - vazz   КодImpedance := (GainFactor * Magnitude...   Dec 4 2014, 12:28
|- - MrYuran   Цитата(vazz @ Dec 4 2014, 16:28) Errata н...   Dec 4 2014, 12:58
|- - vazz   Цитата(MrYuran @ Dec 4 2014, 16:58) тема ...   Dec 4 2014, 13:04
- - vazz   Подскажите, пожалуйста, верно ли мое предположение...   Dec 4 2014, 23:37
- - vazz   Самое крутое - это когда калибруешь натурный фазов...   Dec 5 2014, 21:53


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 12:51
Рейтинг@Mail.ru


Страница сгенерированна за 0.01796 секунд с 7
ELECTRONIX ©2004-2016