Перейти к основному содержимому

Блок определения ошибок подключения

Микросхема производит определение корректности подключения датчика и детектирование ошибок преобразования. Причина появления ошибки записывается в регистры C1Stat/C2Stat. При наличии ошибки в регистрах C1Stat/C2Stat значения скорости и координаты могут принимать некорректные значения.

Регистр состояния и маски

Все флаги ошибок и состояния преобразователя собраны в регистре C1Stat (адрес 30, преобразователь 1) и C2Stat (адрес 62, преобразователь 2). Распределение бит:

БитФлагНазначение
15NLockКонтур в неустановившемся режиме (ошибка слежения превышает порог)
14..13quadrantКвадрант результата (не влияет на Ready)
12зарезервирован (всегда 0)
11Kontur_NotENAКонтур ожидает условий запуска
10RCV_NotRDYОпорная частота не восстановлена
9MISS_EXREFОтсутствие опорного сигнала EX_REF
8EX_PH_OUTRANGEБольшой сдвиг фазы опоры (≥ ±40°)
7C_LOOP_OVFПереполнение интегратора следящего контура
6UIN_HIGHАмплитуда сигналов слишком велика
5UIN_LOWАмплитуда сигналов слишком мала
4CORR_OVFПереполнение после коррекции усиления
3ADC_OVFПереполнение из-за большой постоянной составляющей
2CLIP_COSПереполнение АЦП по каналу cos
1CLIP_SINПереполнение АЦП по каналу sin
0HW_NotRDYКоррекция АЦП не выполнена
Значение по сбросу

По сбросу регистр Stat = 0x0801 — установлены биты 0 (HW_NotRDY) и 11 (Kontur_NotENA); остальные сброшены.

Регистр C1Mask (адрес 12) / C2Mask (адрес 44) управляет вычислением флагов. Биты регистра Mask соответствуют битам Stat «один к одному»:

  • Mask.бит = 0 — вычисление соответствующего бита Stat блокируется и он принимается равным 0 (флаг выключен);
  • Mask.бит = 1 — бит Stat отражает действительное состояние флага.

Флаги в Stat защёлкиваются («липкие»): установившись в 1, бит удерживается до прохождения цикла обновления (REFRESH_ERR), в течение которого новых срабатываний не было. После этого бит сбрасывается. Период обновления зависит от источника флага: для быстрых флагов (CLIP, CORR_OVF, UIN_*, EX_PH_OUTRANGE) он составляет ≈ 2,5 мс, для ADC_OVF (связанного с длинным циклом CIC-усреднения) — ≈ 18 с. Сигналы Ready1/Ready2 формируются в 1, когда все немаскированные биты Stat из набора равны 0. Биты 14..13 (quadrant), 12 и 10 (MISS_EXREF) не влияют на Ready.

Условия срабатывания флагов

Ниже для каждого флага приведено точное условие срабатывания, извлечённое из кода RTL. Значения сигналов — в единицах АЦП: откорректированный 12-битный код (знак в бите [11], диапазон −2048…+2047 LSB), что соответствует нормированной амплитуде ±1.

CLIP_SIN, CLIP_COS — переполнение АЦП

Вычисляются в ad3s_handler_calcclip на синхронизированном 12-битном коде АЦП. Флаг срабатывает при точном равенстве кода одному из двух крайних (насыщающих) значений:

CLIP=1    (ADC=0x7FF=+2047)    или    (ADC=0x800=2048).(14a)\text{CLIP} = 1 \;\Leftrightarrow\; (\text{ADC} = \text{0x7FF}=+2047)\;\; \text{или}\;\; (\text{ADC} = \text{0x800}=-2048). \tag{14a}

Срабатывание — на двух конкретных кодах (не на диапазон «около шкалы»): даже 0x7FE/+2046 флага не вызывает. Маскируются битами MSK_CLIP_SIN (бит 1) и MSK_CLIP_COS (бит 2). Сбрасываются, если в течение ≈ 2,5 мс не было новых срабатываний.

ADC_OVF — большая постоянная составляющая

Вычисляется в ad3s_handler_cic на сигнале после удаления постоянной составляющей res = ADC − offset, где offset — среднее значение, накопленное CIC-фильтром. Флаг срабатывает, когда результат выходит за пределы 12-битного диапазона:

