Vector IDE

Аватара пользователя
Лашкевич Максим
Сообщения: 342
Зарегистрирован: 30 дек 2015, 10:38

Re: Vector IDE

Сообщение Лашкевич Максим » 18 дек 2020, 09:49

Файла с отличиями нет, это два разных изделия, берите ТО на оба и смотрите ножки.
С уважением,
Лашкевич Максим.
skype: maxlashk
Инженер-программист ООО "НПФ Вектор", Москва.

Alexblv
Сообщения: 29
Зарегистрирован: 10 апр 2017, 15:55

Re: Vector IDE

Сообщение Alexblv » 18 дек 2020, 09:55

Файлик все таки нашел) Выводы АЦП остались прежними. Ток по фазе B (канал 18) аналогично неверный. Буду разбираться. Вопрос не совсем по теме, вы по третьей фазе ток каким то образом используете в реальных проектах (например для сравнения с рассчитанным и обнаружения утечки)?

Аватара пользователя
Лашкевич Максим
Сообщения: 342
Зарегистрирован: 30 дек 2015, 10:38

Re: Vector IDE

Сообщение Лашкевич Максим » 18 дек 2020, 10:02

Третий ток для формирования аварии если три вместе не сошлись. Может быть утечка, но обычно отказ датчиков
С уважением,
Лашкевич Максим.
skype: maxlashk
Инженер-программист ООО "НПФ Вектор", Москва.

Alexblv
Сообщения: 29
Зарегистрирован: 10 апр 2017, 15:55

Re: Vector IDE

Сообщение Alexblv » 21 дек 2020, 15:14

