ШИМ Пороговый выключатель 1921ВК035

32-разрядные микроконтроллеры разработки АО "НИИЭТ"

Модераторы: ea, dav, bkolbov, Alis, pip, _sva_

Al-x
Сообщения: 29
Зарегистрирован: 02 фев 2021, 19:22
Предприятие: АО "НТЦ "РИФ"

ШИМ Пороговый выключатель 1921ВК035

Сообщение Al-x »

В программе и отладчике в регистре HDSEL не устанавливаются биты CBC и OST. То есть при такой строчке PWM2->HDSEL_bit.ADCDC0 = 1; бит ADCDC0 устанавливается, состояние регистра HDSEL становится 0x00000001.
А при такой 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; // Бит сброса прерывания



	}
	
Al-x
Сообщения: 29
Зарегистрирован: 02 фев 2021, 19:22
Предприятие: АО "НТЦ "РИФ"

Re: ШИМ Пороговый выключатель 1921ВК035

Сообщение Al-x »

Со сбросом ADC->DCTRIG тоже не понятно.

Пока не смог найти режим автоматического сброса порогового выключателя ни для АЦП ни для ШИМ.
dav
Сообщения: 208
Зарегистрирован: 14 дек 2015, 09:21
Предприятие: АО НИИЭТ
Откуда: АО НИИЭТ, Воронеж

Re: ШИМ Пороговый выключатель 1921ВК035

Сообщение dav »

Al-x писал(а): 13 сен 2021, 18:06 Со сбросом ADC->DCTRIG тоже не понятно.

Пока не смог найти режим автоматического сброса порогового выключателя ни для АЦП ни для ШИМ.
Доброго времени суток!
1) Из Errata для К1921ВК035:
3. Одиночный и циклический режимы удержания
Описание: Биты выбора режима удержания CBC и OST (регистр HDSEL) не влияют ни на что.
Условия: Всегда.
Последствия: Оба сигнала на удержание генерируются одновременно и объединяются через ИЛИ без учета разрешения конкретного режима. И если сигнал циклического удержания будет сброшен по новому периоду ШИМ автоматически, то сигнал одиночного удержания должен быть сброшен через флаг. Т.е. фактически циклический режим не функционирует, т.к. чтобы снять удержание необходимо также сбрасывать флаг одиночного удержания OST в регистре HDCLR. В итоге, снятие удержания возможно только при сбросе флага OST в HDCLR лишь после наступления нового периода PWM (CTR==0).
Рекомендации и способы обхода: Не использовать режим.

2) Что касается сброса порогового выключателя ШИМ: в руководстве пользователя на стр.82: Удержание выходных сигналов будет производиться до программного сброса записью единицы в бит OST регистра HDCLR.
Al-x
Сообщения: 29
Зарегистрирован: 02 фев 2021, 19:22
Предприятие: АО "НТЦ "РИФ"

Re: ШИМ Пороговый выключатель 1921ВК035

Сообщение Al-x »

Спасибо за ответ. В принципе, я так и полагал, даже сказал бы - опасался, что дела обстоят именно так.
Errata
это уже интересно, срочно необходим документ.

Что касается вопроса по существу. С ШИМ понятно, сбрасываем вручную. PWM2->HDCLR = PWM_HDCLR_CBC_Msk | PWM_HDCLR_OST_Msk; // Бит сброса прерывания

А флаг ADC->DCTRIG так же требуется очищать вручную, автоматом никак? Я пока не нашёл способа его автоматической очистки. Сейчас так сделано:

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

void PWM2_IRQHandler(void) {

	PWM2->ETCLR = PWM_ETCLR_INT_Msk;
	PWM2->INTCLR = PWM_INTCLR_INT_Msk;

	if (ADC->DCTRIG & ADC_DCTRIG_TOS0_Msk) {

......

		ADC->DCTRIG = ADC_DCTRIG_TOS0_Msk/* | ADC_DCTRIG_DCEV0_Msk*/; // Очистка флага компаратора

	}

	PWM2->HDCLR = PWM_HDCLR_CBC_Msk | PWM_HDCLR_OST_Msk; // Бит сброса прерывания

}
Понятно, что раз очищаем OST, то можно поставить и очистку DCTRIG, но суть в другом.

На ВК01Т я экспериментально обнаружил интересный момент.

Там у меня было сделано так же:

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

