Перейти к содержанию
    

u37

Участник
  • Постов

    5
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный
  1. Пфффф .... Не знаю как у ТС, а у меня проблема была в конденсаторе токового датчика. Увы, L6699 очень напоминает "автогенератор" и не допускает запуск по частям (и валится при срыве генерации). Так что - у кого будут проблемы, учтите этот нюанс.
  2. Извините, что поднимаю старую тему. Сталкнулся с точно таким же случаем - на выводе Cf нет генерации, на выходе нижнего ключа есть напряжение. Не могли бы поделиться какими новыми идеями?
  3. Благодарю за помощь! Начал причесывать проект после 3-х дней "издевательств" и обнаружил замечательную наведенную ошибку. Теперь всё работает. В начальной инициализации, перед main, существует вставка "__libc_init_array". По заверению , эта "фича" избыточна, т.к. выхода из main не существует. В других моих проектах ее наличие/отсутствие никак не сказывается, вот я ее и убрал. Не люблю оставлять в коде то, что не является нужным, вылезет доком. Увы, "вылезло", минус 3 дня. (( Извините.
  4. Попробовал поставить scmRTOS v5.1 на STM32F030 под GCC - программа компилируется но дает неправильный результат. При выполнении первой же инструкции в asm последовательности следует HardFault. Компилятор arm-eabi (кажется 5.3.0) Но это не всё. Если заменить MCU на STM32F103, то тот-же (аналогично собранный) проект работает сразу, без какого либо вмешательства. По картинке - (на STM32F030) Инструкция, на которой следует зависание, будет исполняться "сейчас": Вариант под Keil v4.0 под CortexM0 у меня есть, он нормально работает, но мне нужно под GСС. Если не затруднит, подскажите, как это исправить.
  5. Хотелось бы получить несколько отсчетов по одному событию. Конкретно - имеется 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 не очень удачное решение.
×
×
  • Создать...