Здравствуйте, подскажите пожалуйста, попробовал на вашей отладочной плате на 14 пин Х6 (по схеме это ADC23) подать около 0,9 вольт. Результат тот же, в fast_calc измеряет NT_ADC->SEQ[3].FIFO_bit.DATA какие то числа в районе 61-67. Пробовал считать NT_ADC->DCVAL_bit[23].VAL; результат тот же.
Сама инициализация
void AdcDrv_init(TAdcDrv *p) {
// Запрет всех секвенсоров
NT_ADC->ACTSS = 0;

// Сброс счётчиков прерываний и измерений
NT_ADC->SEQ[0].OP = 0;
NT_ADC->SEQ[1].OP = 0;
NT_ADC->SEQ[2].OP = 0;
NT_ADC->SEQ[3].OP = 0;
NT_ADC->SEQ[4].OP = 0;
NT_ADC->SEQ[5].OP = 0;
NT_ADC->SEQ[6].OP = 0;
NT_ADC->SEQ[7].OP = 0;

//Включаем 2, 3, 4, 5, 6, 7 секвенсоры,
NT_ADC->ACTSS_bit.ASEN2 = 1;
NT_ADC->ACTSS_bit.ASEN3 = 1;
NT_ADC->ACTSS_bit.ASEN4 = 1;
NT_ADC->ACTSS_bit.ASEN5 = 1;
NT_ADC->ACTSS_bit.ASEN6 = 1;
NT_ADC->ACTSS_bit.ASEN7 = 1;
//Ставим маску прерывания (для 4 секвенсора, нам не надо 4 прерывания, достаточно одного)
NT_ADC->IM_bit.MASK4 = 1;
//Настраиваем источник запуска
NT_ADC->EMUX_bit.EM2 = 8; //запуск производится по команде SocA Блока ШИМ 3 для vector card
NT_ADC->EMUX_bit.EM3 = 8; //запуск производится по команде SocA Блока ШИМ 3 для vector card
NT_ADC->EMUX_bit.EM4 = 8; //запуск производится по команде SocA Блока ШИМ 3 для vector card
NT_ADC->EMUX_bit.EM5 = 8; //запуск производится по команде SocA Блока ШИМ 3 для vector card
NT_ADC->EMUX_bit.EM6 = 8; //запуск производится по команде SocA Блока ШИМ 3 для vector card
NT_ADC->EMUX_bit.EM7 = 8; //запуск производится по команде SocA Блока ШИМ 3 для vector card

NT_ADC->PSSI_bit.SS2 = 1; //разрешить программный запуск секвенсора
NT_ADC->PSSI_bit.SS3 = 1; //разрешить программный запуск секвенсора
NT_ADC->PSSI_bit.SS4 = 1; //разрешить программный запуск секвенсора
NT_ADC->PSSI_bit.SS5 = 1; //разрешить программный запуск секвенсора
NT_ADC->PSSI_bit.SS6 = 1; //разрешить программный запуск секвенсора
NT_ADC->PSSI_bit.SS7 = 1; //разрешить программный запуск секвенсора

//Настраиваем количество перезапусков секвенсора
NT_ADC->SEQ[2].CTL_bit.RCNT = 0; //Перезапуск не требуется
NT_ADC->SEQ[3].CTL_bit.RCNT = 0; //Перезапуск не требуется
NT_ADC->SEQ[4].CTL_bit.RCNT = 0; //Перезапуск не требуется
NT_ADC->SEQ[5].CTL_bit.RCNT = 0; //Перезапуск не требуется
NT_ADC->SEQ[6].CTL_bit.RCNT = 0; //Перезапуск не требуется
NT_ADC->SEQ[7].CTL_bit.RCNT = 0; //Перезапуск не требуется

//Настраиваем частоту прерываний
NT_ADC->SEQ[2].CTL_bit.ICNT = 0; //Прерывания после каждого запуска
NT_ADC->SEQ[3].CTL_bit.ICNT = 0; //Прерывания после каждого запуска
NT_ADC->SEQ[4].CTL_bit.ICNT = 0; //Прерывания после каждого запуска
NT_ADC->SEQ[5].CTL_bit.ICNT = 0; //Прерывания после каждого запуска
NT_ADC->SEQ[6].CTL_bit.ICNT = 0; //Прерывания после каждого запуска
NT_ADC->SEQ[7].CTL_bit.ICNT = 0; //Прерывания после каждого запуска
//NT_ADC->SEQUENCER.SEQ0.ADCSSTMR.bit.TMR

NT_ADC->PP_bit[0].OM = 0x3; //OM2-OM0 = ’011’ All blocks active (ADC plus internal buffers plus internal bandgap).
NT_ADC->PP_bit[1].OM = 0x3;
NT_ADC->PP_bit[2].OM = 0x3;
NT_ADC->PP_bit[3].OM = 0x3;
NT_ADC->PP_bit[4].OM = 0x3;
NT_ADC->PP_bit[5].OM = 0x3;
NT_ADC->PP_bit[6].OM = 0x3;
NT_ADC->PP_bit[7].OM = 0x3;
NT_ADC->PP_bit[8].OM = 0x3;
NT_ADC->PP_bit[9].OM = 0x3;
NT_ADC->PP_bit[10].OM = 0x3;
NT_ADC->PP_bit[11].OM = 0x3;

//Включаем необходимые модули АЦП
//Настраиваем разрешающую способность модуля АЦП
NT_ADC->PP_bit[0].ENA = 1; //Включаем модуль АЦП
NT_ADC->PP_bit[1].ENA = 1;
NT_ADC->PP_bit[2].ENA = 1;
NT_ADC->PP_bit[3].ENA = 1;
NT_ADC->PP_bit[4].ENA = 1;
NT_ADC->PP_bit[5].ENA = 1;
NT_ADC->PP_bit[6].ENA = 1;
NT_ADC->PP_bit[7].ENA = 1;
NT_ADC->PP_bit[8].ENA = 1;
NT_ADC->PP_bit[9].ENA = 1;
NT_ADC->PP_bit[10].ENA = 1;
NT_ADC->PP_bit[11].ENA = 1;


// Настраиваем компараторы каждый на свой канал АЦП -
// из компараторов будем забирать оцифрованные данные, как из ADC result
//используем аналоговые сигналы токов EXT_IA-FB и EXT_IB-FB (с внешних операционников), так как из-за неудачной разводки
//кита тексас на канале IA-FB при высокоимпедансном входе (как в VectorCard) есть большая помеха от DCDC, которая на ките делает 5В

NT_ADC->DCCTL_bit[16].CHNL = 16; //Udc
NT_ADC->DCCTL_bit[18].CHNL = 18; //Ток фазы B
NT_ADC->DCCTL_bit[23].CHNL = 23; //Ток фазы A
NT_ADC->DCCTL_bit[20].CHNL = 20; //Ток фазы С
NT_ADC->DCCTL_bit[13].CHNL = 13; //температура двигателя
NT_ADC->DCCTL_bit[14].CHNL = 14; //температура радиатора


//разрешение работы компараторов
NT_ADC->SEQ[2].DCP_bit.CMP16 = 1; //Udc
NT_ADC->SEQ[5].DCP_bit.CMP18 = 1; //Ток фазы B
NT_ADC->SEQ[3].DCP_bit.CMP23 = 1; //Ток фазы A
NT_ADC->SEQ[4].DCP_bit.CMP20 = 1; //Ток фазы С
NT_ADC->SEQ[6].DCP_bit.CMP13 = 1; //температура двигателя
NT_ADC->SEQ[7].DCP_bit.CMP14 = 1; //температура радиатора

//выбор каналов для измерений
NT_ADC->SEQ[2].MUX_bit.CH16 = 1; //Udc
NT_ADC->SEQ[5].MUX_bit.CH18 = 1; //Ток фазы B
NT_ADC->SEQ[3].MUX_bit.CH23 = 1; //Ток фазы A
NT_ADC->SEQ[4].MUX_bit.CH20 = 1; //Ток фазы С
NT_ADC->SEQ[6].MUX_bit.CH13 = 1; //температура двигателя
NT_ADC->SEQ[7].MUX_bit.CH14 = 1; //температура радиатора
}
само прерывание, код прислал лишь то что изменил
void AdcDrv_fast_calc(TAdcDrv *p) {
while (NT_ADC->SEQ[2].FSTAT_bit.FLOAD > 0) //пока фифо не опустеет
{
//несколько точек из фифо измерений одного и того же
p->UdcBuf[p->UdcPointer] = NT_ADC->SEQ[2].FIFO_bit.DATA;
p->UdcPointer = (++p->UdcPointer) & 3;
}
uint16_t testVal;
while (NT_ADC->SEQ[3].FSTAT_bit.FLOAD > 0) //пока фифо не опустеет
{
testVal=NT_ADC->DCVAL_bit[23].VAL;
p->IABuf[p->IAPointer] =
(int16) ((NT_ADC->SEQ[3].FIFO_bit.DATA) << 4) ^ 0x8000;
p->IAPointer = (++p->IAPointer) & 3;
}
int16 tmp; //затычка на фазу С=====================================================================
while (NT_ADC->SEQ[4].FSTAT_bit.FLOAD > 0) //пока фифо не опустеет
{
tmp= (int16) ((NT_ADC->SEQ[4].FIFO_bit.DATA) << 4) ^ 0x8000; //затычка на фазу С====================!!!!!!!!!!!!!!!!!!!!!!!
}
while (NT_ADC->SEQ[5].FSTAT_bit.FLOAD > 0) //пока фифо не опустеет
{
p->IBBuf[p->IBPointer] =
(int16) ((NT_ADC->SEQ[5].FIFO_bit.DATA) << 4) ^ 0x8000;
p->IBPointer = (++p->IBPointer) & 3;
}
while (NT_ADC->SEQ[6].FSTAT_bit.FLOAD > 0) //пока фифо не опустеет
{
//несколько точек из фифо измерений одного и того же
//так как температуру измерять с большой частотой не нужно,
//то для ускорения кода не будем использовать массив точек (как для токов)
p->T_temp = NT_ADC->SEQ[6].FIFO_bit.DATA;
}

while (NT_ADC->SEQ[7].FSTAT_bit.FLOAD > 0) //пока фифо не опустеет
{
//несколько точек из фифо измерений одного и того же
p->ref_temp = NT_ADC->SEQ[7].FIFO_bit.DATA;
}
//-------------
}
Буду очень благодарен если скажете мне что я не так настроил, uDC измеряет правильно

