Хотелось бы получить несколько отсчетов по одному событию. Конкретно - имеется PWM выход, нужно измерить напряжение и ток =до= и =после= процесса коммутации.
Очевидно опустил, настройки:
ADCA.CTRLB = ADC_CURRLIMIT_NO_gc | ADC_CONMODE_bm*0 | ADC_FREERUN_bm*0 | ADC_RESOLUTION_12BIT_gc;
ADCA.EVCTRL = ADC_SWEEP_0123_gc | ADC_EVSEL_7_gc | ADC_EVACT_SWEEP_gc;
EVSYS.CH7MUX = EVSYS_CHMUX_TCC0_CCB_gc;
ADCA.CTRLA = ADC_DMASEL_CH0123_gc | ADC_CH0START_bm | ADC_CH1START_bm | ADC_CH2START_bm | ADC_CH3START_bm | ADC_ENABLE_bm;
DMA.CTRL = DMA_ENABLE_bm | DMA_DBUFMODE_DISABLED_gc | DMA_PRIMODE_CH0RR123_gc;
DMA.CH0.ADDRCTRL = DMA_CH_SRCRELOAD_BURST_gc | DMA_CH_SRCDIR_INC_gc | DMA_CH_DESTRELOAD_BLOCK_gc | DMA_CH_DESTDIR_INC_gc;
DMA.CH0.TRIGSRC = DMA_CH_TRIGSRC_ADCA_CH4_gc;
DMA.CH0.TRFCNTL = 8;
DMA.CH0.TRFCNTH = 0;
DMA.CH0.REPCNT = 0;
По ССА ставится PWM, по CCB время оцифровки всеми четырьмя каналами. Это работает, но хотелось бы иметь отсчет и =до= и =после=.
Можно отделить 1-2 канала и запускать их по другому event, но это означает измерение в 2 раза меньшего кол-ва данных.
Самое простое решение - пожертвовать каналами и посадить, например, каналы 0-1 до коммутации, третий после. Второму при этом не повезло. Так тоже работать будет, но здесь проблема другого плана - при переходе от настольной модельки к драйверам и IGBT "время коммутации" сдвинется самым причудливым способом, а потому точная подгонка не применима. По этой же причине не хочется отцеплять один канал и сажать его на event от ССА (сигнала PWM) - его смена уровня не соответствует моменту коммутации на ключах. Понятно, что можно завести обратную связь через ножки портов или как-то иначе, но хотелось бы этого избежать.
Идеальный вариант - заставить ADC оцифровывать несколько циклов (а не один) по event. Например, 3 цикла. Тогда первый цикл дал бы данные до коммутации (задается временем CCB), второй = выкинуть, третий - данные после коммутации. Один цикл 0.5*4=2 us, что гарантированно хватит на все накладные расходы в драйверах и ключах.
Увы, так у меня не получается. Может мысли какие будут?
Режим freerun пробовал и он мог-бы подойти, но здесь есть засада - он всегда кратен абсолютному номеру тика. Т.е., грбо говоря, канал 0 захватывает всегда во время 0, 4, 8, 12, ...; первый - 1, 5, 8,13...; Ну а PWM может принимать разные значения, и это означает, что захват тока будет выполняться не перед самым моментом отключения транзистора. Ток есть "пила", которая повышается до тех пор, пока идет ток. Если отсчет строго по сетке времен, то при изменении PWM величина конечного тока прямо пропорциональна скважности (положим), а "дискретные отсчеты" вернут почти постоянную величину. Если ADC запускать по event от выхода PWM, то этой "дискретности" нет. Так что - freerun не очень удачное решение.