ADC_OVF=1    ressin2048    или    rescos2048.(14b)\text{ADC\_OVF} = 1 \;\Leftrightarrow\; |res_{sin}| \ge 2048 \;\; \text{или}\;\; |res_{cos}| \ge 2048. \tag{14b}

Аппаратно это проверяется как несовпадение знаковых бит: res[12] XOR res[11]. Срабатывание означает, что постоянная составляющая слишком велика — сигнал невозможно отцентровать внутри диапазона АЦП (либо АЦП находится в насыщении). Маскируется битом MSK_ADC_OVF (бит 3). Сбрасывается, если в течение ≈ 18 с не было выхода за диапазон.

CORR_OVF — переполнение после коррекции усиления

Вычисляется в ad3s_handler_ampcorrector при масштабировании сигнала коэффициентами C1KampS/C1KampC. Внутреннее преобразование:

out=Sin1Kamp1024,Kamp[0,65535].(14c)out = \frac{Sin1 \cdot Kamp}{1024}, \qquad Kamp \in [0,\,65535]. \tag{14c}

Произведение Sin1·Kamp (30 бит) проверяется на переполнение 13-битного выходного окна; флаг срабатывает, когда защитные старшие биты не являются чистым расширением знака, то есть когда скорректированный сигнал выходит за внутреннюю разрядность:

CORR_OVF=1    Sin1KampS1024>4095    или    Cos1KampC1024>4095.(14d)\text{CORR\_OVF} = 1 \;\Leftrightarrow\; \left| \frac{Sin1 \cdot KampS}{1024} \right| > 4095 \;\; \text{или}\;\; \left| \frac{Cos1 \cdot KampC}{1024} \right| > 4095. \tag{14d}

Единичное усиление соответствует Kamp ≈ 1024 (значение по умолчанию). С учётом этого переполнение возникает примерно при Kamp > 2048 для сигнала, близкого к полной шкале (запас ≈ ×2 от единичного усиления); при меньшей амплитуде сигнала допустимы большие Kamp. Маскируется битом MSK_CORR_OVF (бит 4). Сбрасывается, если в течение ≈ 2,5 мс не было переполнений.

UIN_HIGH, UIN_LOW — пороги амплитуды

Микросхема определяет корректность амплитуды сигнала на входе следящего контура путём сравнения амплитуды R, представленной в полярных координатах, с порогами Amp_hth и Amp_lth. Вычисление R (ad3s_handler_calcuin) зависит от Sensor_mode:

В режиме Sensor_mode==0 амплитуда вычисляется по формуле

R=Sin12+Cos12,(15)R = \sqrt{Sin1^2 + Cos1^2}, \tag{15}

где Sin1 и Cos1 – сигналы на входе следящего контура (амплитудой от -1 до +1).

Определение амплитуды и наличия сигналов на входе преобразователя в режиме Sensor_Mode=0
Определение амплитуды и наличия сигналов на входе преобразователя в режиме Sensor_Mode=0

В режимах Sensor_mode==1 и Sensor_mode==2 амплитуда вычисляется по формуле

R=Sin1+Cos1,(16)R = |Sin1 + Cos1|, \tag{16}

где Sin1 и Cos1 – сигналы на входе следящего контура (амплитудой от -1 до +1).

Определение амплитуды и наличия сигналов на входе преобразователя в режимах Sensor_Mode=1, Sensor_Mode=2
Определение амплитуды и наличия сигналов на входе преобразователя в режимах Sensor_Mode=1, Sensor_Mode=2

Внутреннее сравнение выполняется в масштабе ×16. Текущая метрика R доступна для чтения в регистре C1Amp_metric (адрес 23; для канала 2 — C2Amp_metric, адрес 55). Регистр хранит Amp_metric = R/4 в единицах АЦП (номинальное значение 400); метрика пиково удерживается по полупериоду опоры (кроме режима DC_carrier, где используется мгновенное значение):

  • UIN_HIGH = 1 при Amp_metric ≥ Amp_hth × 16;
  • UIN_LOW = 1 при Amp_metric < Amp_lth × 16.