Аватара пользователя
Лашкевич Максим
Сообщения: 342
Зарегистрирован: 30 дек 2015, 10:38

Re: Vector IDE

Сообщение Лашкевич Максим » 21 дек 2020, 17:46

Давайте тогда сначала по порядку.
1. Какая отладочная плата? У нас их много. http://motorcontrol.ru/production/controlcards/
2. Какой софт motorcontroldemo прошиваете? Их много https://bitbucket.org/niietcm4/workspac ... cts/MTRCTL
3. Какой коммит софта в GIT?
4. Какое железо выбрано в файле build.h под комментарием "Выбор типа аппаратной части" ?
С уважением,
Лашкевич Максим.
skype: maxlashk
Инженер-программист ООО "НПФ Вектор", Москва.

Alexblv
Сообщения: 29
Зарегистрирован: 10 апр 2017, 15:55

Re: Vector IDE

Сообщение Alexblv » 22 дек 2020, 09:50

1 Комплектация 3, на плате есть разъем Х6 с технологическими отверстиями, на 14 пине разъема по схеме ADC23 (к 89 ноге МК)
2, 3 motorcontroldemo-b74903409c8e от 2020‑11‑17
4 //VectorCARD с отладочным комплектом DRV8301
#define HW_VECTORCARD_DRV8301_EVM

