Блок определения ошибок подключения
Микросхема производит определение корректности подключения датчика и детектирование ошибок преобразования. Причина появления ошибки записывается в регистры C1Stat/C2Stat. При наличии ошибки в регистрах C1Stat/C2Stat значения скорости и координаты могут принимать некорректные значения.
Регистр состояния и маски
Все флаги ошибок и состояния преобразователя собраны в регистре C1Stat (адрес 30, преобразователь 1) и C2Stat (адрес 62, преобразователь 2). Распределение бит:
| Бит | Флаг | Назначение |
|---|---|---|
| 15 | NLock | Контур в неустановившемся режиме (ошибка слежения превышает порог) |
| 14..13 | quadrant | Квадрант результата (не влияет на Ready) |
| 12 | — | зарезервирован (всегда 0) |
| 11 | Kontur_NotENA | Контур ожидает условий запуска |
| 10 | RCV_NotRDY | Опорная частота не восстановлена |
| 9 | MISS_EXREF | Отсутствие опорного сигнала EX_REF |
| 8 | EX_PH_OUTRANGE | Большой сдвиг фазы опоры (≥ ±40°) |
| 7 | C_LOOP_OVF | Переполнение интегратора следящего контура |
| 6 | UIN_HIGH | Амплитуда сигналов слишком велика |
| 5 | UIN_LOW | Амплитуда сигналов слишком мала |
| 4 | CORR_OVF | Переполнение после коррекции усиления |
| 3 | ADC_OVF | Переполнение из-за большой постоянной составляющей |
| 2 | CLIP_COS | Переполнение АЦП по каналу cos |
| 1 | CLIP_SIN | Переполнение АЦП по каналу sin |
| 0 | HW_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-битном коде АЦП. Флаг срабатывает при точном равенстве кода одному из двух крайних (насыщающих) значений:
Срабатывание — на двух конкретных кодах (не на диапазон «около шкалы»): даже 0x7FE/+2046 флага не вызывает. Маскируются битами MSK_CLIP_SIN (бит 1) и MSK_CLIP_COS (бит 2). Сбрасываются, если в течение ≈ 2,5 мс не было новых срабатываний.
ADC_OVF — большая постоянная составляющая
Вычисляется в ad3s_handler_cic на сигнале после удаления постоянной составляющей res = ADC − offset, где offset — среднее значение, накопленное CIC-фильтром. Флаг срабатывает, когда результат выходит за пределы 12-битного диапазона:
Аппаратно это проверяется как несовпадение знаковых бит: res[12] XOR res[11]. Срабатывание означает, что постоянная составляющая слишком велика — сигнал невозможно отцентровать внутри диапазона АЦП (либо АЦП находится в насыщении). Маскируется битом MSK_ADC_OVF (бит 3). Сбрасывается, если в течение ≈ 18 с не было выхода за диапазон.
CORR_OVF — переполнение после коррекции усиления
Вычисляется в ad3s_handler_ampcorrector при масштабировании сигнала коэффициентами C1KampS/C1KampC. Внутреннее преобразование:
Произведение Sin1·Kamp (30 бит) проверяется на переполнение 13-битного выходного окна; флаг срабатывает, когда защитные старшие биты не являются чистым расширением знака, то есть когда скорректированный сигнал выходит за внутреннюю разрядность:
Единичное усиление соответствует 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 амплитуда вычисляется по формуле
где Sin1 и Cos1 – сигналы на входе следящего контура (амплитудой от -1 до +1).

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

Внутреннее сравнение выполняется в масштабе ×16. Текущая метрика R доступна для чтения в регистре C1Amp_metric (адрес 23; для канала 2 — C2Amp_metric, адрес 55). Регистр хранит Amp_metric = R/4 в единицах АЦП (номинальное значение 400); метрика пиково удерживается по полупериоду опоры (кроме режима DC_carrier, где используется мгновенное значение):
Поля 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). Порог срабатывания:
Для двух меандров равной скважности доля тактов с несовпадением уровней равна 2δ/360°, где δ — фазовый сдвиг. Отсюда порогу 7/32 соответствует
Маскируется битом MSK_EX_PH_OUTR (бит 9). Сдвиг задаётся регистром C1ExPhShft (задержка EX_REF в тактах Fclk) — им подстраивают опору до исчезновения флага.
MISS_EXREF — отсутствие опорного сигнала
Вычисляется в ad3s_exrecover. Внутренний счётчик in_cnt (16 бит) считает такты между спадами EX_REF. Флаг срабатывает, когда счётчик достигает максимума, ни разу не обнаружив спада:
То есть опорный сигнал отсутствует или застопорен дольше 65535 отсчётов (≈ 1 с; норма — переключения EX_REF чаще 10 Гц). Сбрасывается при обнаружении спада EX_REF. Маскируется битом MSK_MISS_EXREF (бит 10).
NLock — ошибка слежения
Вычисляется в ad3s_kontur по демодуляционной угловой ошибке — разности между входными сигналами и сигналами внутренней модели. Метрика ошибки доступна в регистре C1Err_metric (адрес 22; канал 2 — C2Err_metric, адрес 54) и равна
где , — сигналы внутренней модели (выходы контура). Флаг сравнивает модуль метрики с 16-битным порогом Lock_th (регистр C1Lock_th, адрес 10):
На старте NLock удерживается в 1 до получения двух достоверных полупериодов опоры (первичный захват контура). Сравнение выполняется по пиковому значению за полупериод опоры (для модулированных сигналов; в режиме 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:
Расчёт порогов под реальный сигнал:
- Подайте рабочий сигнал и считайте
C1Amp_metric(адрес 23) — получите значениеM. - Amp_hth (адрес 8, биты [15:8]) =
ceil(M_верх / 16), гдеM_верх— граница «амплитуда слишком велика» (на 10–20 % вышеM). - 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_верх = 480→Amp_hth = ceil(480 / 16) = 30; - нижняя граница (амплитуда −20 %):
M_ниж = 320→Amp_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).