А при такой PWM2->HDSEL_bit.CBC= 1; - не меняется. Попробовал прямую запись: PWM2->HDSEL = PWM_HDSEL_ADCDC0_Msk | PWM_HDSEL_CBC_Msk; - регистр HDSEL становится 0x00000001. По умолчанию этот регистр равен 0x00018000;
Вопрос - как правильно настраивать ШИМ на срабатывание компаратора АЦП и событие удержания в циклическом режиме?
Код привожу ниже, пока выяснил: ключ открывается, устанавливаются все биты HDFLG (=0x00000007).
Код настройки привожу: Такт процессора 100МГц.
Код: Выделить всё
RCU->PCLKCFG_bit.PWM2EN = 1;
RCU->PRSTCFG_bit.PWM2EN = 1;
//настраиваем таймер 2
PWM2->TBPHS_bit.TBPHS = 0;
PWM2->TBCTL_bit.SHDWGLOB = 0x1; // Теневая загрузка происходит согласно настройкам соответствующих полей
PWM2->TBCTL_bit.FREESOFT = 0x2; // Счетчик продолжит работу
PWM2->TBCTL_bit.PHSDIR = 0; // Вниз
PWM2->TBCTL_bit.CLKDIV = 0x0;
PWM2->TBCTL_bit.HSPCLKDIV = 0x0;
PWM2->TBCTL_bit.SYNCOSEL = 0;
PWM2->TBCTL_bit.PHSEN = 0;
PWM2->TBCTL_bit.CTRMODE = 0; // Вверх
PWM2->TBCTL_bit.PRDLD = 0x0; // Режим отложенной загрузки регистра TBPRD разрешен
PWM2->CMPCTL_bit.SHDWAMODE = 1; // Производится загрузка напрямую в активный регистр
PWM2->CMPCTL_bit.SHDWBMODE = 1; // Производится загрузка напрямую в активный регистр
PWM2->CMPCTL_bit.LOADAMODE = 0; // Поле задания события загрузки отложенного значения в регистр CMPA: CTR = Zero
PWM2->CMPCTL_bit.LOADBMODE = 0; // Поле задания события загрузки отложенного значения в регистр CMPB: CTR = Zero
PWM2->AQCTLA_bit.ZRO = 0x1; // Действие на выводе PWMA при CTR = Zero - ВКЛЮЧАЕМ ВЫХОД
PWM2->AQCTLA_bit.PRD = 0x1; // Действие на выводе PWMA при CTR = PRD - ВКЛЮЧАЕМ ВЫХОД
PWM2->AQCTLA_bit.CAU = 0; // Действие на выводе PWMA при CTR = CMPA при счете вверх
PWM2->AQCTLA_bit.CAD = 0; // Действие на выводе PWMA при CTR = CMPA при счете вниз
PWM2->AQCTLA_bit.CBU = 0; // Действие на выводе PWMA при CTR = CMPB при счете вверх
PWM2->AQCTLA_bit.CBD = 0; // Действие на выводе PWMA при CTR = CMPB при счете вниз
PWM2->AQCTLB_bit.ZRO = 0; // Действие на выводе PWMB при CTR = Zero
PWM2->AQCTLB_bit.PRD = 0; // Действие на выводе PWMB при CTR = PRD
PWM2->AQCTLB_bit.CAU = 0; // Действие на выводе PWMB при CTR = CMPA при счете вверх
PWM2->AQCTLB_bit.CAD = 0; // Действие на выводе PWMB при CTR = CMPA при счете вниз
PWM2->AQCTLB_bit.CBU = 0; // Действие на выводе PWMB при CTR = CMPB при счете вверх
PWM2->AQCTLB_bit.CBD = 0; // Действие на выводе PWMB при CTR = CMPB при счете вниз
PWM2->AQSFRC_bit.ACTSFA = 0x1; // Выбор действия с выходным сигналом на выводе: ВКЛЮЧАЕМ ВЫХОД
PWM2->AQSFRC_bit.OTSFA = 0x1; // Запись единицы инициирует ожидание события CTR = Zero для однократного переключения вывода в состояние, согласно ACTSFA
PWM2->AQSFRC_bit.ACTSFB = 0x0; // Выбор действия с выходным сигналом на выводе: Нет действий
PWM2->AQSFRC_bit.OTSFB = 0x1; // Запись единицы инициирует ожидание события CTR = Zero для однократного переключения вывода в состояние, согласно ACTSFB
PWM2->TBCTR = 0; // Сбрасываем счётчик
PWM2->CMPA_bit.CMPA = 0; //
PWM2->CMPB_bit.CMPB = 0; //
PWM2->CMPCTL_bit.SHDWAMODE = 0; // Значение, записываемое в регистр CMPA, размещается в теневом регистре (отложенная загрузка)
PWM2->CMPCTL_bit.SHDWBMODE = 0; // Значение, записываемое в регистр CMPB, размещается в теневом регистре (отложенная загрузка)
PWM2->HDSEL_bit.ADCDC0 = 1; // Бит выбора цифрового компаратора (0 – 3) блока АЦП
PWM2->HDCTL_bit.HDA = 1; // Переключается в состояние единицы
PWM2->HDCTL_bit.HDB = 3; // Остается без изменений
Энвик_SetPriority (PWM2_HD_IRQn, IRQ_PRIORITY_PWM_CLOSE); // Приоритет прерывания
Энвик_EnableIRQ (PWM2_HD_IRQn); //
RCU->ADCCFG_bit.CLKSEL = 1;
RCU->ADCCFG_bit.DIVN = 1;
RCU->ADCCFG_bit.DIVEN = 1;
RCU->ADCCFG_bit.CLKEN = 1;
RCU->ADCCFG_bit.RSTDIS = 1;
ADC->ACTL_bit.ADCEN = 1; // Включение АЦП. При каждом включении запускается процедура инициализации, которая завершается установкой ADCRDY.
// Сброс
ADC->EMUX_bit.EM0 = 0; // Установка бита GSYNC в регистре SEQSYNC
ADC->EMUX_bit.EM1 = 0; // Установка бита GSYNC в регистре SEQSYNC
ADC->SEQEN_bit.SEQEN0 = 0;
ADC->SEQEN_bit.SEQEN1 = 0;
// Настройка
//ADC->EMUX_bit.EM0 = 0x4; // Сигнал от блока TMR1
ADC->EMUX_bit.EM0 = 0xF; // Циклическая работа. Активируется после установки бита GSYNC в регистре SEQSYNC
// Секвенсоры
// Секвенсор 1 - измерение тока по каналу 0 компаратором 0 для ограничителя ШИМ
ADC->SEQ[1].SCCTL_bit.RAVGEN = 0; // Бит разрешения режима усреднения результатов по перезапускам (для корректной работы этого режима поле RCNT регистра SCCTL должно содержать любое значение, соответствующее 2???1, где p=1..8.)
ADC->SEQ[1].SCCTL_bit.RCNT = 0; // Поле задания количества перезапусков очереди запросов секвенсора s после его запуска по событию.
ADC->SEQ[1].SCCTL_bit.ICNT = 0; // Поле задания количества запросов секвенсором s модуля АЦП, по достижении которого генерируется прерывание
ADC->SEQ[1].SRTMR_bit.VAL = 10; // Поле задания задержки перезапуска очереди секвенсора
ADC->SEQ[1].SRQCTL_bit.QAVGVAL = 0x1; // Поле задания количества необходимых опросов для усреднения сканированием - 2 в степени QAVGVAL
ADC->SEQ[1].SRQCTL_bit.QAVGEN = 0x1; // Бит управления режимом усреднения сканированием
ADC->SEQ[1].SRQCTL_bit.RQMAX = 0; // Количество каналов для измерения - 1 канал
ADC->SEQ[1].SRQSEL_bit.RQ0 = 0x0; // 0 канал
ADC->SEQ[1].SDC_bit.DC0 = 1; // Компаратор 0
ADC->SEQ[1].SDC_bit.DC1 = 0; // Компаратор 1 - 0 канал
ADC->SEQ[1].SDC_bit.DC2 = 0; // Компаратор 2 - 1 канал
ADC->SEQ[1].SDC_bit.DC3 = 0; // Компаратор 3 - 2 канал
// Компараторы
ADC->DC[0].DCTL_bit.CHNL = 0x0; // Компаратор 0 // Поле выбирает канал, результат измерения которого будет передан на компаратор - 0 канал
ADC->DC[1].DCTL_bit.CHNL = 0x0; // Компаратор 1 // Поле выбирает канал, результат измерения которого будет передан на компаратор - 0 канал
ADC->DC[2].DCTL_bit.CHNL = 0x1; // Компаратор 2 // Поле выбирает канал, результат измерения которого будет передан на компаратор - 1 канал
ADC->DC[3].DCTL_bit.CHNL = 0x2; // Компаратор 3 // Поле выбирает канал, результат измерения которого будет передан на компаратор - 2 канал
ADC->DCTRIG = ADC_DCTRIG_TOS0_Msk;
// Настройка компаратора ограничения тока // Компаратор ADC_DCCMP_PWM_LIMIT
ADC->DC[ADC_DCCMP_PWM_LIMIT].DCTL_bit.CTM = 2; // Многократный с гистерезисом
ADC->DC[ADC_DCCMP_PWM_LIMIT].DCTL_bit.CTC = 2; // COMP1 <= Измерение - выходной триггер будет переключаться в единицу каждый раз, когда результат измерения выше COMP1 (при 1 - превышение тока (запрет ШИМ))
ADC->DC[ADC_DCCMP_PWM_LIMIT].DCTL_bit.CTE = 1; // Бит разрешения срабатывания выходного триггера компаратора
ADC->SEQEN_bit.SEQEN1 = 1;
while(!ADC->ACTL_bit.ADCRDY);
Код: Выделить всё
ADC->DC[ADC_DCCMP_PWM_LIMIT].DCMP_bit.CMPL = 0x0200;
ADC->DC[ADC_DCCMP_PWM_LIMIT].DCMP_bit.CMPH = 0x0280;
ADC->DCTRIG = ADC_DCTRIG_TOS0_Msk;
PWM2->HDCLR = PWM_HDCLR_CBC_Msk | PWM_HDCLR_OST_Msk; // Сброс порогового переключателя
PWM2->HDINTCLR = PWM_HDINTCLR_INT_Msk; // Бит сброса прерывания
PWM2->AQSFRC_bit.ACTSFA = 0x1; // Выбор действия с выходным сигналом на выводе: ВКЛЮЧАЕМ ВЫХОД
PWM2->AQSFRC_bit.OTSFA = 0x1; // Запись единицы инициирует ожидание события CTR = Zero для однократного переключения вывода в состояние, согласно ACTSFA
PWM2->TBPRD = 0x1F0; // Задаём частоту ШИМ ограничения тока
PWM2->TBCTR = 0; // Сбрасываем счётчик
PWM2->HDSEL = PWM_HDSEL_ADCDC0_Msk | PWM_HDSEL_CBC_Msk; // Бит разрешения события по источнику DCMP в циклическом режиме обработки аварии
PWM2->HDEINT_bit.CBC = 1; // Бит разрешения генерации прерывания в циклическом режиме
SIU->PWMSYNC |= 0x4 << SIU_PWMSYNC_PRESCRST_Pos;
void PWM2_HD_IRQHandler(void) {
PWM2->HDINTCLR = PWM_HDINTCLR_INT_Msk; // Бит сброса прерывания
}