реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> xmega ADC - как оцифровать несколько отсчетов по событию?
u37
сообщение Apr 9 2013, 14:38
Сообщение #1





Группа: Участник
Сообщений: 5
Регистрация: 8-09-10
Пользователь №: 59 379



Хотелось бы получить несколько отсчетов по одному событию. Конкретно - имеется 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 не очень удачное решение.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st June 2025 - 07:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01324 секунд с 7
ELECTRONIX ©2004-2016