你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

TIM2触发ADC采样问题?求助大家

[复制链接]
hans918 提问时间:2019-7-2 11:11 /
各位大神好:
本人使用STM32F103C6T6,期望目标是:TIM2采用中心对齐模式3,同时ADC_ExternalTrigConv_T2_CC2触发ADC采样?按照手册说明:在中心对齐模式3中增加和减少的过程中都会产生比较事件,比较事件可以触发ADC,这样按照手册说明应该是触发两次采样,但是我测试情况发现无论如何都只触发一次采样?而且都是在增加过程中的比较点处触发?是哪里有问题?
已经明确的问题:1、不是两次采样中间时间不够,已经确保两次采样之间的时间足够完成,确保了两次之间的时间够长。2、确保了TIM2是中心对齐模式,3、确保了ADC能够触发采样,只是在一个周期内没有触发两次,在此恳请各位帮忙解答一下,谢谢,
如下式我的程序还请各位有空帮忙查看:
//ADC
void ADC_Config(void)
{
        GPIO_InitTypeDef  GPIO_InitStruct;
        ADC_InitTypeDef   ADC_InitStruct;
        DMA_InitTypeDef   DMA_InitStruct;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;
        GPIO_Init(GPIOA, &GPIO_InitStruct);

        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
        DMA_DeInit(DMA1_Channel1);
        DMA_InitStruct.DMA_PeripheralBaseAddr = ( Uint32 ) ( & ( ADC1->DR ));
        DMA_InitStruct.DMA_MemoryBaseAddr                = (Uint32)ADC_ConvResult;
        DMA_InitStruct.DMA_DIR                                         = DMA_DIR_PeripheralSRC;
        DMA_InitStruct.DMA_BufferSize                         = ADC_SAMPLE_NUM;   
        DMA_InitStruct.DMA_PeripheralInc                 = DMA_PeripheralInc_Disable;
        DMA_InitStruct.DMA_MemoryInc                         = DMA_MemoryInc_Enable;  
        DMA_InitStruct.DMA_PeripheralDataSize         = DMA_PeripheralDataSize_HalfWord;
        DMA_InitStruct.DMA_MemoryDataSize                 = DMA_MemoryDataSize_HalfWord;
        DMA_InitStruct.DMA_Mode                                 = DMA_Mode_Circular;       
        DMA_InitStruct.DMA_Priority                         = DMA_Priority_High;
        DMA_InitStruct.DMA_M2M                                         = DMA_M2M_Disable;
        DMA_Init(DMA1_Channel1, &DMA_InitStruct);
        DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE);
        DMA_Cmd(DMA1_Channel1 , ENABLE);

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
        ADC_InitStruct.ADC_Mode                                 = ADC_Mode_Independent;
        ADC_InitStruct.ADC_ScanConvMode                 = ENABLE;
        ADC_InitStruct.ADC_ContinuousConvMode         = DISABLE;
        ADC_InitStruct.ADC_ExternalTrigConv         = ADC_ExternalTrigConv_T2_CC2;
        ADC_InitStruct.ADC_DataAlign                         = ADC_DataAlign_Right;
        ADC_InitStruct.ADC_NbrOfChannel                 = ADC_SAMPLE_NUM;
        ADC_Init(ADC1, &ADC_InitStruct);
        RCC_ADCCLKConfig(RCC_PCLK2_Div6);
        ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 1, ADC_SampleTime_1Cycles5);
        ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 2, ADC_SampleTime_1Cycles5);
        ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 3, ADC_SampleTime_1Cycles5);
        ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 4, ADC_SampleTime_1Cycles5);
        ADC_DMACmd(ADC1, ENABLE);
        //ADC_ITConfig(ADC1,ADC_IT_EOC, ENABLE);
        ADC_Cmd(ADC1,ENABLE);
       
        ADC_ResetCalibration(ADC1);
       
        while(ADC_GetResetCalibrationStatus(ADC1))
        {
                ;
        }
       
        ADC_StartCalibration(ADC1);
       
        while(ADC_GetCalibrationStatus(ADC1))
        {
                ;
        }

        ADC_ExternalTrigConvCmd(ADC1,ENABLE);

        NVIC_InitTypeDef NVIC_InitTyStuct;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        NVIC_InitTyStuct.NVIC_IRQChannel = DMA1_Channel1_IRQn;
        NVIC_InitTyStuct.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitTyStuct.NVIC_IRQChannelSubPriority = 1;
        NVIC_InitTyStuct.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitTyStuct);

}

void TIM2_Config(void)
{
        TIM_TimeBaseInitTypeDef          TIM_TimeBaseStructure;
        TIM_OCInitTypeDef                          TIM_OCInitStructure;
       
        /* TIM2 clock enable */
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);       

        /* GPIOA, GPIOB and GPIOE Clocks enable */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
#if 1
        GPIO_InitTypeDef                         GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