что изменил - в модуле CanOpen настроил нужный Can
void co_CAN1GpioInit()
{
//выбираем альтернативную функцию ГПИО
NT_COMMON_REG->GPIOPCTLG_bit.PIN7 = 0; //CAN_TX[0]
NT_COMMON_REG->GPIOPCTLE_bit.PIN2 = 0; //CAN_RX[0]

//переводим ГПИО на выполнение функции CAN
NT_GPIOG->ALTFUNCSET = (1 << 7);
NT_GPIOE->ALTFUNCSET = (1 << 2);
}

В АЦП (специально по минимуму, остальное так же как у вас настроил каналы АЦП)
#ifdef HW_VECTORCARD_DRV8301_EVM
NT_ADC->DCCTL_bit[16].CHNL = 16; //Udc
NT_ADC->DCCTL_bit[18].CHNL = 18; //Ток фазы B
NT_ADC->DCCTL_bit[23].CHNL = 23; //Ток фазы A

//разрешение работы компараторов
NT_ADC->SEQ[2].DCP_bit.CMP16 = 1; //Udc
NT_ADC->SEQ[3].DCP_bit.CMP18 = 1; //Ток фазы B
NT_ADC->SEQ[4].DCP_bit.CMP23 = 1; //Ток фазы A

//выбор каналов для измерений
NT_ADC->SEQ[2].MUX_bit.CH16 = 1; //Udc
NT_ADC->SEQ[3].MUX_bit.CH18 = 1; //Ток фазы B
NT_ADC->SEQ[4].MUX_bit.CH23 = 1; //Ток фазы A

На 89 ножке МК около 0,9626 вольт
Дальше ставлю брекпоинт на строчке
p->IABuf[p->IAPointer] =(int16) ((NT_ADC->SEQ[4].FIFO_bit.DATA) << 4) ^ 0x8000;
значение DATA равно 5 (на нашем МК) и равно 64 +/5 на отладочной плате

