Миландр
https://forum.milandr.ru/

Микросхема преобразователь угол-код для СКВТ
https://forum.milandr.ru/viewtopic.php?f=57&t=2431
Страница 19 из 21

Автор:  urban81 [ 2019-сен-23 08:26 ]
Заголовок сообщения:  Re: Микросхема преобразователь угол-код для СКВТ

Alex1 писал(а):
Добрый день,

Угол считывается как раз с 0x10. Но нужно сначала немного понастраивать. Как минимум записать в регистры 0x18, 0x1A, 0x1E.
Всем здравствуйте. Вот моя программа настройки на данный момент в виде нескольких функций:
template <const unsigned int Bits>
void AngleCode<Bits>::Set_PLL_config_RW(){

	Reg2Tx reg2Tx;

	reg2Tx.bit.bit0_2 = RW;

	reg2Tx.bit.adderss = 0x00;
	reg2Tx.bit.bit_P = calcCheckParity0(reg2Tx.word);

	pLL_config_0x00.address = reg2Tx.word;
	pLL_config_0x00.pLL_config.bit.PLL_N = 10;
	pLL_config_0x00.pLL_config.bit.PLL_Q = 2;
	pLL_config_0x00.pLL_config.bit.ADC_cycle = 17;

	TxBuffer = (volatile uint16_t*)&pLL_config_0x00;
}
template <const unsigned int Bits>
void AngleCode<Bits>::Set_AFE_config_RW(){

	Reg2Tx reg2Tx;

	reg2Tx.bit.bit0_2 = RW;

	reg2Tx.bit.adderss = 0x02;
	reg2Tx.bit.bit_P = calcCheckParity0(reg2Tx.word);

	aFE_config_0x02.address = reg2Tx.word;
	Config_01.Reg.aFE_config_0x02.address = reg2Tx.word;

	aFE_config_0x02.aFE_config.bit.VREF_en = 1;
	aFE_config_0x02.aFE_config.bit.EXT_RES_iREF = 0;
	aFE_config_0x02.aFE_config.bit.OFFSET_LOW = 0;
	aFE_config_0x02.aFE_config.bit.NDIFF_OFF = 1;
	aFE_config_0x02.aFE_config.bit.OPA1_en = 1;
	aFE_config_0x02.aFE_config.bit.OPA2_en = 1;
	aFE_config_0x02.aFE_config.bit.DAC1_en = 1;
	aFE_config_0x02.aFE_config.bit.DAC2_en = 0;
	aFE_config_0x02.aFE_config.bit.bit8_13 = 0;
	aFE_config_0x02.aFE_config.bit.OSC_BYP = 1;
	aFE_config_0x02.aFE_config.bit.OSC_DIS = 0;

	TxBuffer = (volatile uint16_t*)&aFE_config_0x02;
}
template <const unsigned int Bits>
void AngleCode<Bits>::Set_Mode_state_RW(){

	Reg2Tx reg2Tx;

	reg2Tx.bit.bit0_2 = RW;

	reg2Tx.bit.adderss = 0x04;
	reg2Tx.bit.bit_P = calcCheckParity0(reg2Tx.word);

	mode_stat_0x04.address = reg2Tx.word;
	mode_stat_0x04.mode_stat.bit.CONV1_en = 1;
	mode_stat_0x04.mode_stat.bit.CONV2_en = 1;
	mode_stat_0x04.mode_stat.bit.Sample_src = 3;
	mode_stat_0x04.mode_stat.bit.SPI_CRC_en = 1;
	mode_stat_0x04.mode_stat.bit.Mode = 0;

	TxBuffer = (volatile uint16_t*)&mode_stat_0x04;
}
template <const unsigned int Bits>
void AngleCode<Bits>::Set_C1Cntrl_RW(){

	Reg2Tx reg2Tx;

	reg2Tx.bit.bit0_2 = RW;

	reg2Tx.bit.adderss = 0x18;
	reg2Tx.bit.bit_P = calcCheckParity0(reg2Tx.word);

	c1Cntrl_0x18.address = reg2Tx.word;
	c1Cntrl_0x18.C1Cntrl.bit.Ex_on = 1;
	c1Cntrl_0x18.C1Cntrl.bit.Ex_amp = 1;
	c1Cntrl_0x18.C1Cntrl.bit.Ex_recovery_en = 0;
	c1Cntrl_0x18.C1Cntrl.bit.Ex_source = 0;
	c1Cntrl_0x18.C1Cntrl.bit.DC_carrier = 1;
	c1Cntrl_0x18.C1Cntrl.bit.Sensor_mode = 0;
	c1Cntrl_0x18.C1Cntrl.bit.LBW = 14;
	c1Cntrl_0x18.C1Cntrl.bit.DC_correction = 0;

	TxBuffer = (volatile uint16_t*)&c1Cntrl_0x18;
}
template <const unsigned int Bits>
void AngleCode<Bits>::Set_C1ResCntrl_RW(){

	Reg2Tx reg2Tx;

	reg2Tx.bit.bit0_2 = RW;

	reg2Tx.bit.adderss = 0x1A;
	reg2Tx.bit.bit_P = calcCheckParity0(reg2Tx.word);

	c1ResCntrl_0x1A.address = reg2Tx.word;
	c1ResCntrl_0x1A.C1ResCntrl.bit.Enc_en = 0;
	c1ResCntrl_0x1A.C1ResCntrl.bit.Vel_resolution = 3;
	c1ResCntrl_0x1A.C1ResCntrl.bit.Coord_hist = 0;
	c1ResCntrl_0x1A.C1ResCntrl.bit.SPI_ext_en = 0;
	c1ResCntrl_0x1A.C1ResCntrl.bit.Dir_out_en = 0;
	c1ResCntrl_0x1A.C1ResCntrl.bit.Coord_resolution = 2;

	TxBuffer = (volatile uint16_t*)&c1ResCntrl_0x1A;
}
template <const unsigned int Bits>
void AngleCode<Bits>::Set_C1EXInc_RW(){

	Reg2Tx reg2Tx;

	reg2Tx.bit.bit0_2 = RW;

	reg2Tx.bit.adderss = 0x1E;
	reg2Tx.bit.bit_P = calcCheckParity0(reg2Tx.word);

	c1EXInc_0x1E.address = reg2Tx.word;
	c1EXInc_0x1E.C1EXInc = 4194;

	TxBuffer = (volatile uint16_t*)&c1EXInc_0x1E;
}
template <const unsigned int Bits>
void AngleCode<Bits>::Set_C1Mask_RW(){

	Reg2Tx reg2Tx;

	reg2Tx.bit.bit0_2 = RW;

	reg2Tx.bit.adderss = 0x16;
	reg2Tx.bit.bit_P = calcCheckParity0(reg2Tx.word);

	c1Mask_0x16.address = reg2Tx.word;
	c1Mask_0x16.C1Mask.bit.MSK_NLock = 0;

	TxBuffer = (volatile uint16_t*)&c1Mask_0x16;
}
template <const unsigned int Bits>
void AngleCode<Bits>::Set_Mask_RW(){

	Reg2Tx reg2Tx;

	reg2Tx.bit.bit0_2 = RW;

	reg2Tx.bit.adderss = 0x06;
	reg2Tx.bit.bit_P = calcCheckParity0(reg2Tx.word);

	mask_0x06.address = reg2Tx.word;
	mask_0x06.mask.bit.MSK_ECC_err = 0;

	TxBuffer = (volatile uint16_t*)&mask_0x06;
}
В них что то неправильно. Прошу помощи. Всем заранее спасибо.

