Skip to main content
tiago
Associate II
March 22, 2010
Question

TIM1 triggering ADC

  • March 22, 2010
  • 7 replies
  • 1476 views
Posted on March 22, 2010 at 19:22

TIM1 triggering ADC

    This topic has been closed for replies.

    7 replies

    daviddavid94
    Associate II
    May 17, 2011
    Posted on May 17, 2011 at 13:44

    Also - make sure TIM1's MOE is asserted.

    daviddavid94
    Associate II
    May 17, 2011
    Posted on May 17, 2011 at 13:44

    Assuming you are using the libraries :

    If you have done ADC_Init(), with ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1 (or whichever CC channel you are using).

    And you have done :

    ADC_ExternalTrigConvCmd( ADC1, ENABLE );

    Then, if your SW trigger works, this should also - SW trigger working means you must have the ADC correctly set up, for the most part.

    If you're already doing this, you will probably need to post some of your code.

    daviddavid94
    Associate II
    May 17, 2011
    Posted on May 17, 2011 at 13:44

    I believe you will need to set up a compare channel (an additional one) as an *output* to trigger the ADC with. The trigger IS the output which requires MOE - I think. Not 100% sure; I have similar code to what you are doing, but I am generating a PWM signal, not detecting one, so I can trigger the ADC with my compare channel directly.

    Good luck.

    tiago
    tiagoAuthor
    Associate II
    May 17, 2011
    Posted on May 17, 2011 at 13:44

    Hi Brian.

    I'm not using ST Libraries, just using directly the registers.

    I've compared some ST code examples and also that commands you just sent and I think everything is ok, my code and ST Libraries are doing the same thing. When I debug with IAR and inspect STM registers, everything is ok too.

    As you mentioned, ADC is working properly and seems to me that the unique difference when triggering ADC by software or external sources is the EXTSEL field in ADC_CR2 register... So I suspect my error is on TIM1configuration, precisely on event generation that should trigger ADC.

    Below the most important pieces of my code:

    //######### Timer Configuration #########

        RCC_APB2ENR->TIM1EN = 1; //enable timer clock

        TIM1_CR1->CEN = 0; //disable counter

        TIM1_CR1->ARPE = 1; //auto reload

        TIM1_PSC = 500;    //Timer prescaler. clk = 10KHz

        TIM1_ARR = 0xFFFF;

        TIM1_CNT = 0xFFFF;

        //Configure channel

        TIM1_CCMR1->CC1S = 2; //IC1 mapped to CH2

        TIM1_CCMR1->IC1PSC = 0; //No prescaler

        TIM1_CCMR1->IC1F = 0; //No filter

        TIM1_CCER->CC1P = 0; //active on rising edge

        //Configure channel

        TIM1_CCMR1->CC2S = 1; //IC1 mapped to CH2

        TIM1_CCMR1->IC2PSC = 0; //No prescaler

        TIM1_CCMR1->IC2F = 0; //No filter

        TIM1_CCER->CC2P = 1;     //active on falling edge

        //Timer mode - PWM Input Capture

        TIM1_SMCR->TS = 6;     //trigger input

        TIM1_SMCR->SMS = 4;     //slave mode reset

        //Enable captures

        TIM1_CCER->CC1E = 1;

        TIM1_CCER->CC2E = 1;

        //Configure interruptions and DMA

        TIM1_DIER->CC2DE = 1; //CC2 DMA request enabled

    As you suggested I enabled MOE bit, but I didn't understand why

    this is needed. I'm using Input PWM mode and it seems to deal with

    outputs. Sorry if I'm wrong. Anyway I tested with it and got no trigger.

        TIM1_BDTR->MOE = 1;

        //Enable timer

        TIM1_CR1->CEN = 1;

    Thanks a lot for your attention.

    Best regards.
    damh
    Associate III
    May 17, 2011
    Posted on May 17, 2011 at 13:44

    In general look at the images instead of the text in the stm datasheets. The text doesn't even mention many hard facts like this feature in this thread. The images have been ok for me yet. Nothing is so unspecific or changeable like the text says. Many hardware parts ONLY work in exactly ONE way. If you choose an other way, i doesn't work ;)

    tiago
    tiagoAuthor
    Associate II
    May 17, 2011
    Posted on May 17, 2011 at 13:44

    Thanks a lot for your help Brian.

    I founded other user with similar problem and he solved it like you sugested: using a pwm output. [DEAD LINK /public/STe2ecommunities/mcu/Lists/ARM%20CortexM3%20STM32/Flat.aspx?RootFolder=/public/STe2ecommunities/mcu/Lists/ARM CortexM3 STM32/ADC ADC Watchdog Triggered by Timer&FolderCTID=0x01200200770978C69A1141439FE559EB459D758000626BE2B829C32145B9EB5739142DC17E&currentviews=754]See discution here.

    The most weird thing it seems to be an information inexistent in datasheet...

    Datasheet error? Bad interpretation?

    If anyone could explain this many would be greatfull....

    Tomas DRESLER
    Associate II
    May 17, 2011
    Posted on May 17, 2011 at 13:44

    Use the FW library and examples, if only for setup, it helps :)

    When all is done, you can change anything in registers and avoid lot of troubles.