Поля Amp_hth (биты [15:8]) и Amp_lth (биты [7:0]) регистра C1Amp_th — по 8 бит (0…255). Маскируются битами MSK_UIN_HIGH (бит 6) и MSK_UIN_LOW (бит 5).

EX_PH_OUTRANGE — большой сдвиг фазы опоры

Вычисляется в ad3s_exrecover сравнением логических уровней задержанной опоры ex_shifted и восстановленной опоры ex_recovered. Внутренний счётчик diff_cnt подсчитывает в пределах восстановленного периода T число тактов, на котором уровни различаются (XOR). Порог срабатывания:

EX_PH_OUTRANGE=1    diff_cnt732T.(14e)\text{EX\_PH\_OUTRANGE} = 1 \;\Leftrightarrow\; diff\_cnt \ge \frac{7}{32}\,T. \tag{14e}

Для двух меандров равной скважности доля тактов с несовпадением уровней равна 2δ/360°, где δ — фазовый сдвиг. Отсюда порогу 7/32 соответствует

δ18073239,4±40.(14f)\delta \ge 180^\circ \cdot \tfrac{7}{32} \approx 39{,}4^\circ \approx \pm 40^\circ. \tag{14f}

Маскируется битом MSK_EX_PH_OUTR (бит 9). Сдвиг задаётся регистром C1ExPhShft (задержка EX_REF в тактах Fclk) — им подстраивают опору до исчезновения флага.

MISS_EXREF — отсутствие опорного сигнала

Вычисляется в ad3s_exrecover. Внутренний счётчик in_cnt (16 бит) считает такты между спадами EX_REF. Флаг срабатывает, когда счётчик достигает максимума, ни разу не обнаружив спада:

MISS_EXREF=1    in_cnt=0xFFFF=65535    (без спада EX_REF).(14g)\text{MISS\_EXREF} = 1 \;\Leftrightarrow\; in\_cnt = \text{0xFFFF} = 65535 \;\;(\text{без спада EX\_REF}). \tag{14g}

То есть опорный сигнал отсутствует или застопорен дольше 65535 отсчётов (≈ 1 с; норма — переключения EX_REF чаще 10 Гц). Сбрасывается при обнаружении спада EX_REF. Маскируется битом MSK_MISS_EXREF (бит 10).

NLock — ошибка слежения

Вычисляется в ad3s_kontur по демодуляционной угловой ошибке — разности между входными сигналами и сигналами внутренней модели. Метрика ошибки доступна в регистре C1Err_metric (адрес 22; канал 2 — C2Err_metric, адрес 54) и равна

Err_metric=PHICOSSin1PHISINCos1    sin(θвхθмодели),(14h)Err\_metric = PHI_{COS}\cdot Sin1 - PHI_{SIN}\cdot Cos1 \;\propto\; \sin(\theta_{\text{вх}} - \theta_{\text{модели}}), \tag{14h}

где PHISINPHI_{SIN}, PHICOSPHI_{COS} — сигналы внутренней модели (выходы контура). Флаг сравнивает модуль метрики с 16-битным порогом Lock_th (регистр C1Lock_th, адрес 10):

NLock=1    Err_metric>Lock_th.(14i)\text{NLock} = 1 \;\Leftrightarrow\; |Err\_metric| > Lock\_th. \tag{14i}

На старте NLock удерживается в 1 до получения двух достоверных полупериодов опоры (первичный захват контура). Сравнение выполняется по пиковому значению Err_metric|Err\_metric| за полупериод опоры (для модулированных сигналов; в режиме DC_carrier — по мгновенному значению). Lock_th — безразмерная величина в тех же единицах, что и Err_metric (значение по умолчанию 300); её подбирают так, чтобы при нормальной работе срабатываний не было. Флаг может использоваться для определения большого отклонения вычисленной координаты от координаты датчика (например, из-за ускорения вала). Маскируется битом MSK_NLock (бит 15).

C_LOOP_OVF — переполнение интегратора контура

