极海APM32F003系列是一款小体积、低成本、高性能的MCU,其主要针对一些对成本比较敏感的应用,助力客户以更经济的成本研发制造出功能丰富的产品。所以APM32F003系列MCU的外设资源以常用为主,但也尽可能多的去满足客户更高的资源需求,比如在实现多通道ADC轮询采样的功能需求上,003也可以满足,这部分在同价位的友商产品上是没有的,这就进一步提高了产品的性价比。那么今天小编就给大家讲讲APM32F003系列MCU的ADC多通道轮询采样是怎么一回事?它是如何使用的呢?
看到这里有朋友肯定会问,是不是参考其他通用MCU(例如:F103、F407等)的配置方式来使用就好了?其实不然,下面小编也就不卖关子了,直接开门见山地给大家介绍一下003如何使用ADC多通道轮询采样功能?它的用法与其他通用MCU的使用方法又有何区别呢?
其实003使用ADC多通道轮询采样功能也很简单,大家可参考我司SDK例程包里Examples->ADC->ADC_MultiChannelScan这个例程。打开例程后,我们进入ADC连续扫描初始化的函数里,其函数名为ADC_ContinuousScanInit,首先进行的是ADC采样引脚的初始化,配置代码如下所示:
/* ADC GPIO configuration */
gpioConfig.intEn = GPIO_EINT_DISABLE;
gpioConfig.mode = GPIO_MODE_IN_FLOATING;
gpioConfig.pin = GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_4;
GPIO_Config(GPIOC, &gpioConfig);
可以看到这里初始化了3个引脚:PC5、PC6、PC4,通过查阅数据手册,其分别对应的是ADC的通道0,通道1和通道2。
然后接下来是对ADC进行初始化,配置代码如下所示:
ADC_SetMode(ADC_MODE_SINGLE_END);
/* ADC configuration */
ADC_ConfigStructInit(&adcConfig);
adcConfig.div = ADC_DIV_4;
adcConfig.convMode = ADC_CONV_MODE_CONTINUOUS;
adcConfig.scanMode = ADC_SCAN_MODE_ENABLE;
adcConfig.interrupt = ADC_INT_CC;
adcConfig.channel = ADC_CHANNEL_2;
ADC_Config(&adcConfig);
/* ADC Calibration */
ADC_Calibration();
ADC_Enable();
ADC_StartConversion();
ADC配置参数中第一个是ADC时钟分频参数,例程配置的是ADC_DIV_4,即4分频,因为ADC的时钟频率最大不能超过14MHz,如下图所示,在系统时钟为48MHz的情况下,ADC时钟为48/4=12MHz。
第二个参数是使能连续转换模式,例程配置的是ADC_CONV_MODE_CONTINUOUS,即使能连续转换模式。第三个参数是使能扫描模式,例程配置的是ADC_SCAN_MODE_ENABLE,即使能扫描模式。因为是要实现多通道连续转换功能,所以需要开启连续转换模式和扫描模式。
第四个参数是中断使能,这里大家根据实际需要是否开启中断。
第五个参数是配置通道,例程配置的是ADC_CHANNEL_2,到这里大家就产生疑惑了,我要实现多通道连续转换,这里为什么就只配置了一个通道呢?其实答案很简单,这里配置的是ADC_CHANNEL_2,就意味着系统会按照通道0,1,2这样的顺序循环采样。如果配置的是ADC_CHANNEL_3,那么系统会按照通道0,1,2,3这样的顺序循环采样;如果配置的是ADC_CHANNEL_7,那么系统会按照通道0,1,2,3,4,5,6,7这样的顺序循环采样。想必大家已经明白其中的奥秘了,这也就是003使用ADC多通道轮询采样功能与其他通用MCU的用法不一样的地方,003的多通道轮询采样必须从通道0开始,到程序中配置的通道x为止。
按照这样的方式配置好之后,我们将例程代码烧录到开发板上,打开串口即可看到通道0,1,2的采样数据。
那么有人肯定会问,那如果我想要实现通道1和通道7这种任意几个通道之间的轮询采样可以吗?如果要让系统自己来完成的话显然是不行的,不过这种情况可以按照单通道分别采样来完成,即先初始化配置通道1完成采样后,再重新初始化通道7并开启采样,以此循环。
以上就是关于APM32F003系列MCU如何使用ADC多通道轮询采样的一些见解,欢迎大家评论区讨论交流。
|