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

adnega

Свой
  • Постов

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

  • Посещение

  • Победитель дней

    3

Сообщения, опубликованные adnega


  1. Подскажите пожалуйста, в каком документе описана работа у STM32F103 system timer (sys_tick) ?

     

     

    Перерыл весь reference manual- не нашел, в последней его версии тоже.. :(

     

    Нужно читать документацию на ядро C-M3

  2. Схему собирал на макетке, сейчас ее уже нет. Насколько помню, тоже долго боролся за стабильность работы (шилась через раз), и главное что понял - не надо жалеть конденсаторов на 0.1uF ))

    Они у Вас в полном объеме? На макете не очень видно. Конденсаторы должны быть как можно ближе к процессору.

    Идею подглядывал тут (http://www.olimex.com/dev/images/lpc-h2103-sch.gif)

  3. Страница 640 UM10360 (LPC17xx UserManual):

     

    During a debugging session, the System Tick Timer and the Repetitive Interrupt Timers

    are automatically stopped whenever the CPU is stopped. Other peripherals are not

    affected. If the Repetitive Interrupt Timer is configured such that its PCLK rate is lower

    than the CPU clock rate, the RIT may not increment predictably during some debug

    operations, such as single stepping.

     

    Может это и есть причина? Хотя и не должен SysTick останавливаться во время выполнения инструкции...

  4. ШИМ по первому таймеру. Вывод двухполярного сигнала с частотой 44100Гц

    Делаю так.

     

    #define    FPLL            72000000            // частота при работе от PLL, Гц
    #define    PWM_N        (12)                // разрядность ЦАП, бит
    #define    PWM_F        (44100)            // частота оцифровки, Гц
    #define    PWM_P        ((FPLL/PWM_F)-1)    // предделитель
    
    
    //-------------------------------------------------------------
    // init_TIMER1()
    //-------------------------------------------------------------
    void __inline init_TIMER1()
    {
        TIM1->ARR=PWM_P;        // запись периода
        TIM1->PSC=0;            // запись базы
    
        TIM1->CR1=(1<<2)
            |(1<<TIM_CR1_ARPE)
            |(1<<TIM_CR1_CEN);
        TIM1->CR2=
            (0<<TIM_CR2_OIS2)
            |(0<<TIM_CR2_OIS2N)
            |(0<<TIM_CR2_OIS3)
            |(0<<TIM_CR2_OIS3N);
        TIM1->CCMR1=
            (1<<TIM_CCMR1_OC2PE)
            |(OC_MODE_PWM1<<TIM_CCMR1_OC2M);
        TIM1->CCMR2=
            (1<<TIM_CCMR2_OC3PE)
            |(OC_MODE_PWM1<<TIM_CCMR2_OC3M);
        TIM1->CCER=
            (1<<TIM_CCER_CC2NE)
            |(1<<TIM_CCER_CC3NE);
    
        TIM1->BDTR=
            (1<<TIM_BDTR_MOE)
            |(0<<TIM_BDTR_DTG);
    
        TIM1->DIER=
            (1<<TIM_DIER_UIE);
    
    }
    
    //-------------------------------------------------------------
    // void TIM1_UP_IRQHandler(void)
    //-------------------------------------------------------------
    void TIM1_UP_IRQHandler(void)
    {
        TIM1->CCR2=x;
        TIM1->CCR3=y;
        TIM1->SR=0;
    }

  5. Хм..

    По I2C подключил дисплей TIC-154, на SPI SD/MMC-карта (правда, CS ручками дергаю), делал и развертку VGA-сигнала (640x480) через SPI на stm32f103t4 - из-за недостатка памяти только текстовый режим (а ля, просмотр отладочных сообщение через RS232/TTL).

    Во всех реализациях проблем не имел - хотелось бы узнать какие есть проблемы (страшно ведь...)?

  6. Скорее всего, винда узнает размер карты (точнее, тома) из структуры в конце первого сектора карты - после записи "мусора" в первый сектор винда определяет карту размером 512 байт, не форматирует, и я не знаю как это победить средствами винды :)

  7. А в случае с I2C заморочек с уровнями нет. Выходы с открытым коллектором - подтянул резистором к 5В и работай (в основном 3.3В процы допускают подачу на вход такого уровня). Основной потребитель - подсветка, но природу не обманешь: считать все равно нужно ватты, а накладки от импульсного повышения напряжения (КПД < 100%)... мне неизвестны, но допускаю, что они не велики.

  8. По ссылке http://www.st.com/stonline/products/literature/an/15067.pdf можно найти документ "AN2834 How to get the best ADC accuracy in STM32F10xxx devices". Читать в пунктах 1.2.5 и 1.2.6. про паразитные R и C. Идея вкратце такая: большое значение Cain+Cp (ровно как Radc+Rain) могут ограничивать частоту исходного сигнала - т.к. требуется время для перезаряда конденсатора (что было очевидно изначально).

  9. Резистор у меня "рукодельный" (т.е. я его специально ставил, чтоб как-то ток ограничивать). Сопротивление 20+33 ома. Про емкость завтра поищу. Что-то видел в доках. Но заранее хочу предупредить, что для меня это не проблема, т.к. я не использую все отсчеты - получается так, что на каждый "нужный" отчет у меня приходится несколько "фиктивных", а последовательное преобразование в АЦП делаю лишь для соблюдения точных временных параметров и сбора в буфер по ДМА. Сигнал затухающий и "фиктивные" выборки стремятся к константе, т.е. до "нужного" отчета у меня оцифровывается сигнал близкий к этой константе (к половине питания) и влияние всегда одинаково.

     

    На ум приходят несколько, пожалуй, не самых удачных идей:

    1. Поставить повторитель сигнала перед каждым каналом: взять какой-нить быстродействующий ОУ, соединить выход с отрицательным входом, сигнал подавать на положительный вход, выход ОУ без всяких резисторов на ногу АЦП.

    2. Менять тайминги (т.е. 1.5 увеличить) или еще хуже между каждым каналом оцифровывать фиктивный с константой. Но это самых худший вариант по скорости.

    3. Перетасовать каналы и последовательность оцифровки так, чтобы предыдущий и последующий каналы не сильно отличались по амплитуде. На практике сложно выполнимо.

    4. Прикинуть модель работы входных цепей и делать программную коррекцию полученных данных. Потребует хорошей матобработки данных. Но, по-моему, самый перспективных вариант, если еще и п.1 сделать :)

    5. "Сгородить" схему, которая бы делала автоматическую компенсацию "следа", т.е. к сигналу, который нужно измерить добавлять "ошибку", такую, чтобы после работы АЦП получать исходный сигнал. Т.е. матобработку из п. 4 "переложить" но внешнюю аналоговую схему.

     

    Попробуйте проследить влияние предыдущей оцифровки на последующую - может не такая уж и сложная зависимость. Что-нить типа "из текущей оцифровки вычитай модуль разности текущей и предыдущей оцифровки деленный на 128"...

  10. Использовал в таком варианте:

    При ADCPRE=3 ("PCLK2/8") на частоте PLL 72МГц получаем 9МГц для тактирования АЦП.

    Tconv=1.5 + 12.5 = 14 тактов => Частота на канал 0.6МГц.

     

    Есть ряд замечаний:

    - начало преобразования можно очень точно задать (с точностью до такта процессора). Используя этот факт можно оцифровывать сигнал с эквивалентной скоростью 72МГц (если начало периодического сигнала тоже синхронизируется до такта);

    - после преобразования с 1.5 -тактовым промежутком остается "след" от предыдущего преобразования, но это, по-моему, и есть "not tested in production". В моем случае измеряемый сигнал подается на вход через резистор, на входе АЦП, так или иначе, стоит емкость - а ля, интегратор;

    - DMA рулит!

    - три канала одновременно не запомнить;

    - на входе АЦП половинное напряжение питания, как оно там получается - не разбирался.

     

    Кста, и при повышении частоты PLL до 96МГц - работает, но это для справки - можно судить об аналоговой части входа АЦП.

  11. Сенсор на тини13 довольно хорошо работает. Делал сам.

    1. Использовал принцип измерения времени заряда RC-цепочки. R - нужно брать гигантское (100 кОм), а C крошечными (12 пф). При таких номиналах входная помеха (50 Гц) неприлично высока, а время заряда всего несколько тактов ядра.

    2. На первом этапе просто измерял время заряда - сплошной шум, при касании немного приподнимается средний уровень. Затем начал делать измерения 50 раз в секунду - лучше, но ложных срабатываний много, скорость распознования низкая.

    3. Сейчас не начинаю измерение, пока не дождусь, когда сигнал с АЦП не снизится ниже заданного порога. Считаю, что измерение провожу в окресности нуля синусоиды. Работает стабильно и быстро - работаю над автокалибровкой. Дело в том, что сенсор у меня распределенный (провод полтора метра), а надежного заземления нет (заземление сделал из пластины фольги, служащей одной из обкладок конденсатора).

×
×
  • Создать...