При этом если напряжение около 0,9 вольт подать на 81 ножку МК (пин 19 разъема Х6) то значение NT_ADC->SEQ[2].FIFO_bit.DATA
равно 2571. Если изменить например на 0,3 вольт то будет 895. Эффект повторяется и на отладочной плате и на нашей собственной

Аватара пользователя
Лашкевич Максим
Сообщения: 342
Зарегистрирован: 30 дек 2015, 10:38

Re: Vector IDE

Сообщение Лашкевич Максим » 22 дек 2020, 10:15

23й канал нерабочий, только в дифф. режиме - см. ТО во вложении
Переносите на другой вход. Кроме 23го канала другие реагируют?

Вот пример инициализации всех каналов по порядку, данные забирать из NT_ADC->DCVAL_bit[X].VAL
АЦП запускается тут программно, надо вписать в перерывании
// Программно запускаем АЦП
NT_ADC->PSSI_bit.GSYNC = 1;

попробуйте так:

Код: Выделить всё

//! \memberof TAdcDrv
void AdcDrv_init(TAdcDrv *p) {

	/* Запрет всех секвенсоров */
	NT_ADC->ACTSS = 0;

	/* Сброс счётчиков прерываний и измерений*/
	NT_ADC->SEQ[0].OP = 0;
	NT_ADC->SEQ[1].OP = 0;
	NT_ADC->SEQ[2].OP = 0;
	NT_ADC->SEQ[3].OP = 0;
	NT_ADC->SEQ[4].OP = 0;
	NT_ADC->SEQ[5].OP = 0;
	NT_ADC->SEQ[6].OP = 0;
	NT_ADC->SEQ[7].OP = 0;

	NT_ADC->ACTSS_bit.ASEN0 = 1;
	NT_ADC->IM_bit.MASK0 = 1;
	NT_ADC->EMUX_bit.EM0 = 0; // программный запуск установкой бита GSYNC в регистре PSSI
	NT_ADC->PSSI_bit.SS0 = 1;
	NT_ADC->SEQ[0].CTL_bit.RCNT = 0; //Перезапуск не требуется
	NT_ADC->SEQ[0].CTL_bit.ICNT = 0; //Прерывания после каждого запуска

	NT_ADC->PP_bit[0].OM = 0x3; //OM2-OM0 = ’011’ All blocks active (ADC plus internal buffers plus internal bandgap).
	NT_ADC->PP_bit[1].OM = 0x3;
	NT_ADC->PP_bit[2].OM = 0x3;
	NT_ADC->PP_bit[3].OM = 0x3;
	NT_ADC->PP_bit[4].OM = 0x3;
	NT_ADC->PP_bit[5].OM = 0x3;
	NT_ADC->PP_bit[6].OM = 0x3;
	NT_ADC->PP_bit[7].OM = 0x3;
	NT_ADC->PP_bit[8].OM = 0x3;
	NT_ADC->PP_bit[9].OM = 0x3;
	NT_ADC->PP_bit[10].OM = 0x3;
	NT_ADC->PP_bit[11].OM = 0x3;

	//Включаем необходимые модули АЦП
	NT_ADC->PP_bit[0].ENA = 1;
	NT_ADC->PP_bit[1].ENA = 1;
	NT_ADC->PP_bit[2].ENA = 1;
	NT_ADC->PP_bit[3].ENA = 1;
	NT_ADC->PP_bit[4].ENA = 1;
	NT_ADC->PP_bit[5].ENA = 1;
	NT_ADC->PP_bit[6].ENA = 1;
	NT_ADC->PP_bit[7].ENA = 1;
	NT_ADC->PP_bit[8].ENA = 1;
	NT_ADC->PP_bit[9].ENA = 1;
	NT_ADC->PP_bit[10].ENA = 1;
	NT_ADC->PP_bit[11].ENA = 1;

	//настраиваем компараторы каждый на свой канал АЦП -
	//из компараторов будем забирать оцифрованные данные, как из ADC result
	NT_ADC->DCCTL_bit[0].CHNL = 0;
	NT_ADC->DCCTL_bit[1].CHNL = 1;
	NT_ADC->DCCTL_bit[2].CHNL = 2;
	NT_ADC->DCCTL_bit[3].CHNL = 3;
	NT_ADC->DCCTL_bit[4].CHNL = 4;
	NT_ADC->DCCTL_bit[5].CHNL = 5;
	NT_ADC->DCCTL_bit[6].CHNL = 6;
	NT_ADC->DCCTL_bit[7].CHNL = 7;
	NT_ADC->DCCTL_bit[8].CHNL = 8;
	NT_ADC->DCCTL_bit[9].CHNL = 9;
	NT_ADC->DCCTL_bit[10].CHNL = 10;
	NT_ADC->DCCTL_bit[11].CHNL = 11;
	NT_ADC->DCCTL_bit[12].CHNL = 12;
	NT_ADC->DCCTL_bit[13].CHNL = 13;
	NT_ADC->DCCTL_bit[14].CHNL = 14;
	NT_ADC->DCCTL_bit[15].CHNL = 15;
	NT_ADC->DCCTL_bit[16].CHNL = 16;
	NT_ADC->DCCTL_bit[17].CHNL = 17;
	NT_ADC->DCCTL_bit[18].CHNL = 18;
	NT_ADC->DCCTL_bit[19].CHNL = 19;
	NT_ADC->DCCTL_bit[20].CHNL = 20;
	NT_ADC->DCCTL_bit[21].CHNL = 21;
	NT_ADC->DCCTL_bit[22].CHNL = 22;
	NT_ADC->DCCTL_bit[23].CHNL = 23;

	//Показываем, с каких каналов нужно собирать данные
	NT_ADC->SEQ[0].DCP = 0x007FFFFF;	// Каналы в компараторы, чтобы с них брать аналоговые результаты без фифо
}
Вложения
2020-12-22_10-08-50.png
2020-12-22_10-08-50.png (69.98 КБ) 10019 просмотров
С уважением,
Лашкевич Максим.
skype: maxlashk
Инженер-программист ООО "НПФ Вектор", Москва.