#endif       
        /* Time Base configuration */
        TIM_TimeBaseStructure.TIM_Prescaler                 = 0;
        TIM_TimeBaseStructure.TIM_CounterMode                 = TIM_CounterMode_Up;
        TIM_TimeBaseStructure.TIM_Period                         = EPWM_TIMER_TBPRD - 1;
        TIM_TimeBaseStructure.TIM_ClockDivision         = 0;
        TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

        /* Channel 1, 2,3 and 4 Configuration in PWM mode */
        TIM_OCInitStructure.TIM_OCMode                        = TIM_OCMode_PWM2;
        TIM_OCInitStructure.TIM_OutputState                = TIM_OutputState_Enable;
        TIM_OCInitStructure.TIM_Pulse                        = EPWM_TIMER_TBPRD - 600;
        TIM_OCInitStructure.TIM_OCPolarity                = TIM_OCPolarity_High;
        TIM_OCInitStructure.TIM_OCIdleState         = TIM_OCIdleState_Set;
        TIM_OC2Init(TIM2, &TIM_OCInitStructure);
       
        TIM_OC2PreloadConfig(TIM2, DISABLE);
        /* TIM2 Main Output Enable */
        TIM_CtrlPWMOutputs(TIM2, ENABLE);
#if 0       
        TIM_SelectOutputTrigger(TIM1, TIM_TRGOSource_Enable);
        TIM_SelectInputTrigger(TIM2, TIM_TS_ITR0);               
        TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Gated);
        TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);
#endif

        TIM_Cmd(TIM2, ENABLE);

        //TIM_Cmd(TIM1, ENABLE);
}

收藏 评论5 发布时间:2019-7-2 11:11

举报

5个回答
hans918 回答时间:2019-7-2 11:20:01
不好意思?上面的TIM2配置程序,是我为了解决问题而改的一种,采样边沿对齐模式,这样就就可以出发采样两次,但是在中心对齐模式3下面的确是只出发一次。
程序如下:
void TIM2_Config(void)
{
        TIM_TimeBaseInitTypeDef          TIM_TimeBaseStructure;
        TIM_OCInitTypeDef                          TIM_OCInitStructure;
       
        /* TIM2 clock enable */
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);       

        /* GPIOA, GPIOB and GPIOE Clocks enable */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
#if 1
        GPIO_InitTypeDef                         GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
#endif       
        /* Time Base configuration */
        TIM_TimeBaseStructure.TIM_Prescaler                 = 0;
        TIM_TimeBaseStructure.TIM_CounterMode                 = TIM_CounterMode_CenterAligned3;
        TIM_TimeBaseStructure.TIM_Period                         = EPWM_TIMER_TBPRD;
        TIM_TimeBaseStructure.TIM_ClockDivision         = 0;
        TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

        /* Channel 1, 2,3 and 4 Configuration in PWM mode */
        TIM_OCInitStructure.TIM_OCMode                        = TIM_OCMode_PWM2;
        TIM_OCInitStructure.TIM_OutputState                = TIM_OutputState_Enable;
        TIM_OCInitStructure.TIM_Pulse                        = EPWM_TIMER_TBPRD - 600;
        TIM_OCInitStructure.TIM_OCPolarity                = TIM_OCPolarity_High;
        TIM_OCInitStructure.TIM_OCIdleState         = TIM_OCIdleState_Set;
        TIM_OC2Init(TIM2, &TIM_OCInitStructure);
       
        TIM_OC2PreloadConfig(TIM2, DISABLE);
        /* TIM2 Main Output Enable */
        TIM_CtrlPWMOutputs(TIM2, ENABLE);
#if 1       
        TIM_SelectOutputTrigger(TIM1, TIM_TRGOSource_Enable);
        TIM_SelectInputTrigger(TIM2, TIM_TS_ITR0);               
        TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Gated);
        TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);
#endif

        TIM_Cmd(TIM2, ENABLE);

        TIM_Cmd(TIM1, ENABLE);
}
wenyangzeng 回答时间:2019-7-2 11:41:54
ST官方有例程可以参考呀:
TIMTrigger_AutoInjection.rar (14.06 KB, 下载次数: 3)

评分

参与人数 1蝴蝶豆 +4 收起 理由
STMCU + 4

查看全部评分

hans918 回答时间:2019-7-2 11:45:51
wenyangzeng 发表于 2019-7-2 11:41
ST官方有例程可以参考呀:

首先要谢谢您的关注,可能你没有仔细看我的说明,你发的ST例程是边沿模式,TMI计数增加,采样TIM1-CC1触发我这里也没问题,不过还是要谢谢你。
wenyangzeng 回答时间:2019-7-2 13:03:37
hans918 发表于 2019-7-2 11:45
首先要谢谢您的关注,可能你没有仔细看我的说明,你发的ST例程是边沿模式,TMI计数增加,采样TIM1-CC1触 ...

根据官方手册,定时器触发ADC只在上升沿触发,楼主哪里看到下降沿也可以触发ADC?
无标题1.png
mikecai 回答时间:2019-7-3 09:58:21
采用中心对齐时,用TIM2 triggle event output:OC2REF[output compare 2],同时ADC外部触发事件 改为TIM2 OC2REF,注意要设时间点比较值啊,这样中心对齐TIM2 可提供两次触发事件,就可两次采样了。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版