Автор:  Alex1 [ 2019-сен-23 12:28 ]
Заголовок сообщения:  Re: Микросхема преобразователь угол-код для СКВТ

Не понятно какие симптомы.

1. Тактирование от внешнего генератора? Какой частоты? Для включения OSC_BYP=1 есть определенная процедура (см. описание бита), не ясно, выполняется ли она. Какой получается FINT?
2. Есть ли на входе датчика сигнал, правильной ли он частоты и амплитуды? Ex_amp возможно нужно ставить 0 это полная амплитуда.
3. Есть ли на входах (IOSA/IOCA) микросхемы сигналы от датчика, правильной ли они амплитуды? Ведут ли себя адекватно вращению датчика, остаются ли правильной амплитуды при вращении?
4. Установлен бит SPI_CRC_en, правильно ли все записывается в регистры? Если на стороне процессора не рассчитывается бит CRC (или рассчитывается как то не так), то микросхема будет такую запись в регистры игнорировать. Я бы рекомендовал отключить CRC до момента когда все остальное заработает.
5. DC_carrier = 1; DC_correction = 0; Ex_recovery_en = 0; - это не для СКВТ настройки, для какого нибудь не стандартного резистивного датчика. Если это не СКВТ вообще может быть много ньюансов, тут нужны все подробности что именно не работает, или не устраивает. Для СКВТ эти биты лучше оставить по умолчанию.
6. Там есть регистр C?Stat - было бы неплохо его почитав поставив маску во все 1. На основании ошибок в нем что то еще можно понять