void PWM3_IRQHandler(void) {

	PWM_LIMIT_MODULE_REG->ETCLR = PWM_ETCLR_INT_Msk;
	PWM_LIMIT_MODULE_REG->INTCLR = PWM_INTCLR_INT_Msk;

	NT_ADC->DCRTC = 0x1 << (ADC_DCCMP_PWM_LIMIT+8); // Очистка флага компаратора

	PWM_LIMIT_MODULE_REG->HDCLR = PWM_HDEINT_OST_Msk; // Сброс OST порогового переключателя

}
и изначально прерывание вызывалось при переполнении таймера. И получился интересный момент - флаг в NT_ADC->DCRTC очищался, происходила перезагрузка порогового выключателя и он открывался. Но ток на этот момент ещё не успел упасть, происходило измерение АЦП и пороговый выключатель срабатывал снова - итог - микроимпульсы длительностью до одного периода измерения АЦП. В итоге я процедуру разблокировки по прерывания ШИМ сделал не по переполнению таймера, а на несколько тактов раньше переполнения ШИМ. (По сравнению одного из каналов CMP). PWM_LIMIT_MODULE_REG->ETSEL_bit.INTSEL = 0x6; Тогда на момент переполнения АЦП уже успевал сделать измерение и пороговый выключатель не сбрасывался.

Не исключаю, что по существу я не прав. Но во всяком случае после указанной корректировки проблема коротких импульсов на ВК01Т ушла. Я пока не знаю проявится ли проблема на ВК035, пока аппаратура не позволяет проверить.
Stacey_S
Сообщения: 4
Зарегистрирован: 16 сен 2021, 17:33
Предприятие: Темп

Re: ШИМ Пороговый выключатель 1921ВК035

Сообщение Stacey_S »

dav писал(а): 14 сен 2021, 12:12
Al-x писал(а): 13 сен 2021, 18:06 Со сбросом ADC->DCTRIG тоже не понятно.

Пока не смог найти режим автоматического сброса порогового выключателя ни для АЦП ни для ШИМ.
Доброго времени суток!
1) Из Errata для К1921ВК035:
3. Одиночный и циклический режимы удержания
Описание: Биты выбора режима удержания CBC и OST (регистр HDSEL) не влияют ни на что.
Условия: Всегда.
Последствия: Оба сигнала на удержание генерируются одновременно и объединяются через ИЛИ без учета разрешения конкретного режима. И если сигнал циклического удержания будет сброшен по новому периоду ШИМ автоматически, то сигнал одиночного удержания должен быть сброшен через флаг. Т.е. фактически циклический режим не функционирует, т.к. чтобы снять удержание необходимо также сбрасывать флаг одиночного удержания OST в регистре HDCLR. В итоге, снятие удержания возможно только при сбросе флага OST в HDCLR лишь после наступления нового периода PWM (CTR==0).
Рекомендации и способы обхода: Не использовать режим.

2) Что касается сброса порогового выключателя ШИМ: в руководстве пользователя на стр.82: Удержание выходных сигналов будет производиться до программного сброса записью единицы в бит OST регистра HDCLR.
Здравствуйте! Где найти errata на 1921ВК035 и 1921ВК028?
dav
Сообщения: 208
Зарегистрирован: 14 дек 2015, 09:21
Предприятие: АО НИИЭТ
Откуда: АО НИИЭТ, Воронеж

Re: ШИМ Пороговый выключатель 1921ВК035

Сообщение dav »

Stacey_S писал(а): 17 сен 2021, 12:33 Здравствуйте! Где найти errata на 1921ВК035 и 1921ВК028?
errata_K1921VK028_210702.pdf
Errata 1921ВК028
(407.32 КБ) 69 скачиваний
errata_K1921VK035_210702.pdf
Errata 1921ВК035
(346.04 КБ) 98 скачиваний
Stacey_S
Сообщения: 4
Зарегистрирован: 16 сен 2021, 17:33
Предприятие: Темп

Re: ШИМ Пороговый выключатель 1921ВК035

Сообщение Stacey_S »

Спасибо!
Я использую пороговый выключатель ШИМ на микроконтроллере 1921ВК035 для контроля тока. Сбрасываю триггер от цифр.компаратора АЦП в прерывании по началу периода ШИМ, но почему-то выходные сигналы ШИМ восстанавливаются только в следующем периоде ШИМ. Цифровой компаратор производит сравнение результата с АЦП по условию CMPH <= Измерение (CTC = 2).
Прилагаю рисунок, где:
синий график - канал А ШИМ, который отключается во время срабатывания триггера компаратора АЦП,
красный график - канал А ШИМ в обычном режиме работы, передний фронт означает начало периода ШИМ CTR = 0,
зеленый график - ток, приходящий на канал АЦП, который подключен к компаратору,
желтый график - выходной триггер компаратора АЦП.
Здесь видно, что выходной триггер компаратора АЦП уже сбросился в начале периода, но канал А ШИМ не восстановился.
Помогите, пожалуйста, разобраться почему выходные сигналы PWMA и PWMB восстанавливаются после сброса триггера компаратора с задержкой на один период ШИМ?
scope_0.jpg
scope_0.jpg (117.32 КБ) 1513 просмотров
Al-x
Сообщения: 29
Зарегистрирован: 02 фев 2021, 19:22
Предприятие: АО "НТЦ "РИФ"

Re: ШИМ Пороговый выключатель 1921ВК035

Сообщение Al-x »