Вычисляется в ad3s_kontur и сигнализирует о насыщении второго (интегрирующего) звена следящего контура типа 2. Когда накопленная сумма выходит за разрядность, контур насыщается до ±полной шкалы и выставляется C_LOOP_OVF. Флаг актуален для датчиков с конечным диапазоном угла (Sensor_mode ≠ 0 — потенциометры и т. п.). В режиме Sensor_mode==0 (СКВТ/сельсин) срабатывание на упорах является вариантом нормальной работы и указывает на достижение координатой границы диапазона. Маскируется битом MSK_C_LOOP_OVF (бит 7).

Численные значения и расчёт порогов амплитуды

Текущее значение амплитуды R, с которым сравниваются пороги, доступно для чтения в регистре C1Amp_metric (адрес 23; для канала 2 — C2Amp_metric, адрес 55). Внутреннее сравнение выполняется в масштабе ×16:

  • UIN_HIGH = 1 при Amp_metric ≥ Amp_hth × 16;
  • UIN_LOW = 1 при Amp_metric < Amp_lth × 16.

Расчёт порогов под реальный сигнал:

  1. Подайте рабочий сигнал и считайте C1Amp_metric (адрес 23) — получите значение M.
  2. Amp_hth (адрес 8, биты [15:8]) = ceil(M_верх / 16), где M_верх — граница «амплитуда слишком велика» (на 10–20 % выше M).
  3. Amp_lth (биты [7:0]) = floor(M_ниж / 16), где M_ниж — граница «амплитуда слишком мала» (на 10–20 % ниже M).

Оба поля 8-битные (0…255). Значения по умолчанию (Amp_hth = 187, Amp_lth = 62) соответствуют амплитудам выше полного диапазона АЦП и фактически выключают эти флаги — для реального сигнала пороги следует пересчитать.

Пример

При номинальном сигнале M = C1Amp_metric = 400:

  • верхняя граница (амплитуда +20 %): M_верх = 480Amp_hth = ceil(480 / 16) = 30;
  • нижняя граница (амплитуда −20 %): M_ниж = 320Amp_lth = floor(320 / 16) = 20.

Диагностика при настройке (на примере канала 1)

a. Запишите C1Mask (адрес 12) = 0xFFFE. Запишите тип датчика в поле C1KonturStngs.Sensor_mode (адрес 13, биты [11:10]). При подключении сельсина установите AFE_config.Mode = 100. Включите АЦП и преобразователь: Mode_config.ADC_en (адрес 71, бит 14) = 1, CONV1_en (бит 10) = 1.

b. Запишите C1KonturStngs.LBW (биты [4:0]) = 4 (значение по умолчанию; при необходимости — по таблице полос пропускания). Запишите C1ResCntrl.Vel_resolution (биты [8:5]) = 7, Coord_resolution (биты [3:0]) = 2 (16-битная координата).

c. Двигая датчик, считывайте регистр C1Stat (адрес 30). В первую очередь убедитесь, что флаги CLIP_COS = 0, CLIP_SIN = 0, ADC_OVF = 0 всегда.

d. Флаги UIN_LOW, UIN_HIGH, CORR_OVF служат для диагностики сигналов после коррекции. При подключении СКВТ/сельсина и корректной настройке входного тракта они должны быть равны 0. При изменении регистров C1KampC, C1KampS, C1ExPhShft, C1KbiasC, C1KbiasS, C1fbias убедитесь, что новые флаги ошибки не появились. Если флаг UIN_HIGH или UIN_LOW ложный — пересчитайте пороги Amp_hth/Amp_lth по методике выше.

e. Вращая/двигая датчик, считывайте значения координаты C1Coord (адрес 16) и скорости C1Vel (адрес 24).

  • Если координата изменяется случайным образом по всему диапазону при неподвижном датчике: выключите преобразователь (CONV1_en = 0), затем снова включите (CONV1_en = 1). Если не помогло — повторите настройку сначала.
  • Если угол отличается на 180° или ЛРДТ находится на упоре: проверьте сигнал EXI1 — вероятно, он инверсный.
  • В режиме сельсина при нелинейном изменении угла (например, поворот на 90° даёт изменение только на 60°): неправильно подключены обмотки сельсина.
  • Для сдвига значения координаты относительно получаемой с датчика запишите значение в регистр C1Zero (адрес 11).