Alexblv
Сообщения: 29
Зарегистрирован: 10 апр 2017, 15:55

Re: Vector IDE

Сообщение Alexblv » 22 дек 2020, 10:23

Да, спасибо большое, остальные работают (по крайней мере на отладочной).

Alexblv
Сообщения: 29
Зарегистрирован: 10 апр 2017, 15:55

Re: Vector IDE

Сообщение Alexblv » 20 фев 2021, 11:22

Здравствуйте, иногда возникает ошибка F_CAN_RESTORATION_ERROR, (понятно, что CAN отваливается иногда от помех), но в некоторых случаях он просто отваливается без остановки, в некоторых возникает эта ошибка. Не подскажите суть этой ошибки?

Аватара пользователя
Лашкевич Максим
Сообщения: 342
Зарегистрирован: 30 дек 2015, 10:38

Re: Vector IDE

Сообщение Лашкевич Максим » 20 фев 2021, 11:46

F_CAN_RESTORATION_ERROR - это не связано с помехами. Это когда не получилось восстановить параметры из пользовательской памяти, а именно не сошлась контрольная сумма. Такое бывает, если параметры ни разу не сохраняли кнопкой "Сохранить" в юниконе справа сверху, если во время сохранения пропало питание, если параметры в памяти перетёрлись другой подпрограмой. Что-то из этой серии.

По поводу помех - соедините CAN трёхпроводной линией (с землёй), поставьте на обоих сторонах линии терминальные резисторы 120 Ом.
С уважением,
Лашкевич Максим.
skype: maxlashk
Инженер-программист ООО "НПФ Вектор", Москва.

Ответить