Российский производитель и разработчик сертифицированного измерительного оборудования с 1987 года


Модификация lbios E14-440 для измерения периода

Вы не вошли.

 Поиск | Регистрация | Вход 

Victoria
04.12.2008 15:39:39
#1

Гость

Модификация lbios E14-440 для измерения периода

Код программы:
{*************** Измерение оборотов НД ************** }
Period_Meas_cmd2:
        AX0=0;
        DM(ToutErr2)=AX0;
        AY1=60000;         { счетчик таймаута }
        DM(CntTout)=AY1;
        AY1=50;
        DM(CntTout2)=AY1;
        AY0=2;             { маска для входа }
{ ожидание первого отрицательного фронта }
Period12: AR=IO(0);
        AR=AR AND AY0;
        IF EQ JUMP Period012;  {*** дождались нуля ***}
        AX0=DM(CntTout);
        AR=AX0-AY0;
        DM(CntTout)=AR;
        IF NE JUMP Period12;
        AX0=60000;
        DM(CntTout)=AX0;
        AX0=DM(CntTout2);
        AR=AX0-AY0;
        DM(CntTout2)=AR;
        IF NE JUMP Period12;
{*** выход по таймауту *** }
        AX0=1;
        DM(ToutErr2)=AX0;
        AR=0;
        DM(Nd)=AR;
        ENA INTS;
        JUMP EndOfCommand;

Period012:
        AY1=60000;         { счетчик таймаута }
        DM(CntTout)=AY1;
        AY1=50;
        DM(CntTout2)=AY1;
        AY0=2;             { маска для входа }
Period22: AR=IO(0);
        AR=AR AND AY0;
        IF NE JUMP Period022;  {*** дождались единицы ***}
        AX0=DM(CntTout);
        AR=AX0-AY0;
        DM(CntTout)=AR;
        IF NE JUMP Period22;
        AX0=60000;
        DM(CntTout)=AX0;
        AX0=DM(CntTout2);
        AR=AX0-AY0;
        DM(CntTout2)=AR;
        IF NE JUMP Period22;
{*** выход по таймауту *** }
        AX0=2;
        DM(ToutErr2)=AX0;
        AR=0;
        DM(Nd)=AR;
        ENA INTS;
        JUMP EndOfCommand;

Period022:
        DIS TIMER;
        AX0=255;
        DM(Tscale_reg)=AX0;
        AX0=0xFFFF;
        DM(Tperiod_reg)=AX0;       { такт таймера 5.3125 мкс  }
        AX0=0xFFFF;
        DM(Tcount_reg)=AX0;       {*** запустили таймер с нуля  ***}
        ENA TIMER;                 { все это 0.8 мкс }

{ ожидание второго положительного фронта }
        AY1=60000;         { счетчик таймаута }
        DM(CntTout)=AY1;
        AY1=50;
        DM(CntTout2)=AY1;
        AY0=2;             { маска для входа }
Period32: AR=IO(0);
        AR=AR AND AY0;
        IF EQ JUMP Period032;     {*** дождались нуля ***}
        AX0=DM(CntTout);
        AR=AX0-AY0;
        DM(CntTout)=AR;
        IF NE JUMP Period32;
        AX0=60000;
        DM(CntTout)=AX0;
        AX0=DM(CntTout2);
        AR=AX0-AY0;
        DM(CntTout2)=AR;
        IF NE JUMP Period32;
{*** выход по таймауту *** }
        AX0=3;
        DM(ToutErr2)=AX0;
        AR=0;
        DM(Nd)=AR;
        ENA INTS;
        JUMP EndOfCommand;

Period032:
        AY1=60000;         { счетчик таймаута }
        DM(CntTout)=AY1;
        AY1=50;
        DM(CntTout2)=AY1;
        AY0=2;             { маска для входа }