Сброс события удержания происходит по событию обнуления таймера. А в прерывание вы попадаете и сбрасываете компаратор чуть позже. 83 стр. РЭ.

Так что полагаю, нужно либо чаще выполнять прерывание, либо взять прерывание по переполнению или даже немного недоходя до него, например по сравнению неиспользуемого канала. По переполнению сработает, если за такт таймера ПО успеет выполнить прерывание, полагаю.
Stacey_S
Сообщения: 4
Зарегистрирован: 16 сен 2021, 17:33
Предприятие: Темп

Re: ШИМ Пороговый выключатель 1921ВК035

Сообщение Stacey_S »

Теперь я сбрасываю компаратор в прерывании по сравнению канала PWMB, за 4 мкс до обнуления счетчика таймера. Ничего не изменилось, каналы ШИМ восстанавливаются с задержкой на один период ШИМ.
Вложения
scope_3.jpg
scope_3.jpg (118.88 КБ) 1245 просмотров
scope_1.jpg
scope_1.jpg (115.55 КБ) 1245 просмотров
Stacey_S
Сообщения: 4
Зарегистрирован: 16 сен 2021, 17:33
Предприятие: Темп

Re: ШИМ Пороговый выключатель 1921ВК035

Сообщение Stacey_S »

Привожу код программы:
Обработчик PWM0_Handler

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

PWM0->HDCLR |= (1 << 2);
  ADC->DCTRIG |= 1;
 // Сброс флага прерывания 
  PWM0->ETCLR = 1; 
  PWM0->INTCLR = 1;	
Инициализация PWM0

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

// TBCTL – регистр управления таймером
  PWM0->TBCTL = (1 << 16) + (2 << 14);
// CMPA – регистр порога срабатывания канала А
  #define _CMPA                  2499
  PWM0->CMPA = (_CMPA << 16);
// CMPB – регистр порога срабатывания канала B
  #define _CMPB                  4500
  PWM0->CMPB = (_CMPB << 16);
// TBPRD – регистр периода таймера
  #define _TBPRD                  4999// 100 МГц / (TBPRD + 1) = 20 кГц  
  PWM0->TBPRD = _TBPRD;
// AQCTLA – регистр обработчика для выхода A      
  PWM0->AQCTLA = (1 << 4) + 2;
 // AQCTLB – регистр обработчика для выхода B  
  PWM0->AQCTLB = (2 << 4) + 1;
// HDSEL – регистр источника сигнала события удержания
   PWM0->HDSEL = (1 << 31) + 1;
// HDCTL – регистр управления детектором событий удержания
  PWM0->HDCTL = (1 << 2) + 2;
// DBCTL – регистр управления генератором «мертвого» времени ШИМ
  PWM0->DBCTL = (2  << 2) + 3;
// DBRED – регистр управления «мертвым» временем переднего фронта  
PWM0->DBRED = 40; 
 // DBFED – регистр управления «мертвым» временем заднего фронта  
  PWM0->DBFED = 40; 
// ETSEL – регистр источника триггера событий  
 PWM0->ETSEL = (1 << 3) | 6;
// ETCLR – регистр сброса флагов триггера событий
PWM0->ETCLR = 1; 
  // PWMSYNC – регистр настройки синхронизации PWM
  #define _PRESCRST                 1 //  Включаем счетчик PWM0
   SIU->PWMSYNC = (_PRESCRST << 8);
 // Устанавливаем приоритет для прерывания от ШИМ0
  Энвик_SetPriority (PWM0_IRQn, 1); 
  Энвик_EnableIRQ(PWM0_IRQn);	
Инициализация АЦП

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

// ADCCFG – регистр настройки блока АЦП
RCU->ADCCFG = (1 << 24) + (1 << 16)+ (1 << 8) + (1 << 4) + 1;
  // ACTL – регистр управления модулем АЦП
   ADC->ACTL &= ~0x01;
   ADC->ACTL |= 1;
  //Настройка секвенсора 0
  // EMUX – регистр выбора событий запуска секвенсоров
  ADC->EMUX = 0xF; // Циклический запуск
  // SEQEN – регистр включения секвенсоров
  ADC->SEQEN = 1;
  
	
// Разрешение работы компаратора 0 секвенсором 0
  ADC->SEQ[0].SDC = 1; 
  // DCTL - Регистр управления компаратора 
  ADC->DC[0].DCTL = (1 << 12) + (2 << 10);
 ADC->DC[0].DCMP = (2358 << 16) | 800; // Верхняя граница |  Нижняя граница
  // IM – регистр маски прерываний
  ADC->IM = 1;
  // Ожидание флага готовности АЦП к проведению измерений
  while (!((ADC->ACTL >> 1) & 0x01));
 // SEQSYNC – регистр программной синхронизации секвенсоров  
  ADC->SEQSYNC |= 1;
  ADC->SEQSYNC |= 0x80000000;
Ответить

Вернуться в «32-разрядные микроконтроллеры»