Автор:  urban81 [ 2019-сен-23 15:33 ]
Заголовок сообщения:  Re: Микросхема преобразователь угол-код для СКВТ

Alex1 писал(а):
Не понятно какие симптомы.
Здравствуйте:
1. Тактирование от внешнего генератора 30МГц. Регистр AFE_config отвечает тем, что в него записываю. Это можно считать положительным признаком? FINT 50МГц.
2. На входе датчика сигнал sin и cos, 4КГц и размах 800мВ на входах 12 и 13.
3. Есть на входах (IOSA/IOCA) микросхемы сигналы от датчика и они правильной амплитуды. Ведут себя адекватно вращению датчика, остаются правильной амплитуды.
4. ...Отключил...
5. ...Оставил по умолчанию...
6. С1Stat отвечает нулем.

Автор:  Alex1 [ 2019-сен-23 17:38 ]
Заголовок сообщения:  Re: Микросхема преобразователь угол-код для СКВТ

Входная частота PLL от 2 до 16МГц, в данном случае 30МГц. Можно записать PLL_N = 0 отключив PLL, тогда работать будет на 30МГц, либо поменять генератор на 50 (с отключенной PLL) или от 2-16 с включенной. Хотя, если на выходе есть правильная частота, то как то она все таки завелась...
А что не работает?

Автор:  urban81 [ 2019-сен-24 09:41 ]
Заголовок сообщения:  Re: Микросхема преобразователь угол-код для СКВТ

Alex1 писал(а):
Входная частота PLL от 2 до 16МГц, в данном случае 30МГц. Можно записать PLL_N = 0 отключив PLL, тогда работать будет на 30МГц, либо поменять генератор на 50 (с отключенной PLL) или от 2-16 с включенной. Хотя, если на выходе есть правильная частота, то как то она все таки завелась...
А что не работает?
Всем здравствуйте. Дискреты приходят от 0 до 65535. Пробую по совету...от внешнего генератора... Не прошиваю PLL - получается 12КГц на входе датчика. А какими делителями теперь "правильнее" добиться 4Кг? Всем заранее спасибо за помощь.

Автор:  Alex1 [ 2019-сен-24 10:17 ]
Заголовок сообщения:  Re: Микросхема преобразователь угол-код для СКВТ

Добрый день,

Выводы 14, 31, 51 соединены между собой? Если да, то можете прислать схему в личку, посмотрю.

По тактированию, лучше: Использовать внешний генератор 50МГц с откл. PLL, либо кварц/генератор на 2-16МГц (10МГц, например) и PLL настроить делителями.
В текущей ситуации можно 12кГц можно превратить в 4кГц записав в регистр C1Exinc значение в 4 раза больше.
Вложение:

Автор:  Steak777 [ 2019-сен-30 09:17 ]
Заголовок сообщения:  Re: Микросхема преобразователь угол-код для СКВТ

Зарегистрирован: 2018-сен-05 16:25
Сообщения: 8

В каком состоянии будут находится выводы микросхемы1310нм025 при сбрасывании? , при подачи активного 0 на вывод nreset (26)

Автор:  Artem1 [ 2019-сен-30 14:51 ]
Заголовок сообщения:  Re: Микросхема преобразователь угол-код для СКВТ

