本帖最后由 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单次转换功能的相关软件配置,供大家参考,如有疑问,请及时联系,谢谢!
|