Period42: AR=IO(0);
        AR=AR AND AY0;
        IF NE JUMP Period042;  {*** дождались единицы ***}
        AX0=DM(CntTout);
        AR=AX0-AY0;
        DM(CntTout)=AR;
        IF NE JUMP Period42;
        AX0=60000;
        DM(CntTout)=AX0;
        AX0=DM(CntTout2);
        AR=AX0-AY0;
        DM(CntTout2)=AR;
        IF NE JUMP Period42;
{*** выход по таймауту *** }
        AX0=4;
        DM(ToutErr2)=AX0;
        AR=0;
        DM(Nd)=AR;
        ENA INTS;
        JUMP EndOfCommand;

Period042:
        AX0=DM(Tcount_reg);     {*** считали таймер ***}
        DIS TIMER;             { запретили счет }
        AY0=0xffff;
        AR=AY0-AX0;           { счетчик реверсивный }
{        IF EQ JUMP EndOfCommand; }
        DM(Nd)=AR;            { обороты винта }
        ENA INTS;
        JUMP EndOfCommand;

Victoria
04.12.2008 15:43:31
#2

Гость

Re: Модификация lbios E14-440 для измерения периода

Длинно и дубово.
Используется как функция в CommandProccesing

Ситуация при отладке системы - наряду с правильными результатами измерений периода частотного сигнала проскакивают отсчеты, соответствующие когда таймер насчитал 0 или 1 отсчет.
Не пойму где возможная ошибка.

05.12.2008 10:56:15
#3

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,495

Re: Модификация lbios E14-440 для измерения периода

Вопросы по исходному коду:
1. Зачем при выходе из обработки команды используется оператор глобального разрешения прерываний ENA INTS? До этого прерывания где-то глобально запрещались?
2. По поводу работы таймера:
DIS TIMER;
AX0=255;
DM(Tscale_reg)=AX0;
AX0=0xFFFF;
DM(Tperiod_reg)=AX0; { такт таймера 5.3125 мкс }
AX0=0xFFFF;
DM(Tcount_reg)=AX0; {*** запустили таймер с нуля ***}
ENA TIMER; { все это 0.8 мкс }

Если это важно, то такт таймера будет не 5.3125 мкс, а 5.3333333 мкс.  А величина 0.8 мкс к чему относится?

P.S. Я бы для реализации Вашей задачи запользовал линию 19 (INT) внешнего цифрового разъёма модуля. Она заведена прямёхонько на прерывание IRQ0 DSP.

Victoria
05.12.2008 11:46:24
#4

Гость

Re: Модификация lbios E14-440 для измерения периода

Сергей, спасибо за просмотр длинного кода.

1. Это половинка подпрограммы, соответствующая измерению периода оборотов компрессора низкого давления, в первой половинке (она полностью аналогична этой) измеряется период оборотов винта.
В начале п/п прерывания глобально запрещаю (это пробовала только для отладки, на самом деле это не важно).
2. Соответственно, поэтому и прерывание IRQ0 не использую.
3. К слову - была мысль использовать таймерное прерывание для контроля переполнения вместо таймаута, но пока остановилась на этом варианте.
4. 5.333333 мкс. Да действительно, тут я не права (коэффициент - 256, а не 255).
0.8 мкс - "мусорный" комментарий, извините.

А в целом мнение? Есть ли ошибка в программе, которая может привести к появлениям неверных
отсчетов (иногда возникают 0,1 вместо кода периода, лежащего в диапазоне 4000-20000)?

05.12.2008 14:14:55
#5

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,495

Re: Модификация lbios E14-440 для измерения периода

Ошибок в коде вроде бы нет. Суть Вашего алгоритма проста - перманентный опрос цифровой линии. И если входной цифровой сигнал имеет затянутые фронты, то вполне возможны сбои, о которых Вы упоминали. Поэтому с Вашей стороны требуется написать ответы на вопросы, заданные в самом конце ветки "Помехи при вводе цифровых сигналов (E14-440)":
http://www.lcard.ru/forumthreads/6332