Steak777 писал(а):
Зарегистрирован: 2018-сен-05 16:25
Сообщения: 8

В каком состоянии будут находится выводы микросхемы1310нм025 при сбрасывании? , при подачи активного 0 на вывод nreset (26)
При установке nReset=0 выводы ENC* остаются в том же состоянии, Ready1, Ready2, Ready, Dir1, Dir2 устанавливаются в 0.
После отпускания nReset, ENC*, Dir1, Dir2 устанавливаются в высокоимпедансное состояние.

Автор:  Storoj [ 2019-окт-29 20:20 ]
Заголовок сообщения:  Re: Микросхема преобразователь угол-код для СКВТ

Здравствуйте

Есть 2 м/сх 1310НМ025. Выход источника опорного напряжения первой микросхемы может потянуть вторую, настроенную на работу с внешним ИОН ?

Автор:  Artem1 [ 2019-окт-31 12:47 ]
Заголовок сообщения:  Re: Микросхема преобразователь угол-код для СКВТ

Storoj писал(а):
Здравствуйте

Есть 2 м/сх 1310НМ025. Выход источника опорного напряжения первой микросхемы может потянуть вторую, настроенную на работу с внешним ИОН ?
Здравствуйте! Подскажите, пожалуйста, для чего Вам необходимо подобное включение микросхем?
Разработчики на подобное использование точно не рассчитывали и данный выход ИОН сделан только для того, чтобы на него повесить конденсатор.

Автор:  Viksanders [ 2019-дек-20 06:40 ]
Заголовок сообщения:  Re: Микросхема преобразователь угол-код для СКВТ

Снова здравствуйте!
Возникли ещё некоторые вопросы. Я пытаюсь использовать режим параллельной выдачи результата, т.е. SPI_ext_en = 1, ENC_en = 0 в регистре C1ResCntrl. Пин VC всегда 0. По выводам ENC1A, ENC1B и ENC10 всё прекрасно выдаётся и я успешно использую эти данные.
Но, допустим, я хочу вклиниться в эту непрерывную параллельную выдачу результата прочитать регистр Mode_stat, меня интересуют флаги этого регистра, а конкретно ECC_err для реализации защиты от сбоев микросхемы.
Я делаю это следующим образом. Когда я хочу прочитать параллельный результат (забрать угол, скорость и статус канала с ножек энкодера), то соответственно выставляю SDI (он же MOSI) в 0, т.е. отправляю по SPI нулевой байт. На следующем такте SPI данные должны придти, и в этот же следующий такт я отправляю команду на чтение регистра Mode_stat. Следующий такт должен выдать значение, записанное по этому регистру. Как при этом должны вести себя ножки ENC? Дело в том, что они выдают какую-то информацию всегда, отдалённо похожую на правду. В целом, в результате таких действий, информация, полученная по ENC, становится некорректной, даже если пропускать те значения, которые были получены после выдачи команды на чтение Mode_stat. Конкретнее: угол становится слишком ступенчатым, на 360 градусов получается что-то около 4 дискретов.
Это так и задумано?
Я ещё попробую читать Mode_stat допустим раз в 1000 измерений, посмотрю, как он будет себя вести, но читать через раз точно не получается.
В качестве альтернативы получилось реализовать чтение угла, скорости и Mode_stat последовательно через чтение их регистров, но тогда данные собираются слишком медленно и меня это, увы, не устраивает.

И ещё такой вопрос: достаточно ли будет читать биты регистра Mode_stat, чтобы по их состоянию реализовать защиту от одиночного сбоя, например от ТЗЧ (тяжёлая заряженная частица)? Особенно интересует ECC_err. Не совсем понятно из спецификации, в каких случаях он срабатывает. Кстати, он не работает в rev.3. Планируете ли исправлять в следующей ревизии и, раз уж речь зашла, когда она будет?
С уважением.

