打印
[APM32F1]

APM32定时器触发ADC采样

[复制链接]
760|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 JunKook 于 2022-11-10 12:47 编辑

APM32的ADC使用非常灵活,采样触发方面:既支持软件触发,定时器或其他硬件电路自动触发,也支持转换完成后自动触发下一通道转换;转换结果存储方面:既支持软件读取和转存,也支持DMA自动存储转换结果。本文就给大家介绍一下如何通过APM32F103的定时器来触发ADC单次转换功能?即可实现定时完成ADC采样功能,同样也实现了ADC采样率的设置。由于定时器触发ADC采样,是属于外部触发转换的一种方式,所以我们首先需要查阅用户手册,找到关于外部触发ADC采样的这部分内容,如下图所示,可以看出,APM32F103的ADC1和ADC2用于规则通道的外部触发可以有以上6个事件信号,本文就以定时器3的TRGO信号来触发ADC的规则组,ADC1的通道9进行采样为例,给大家展开相关配置介绍。

接下来我们首先看一下定时器3的软件配置,如下所示:
void TIMER3_Init(void)
{
    TMR_BaseConfig_T TMR_BaseConfigStruct;

    RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_TMR3);

    TMR_BaseConfigStruct.clockDivision = TMR_CLOCK_DIV_1;
    TMR_BaseConfigStruct.countMode = TMR_COUNTER_MODE_UP;
    TMR_BaseConfigStruct.division = 7199;
    TMR_BaseConfigStruct.period = 999;
    TMR_BaseConfigStruct.repetitionCounter = 0;
    TMR_ConfigTimeBase(TMR3, &TMR_BaseConfigStruct);
    TMR_SelectOutputTrigger(TMR3, TMR_TRGO_SOURCE_UPDATE);

    TMR_Enable(TMR3);
}
由于我们选择的是定时器3的TRGO信号触发ADC,TRGO属于内部触发信号,所以不需要配置对应的输出IO脚,相当于是定时器3的内部计数一样,只是到了一定时间就产生TRGO信号,从而触发ADC转换,而这个触发的实现不依赖IO口的配置。上述代码中TMR_SelectOutputTrigger(TMR3, TMR_TRGO_SOURCE_UPDATE)是选择产生TRGO信号的事件,本例中选择定时器3发生计数更新事件产生TRGO信号。
然后我们再进行ADC的软件配置,如下所示:
void  ADC_Init(void)
{         
    ADC_Config_T ADC_ConfigStruct;

    RCM_ConfigADCCLK(RCM_PCLK2_DIV_2);
    RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_ADC1);

    ADC_Reset(ADC1);
    ADC_ConfigStruct.mode = ADC_MODE_INDEPENDENT;
    ADC_ConfigStruct.scanConvMode = DISABLE;
    ADC_ConfigStruct.continuosConvMode = DISABLE;
    ADC_ConfigStruct.externalTrigConv = ADC_EXT_TRIG_CONV_TMR3_TRGO;
    ADC_ConfigStruct.dataAlign = ADC_DATA_ALIGN_RIGHT;
    ADC_ConfigStruct.nbrOfChannel = 1;
    ADC_Config(ADC1, &ADC_ConfigStruct);

    ADC_ConfigRegularChannel(ADC1, ADC_CHANNEL_9, 1, ADC_SAMPLETIME_239CYCLES5);

    NVIC_EnableIRQRequest(ADC1_2_IRQn, 1, 2);
    ADC_EnableInterrupt(ADC1, ADC_INT_EOC);
    ADC_Enable(ADC1);

    ADC_ResetCalibration(ADC1);
    while(ADC_ReadResetCalibrationStatus(ADC1));
    ADC_StartCalibration(ADC1);
    while(ADC_ReadCalibrationStartFlag(ADC1));

    ADC_EnableExternalTrigConv(ADC1);
}
本例中我们实现的是ADC的单次转换,所以在上述代码的ADC通道配置中,只配置了ADC1的通道9这一个通道。另外参数ADC_ConfigStruct.externalTrigConv = ADC_EXT_TRIG_CONV_TMR3_TRGO的配置是完成外部事件定时器3的TRGO信号触发ADC转换。最后还要使能ADC的外部触发事件,调用API函数ADC_EnableExternalTrigConv(ADC1)即可。
以上就是通过APM32F103的定时器来触发ADC单次转换功能的相关软件配置,供大家参考,如有疑问,请及时联系,谢谢!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:极海半导体
简介:珠海极海半导体有限公司是一家致力于开发工业级/车规级微控制器、模拟与混合信号IC及系统级芯片的集成电路设计型企业。极海团队拥有20年集成电路设计经验和嵌入式系统开发能力,可为客户提供核心可靠的芯片产品及方案,实现准确感应、安全传输和实时控制,助力客户在智慧家居、高端消费电子、工业控制、汽车电子、智慧能源以及通信设施等领域的拓展创新。

15

主题

55

帖子

1

粉丝