UPD: Всё получилось. Делаю следующим образом. Вклиниваюсь в параллельную выдачу чтением Mode_stat не через раз, а один раз в 1000 измерений. При этом угол, скорость и статус канала по ENC идут корректные, по SDO читаю Mode_stat, проверил осциллографом, всё как надо (ну кроме ECC_err, конечно же). Частота между посылками SPI равняется 175кГц.

Остальные вопросы по-прежнему интересуют.

Автор:  Alex1 [ 2019-дек-20 13:18 ]
Заголовок сообщения:  Re: Микросхема преобразователь угол-код для СКВТ

Добрый день,

В Mode_stat собраны все ошибки. Лучше, конечно, завести сигнал Ready на прерывание, и читать регистр Mode_stat по нему.
ECC_err - выставляется, если обнаруживается двойная ошибка в регистре (одинарную оно может исправить, код SecDed). ЕСС защищены только регистры, вычислительные ядра не защищены. Поэтому, лучше 2 канала дублировать, причем снаружи микросхемы и сравнивать значения идущие с них (есть спец. битик в регистре Mode_stat).
Дополнительно, можно изредка читать регистр 0x0C (начиная с 3 ревизии), это просто счетчик и он должен просто меняться. Позволяет отследить проблему остановки тактового сигнала (без тактирования ничего не работает, и флаги остаются в своем последнем состоянии).

По работе при смене режимов SPI - нужно моделировать, наверное есть какой то ньюанс, сразу сложно сказать.
В новой ревизии все найденные ошибки будут исправлены, а будет она явно не раньше конца следующего года.

Автор:  Storoj [ 2019-дек-22 16:25 ]
Заголовок сообщения:  Re: Микросхема преобразователь угол-код для СКВТ

Здравствуйте,
А когда ревизия 3 будет доступна к покупке?

Автор:  Alex1 [ 2019-дек-23 08:53 ]
Заголовок сообщения:  Re: Микросхема преобразователь угол-код для СКВТ

Добрый день,

3 ревизия - это текущая. Новая ревизия = четвертая, про нее ничего пока не известно.

Автор:  Viksanders [ 2019-дек-24 13:54 ]
Заголовок сообщения:  Re: Микросхема преобразователь угол-код для СКВТ

Alex1, благодарю за ваш ответ.
Использую ПЛИС, так что мне не трудно читать Mode_stat каждое 1001-е измерение, но идея с Ready понравилась, упустил этот момент, когда читал пдфку.

Что касается дублирования каналов "снаружи микросхемы", вы ведь имели ввиду независимую работу преобразователей, т.е. регистр Mode = 000b в Mode_stat? При этом я включил ОУ на втором канале и подал на них то же, что и на ОУ первого канала (т.е. сигналы с выходных обмоток СКВТ, схему подключения повторил как для первого). EXI1 и EXI2 соединил проводком на плате, генератор и ЦАП второго канала отключены. Для первого канала выставил Ex_source = 00b, для второго - 01b, т.е. у каждого канала работает свой блок восстановления опорной частоты (Ex_recovery_en = 1 для 1 и 2 каналов), но второй дублирует первый.
При этом первый канал как работал, так и работает, а второй выдаёт в C2Stat биты NLock, Vel_ovf и UIN_LOW. Осциллографом проверил, что IOCA1==IOCA2, IOSA1==IOSA2. Вместо угла и скорости по второму каналу некорректная информация. В Mode_stat выставились nReady2 и Not_equal. Что я делаю не так?
Пробовал этот же способ, но ставил Ex_source = 10b, EXI естественно разъединял. Результат такой же. Заметил, что EXI1 немного опережает по фазе EXI2 (ну как я понял это так и должно быть).

Попробовал так же физически отключить второй канал, а так же выставить OPA2_en = 0. Выставил Mode = 010b, Ex_source оставил таким же (00 первый канал и 01 второй), соединение EXI1,2 оставил. Всё прекрасно работает, углы совпадают с точностью до бита. Но я не совсем уверен, достаточно ли этого для резервирования.

Ещё такой момент. Необходимо ли резервировать генератор и цап обмотки возбуждения? Если отвалится один канал целиком, вместе с ним ведь перестанет работать и генератор ОВ.
Спасибо.

Страница 19 из 21 Часовой пояс: UTC+03:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/