微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32之ADC

STM32之ADC

时间:11-26 来源:互联网 点击:

ADC是多少位的?

12位

ADC有多少个?

1个、2个或多至3个,视不同的器件而不同;每个又有多个通道。

关于通道的名堂:

10.3.3通道选择

有16个多路通道。可以把转换分成两组:规则的和注入的。在任意多个通道上以任意顺序进行的一系列转换构成成组转换。例如,可以如下顺序完成转换:通道3、通道8、通道2、通道2、通道0、通道2、通道2、通道15。

规则组由多达16个转换组成。规则通道和它们的转换顺序在ADC_SQRx寄存器中选择。规则组中转换的总数写入ADC_SQR1寄存器的L[3:0]位中。

注入组由多达4个转换组成。注入通道和它们的转换顺序在ADC_JSQR寄存器中选择。注入组里的转换总数目必须写入ADC_JSQR寄存器的L[1:0]位中。

它们有什么区别:

不同的组转换后保存数据的地方不一样,产生的中断标志不一样。

在扫描模式下,规则组会有能力把各通道数据通过DMA传给SRAM,而注入组的数据总是存在在ADC_JDRx中。

还有其他的一些区别,这里暂不一一罗列。

ST为什么这么样来设计AD转换,肯定是有理由的,但是我不知道,因此,我也就难以深入地理解AD转换的各种模式。这也就是说,对于知识的理解,要把它放在其应用背景中去学习才能学得好。因此,其他相关知识积累得越多,这里学起来也就越快,这也就是所谓的“功底”问题。某人功底深厚,意味着他见多识广,遇到的事情多,能够很快找到处理某件事情的“原型”。当然,也有一些人抽象学习能力极强,就算找不到“原型”,他也能学得很好。基本上,这类人的科学素养更高一些,在工程师、工科类学生中并不多见。

闲话少说,下面来看怎么样来使用AD转换器?

以一段源程序为例分别来解读,同时进一步理解STM32中有关符号的含义,相信以后再读库源程序,定能更上一层楼。

为看得清楚一些,以下代码用蓝色表示,而在这段代码的注释中插入的一些代码则用红色表示。从数据手册上摘录下来的内容则用黄底来表示(本来数据手册摘录部分用贴图是最好的,但是发表博文时贴图太痛苦了,,,偷点懒)。

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;

ADC_InitStructure.ADC_ScanConvMode = ENABLE;

ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;

ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;

ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;

ADC_InitStructure.ADC_NbrOfChannel = 1;

ADC_Init(ADC1, &ADC_InitStructure);

通过前面一系列的设置,终于可以执行ADC_Init函数了。执行完了还不行,还要指定通道转换顺序,采样时间等,接下继续。

ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 1, ADC_SampleTime_55Cycles5);

if (Rank < 7)//这个Rand就是第三个参数

{

tmpreg1 = ADCx->SQR3;

tmpreg2 = SQR3_SQ_Set < (5 * (Rank - 1));

SQR3的值如下:

//#define SQR3_SQ_Set((uint32_t)0x0000001F)

之所以用5去乘,看下图中的表格:ADC_SQ3中SQ1~SQ6每个都是占5位。

这下理解了:如果这个Rank是1,那么tmpreg2这个变量第[4:0]这5位将会是11111(即SQR3_SQ_Set的初始值:0x0000001f),如果Rank是2,那么tmpreg2这个变量的第[9:5]将会是11111,即tmpreg2将等于:0x000003e0,依此类推。

tmpreg1 &= ~tmpreg2;

tmpreg2 = (uint32_t)ADC_Channel < (5 * (Rank - 1));

tmpreg1 |= tmpreg2;

ADCx->SQR3 = tmpreg1;

}

*/

第四个参数是采样时间设定,代码如下:

tmpreg2 = (uint32_t)ADC_SampleTime < (3 * ADC_Channel);

tmpreg1 |= tmpreg2;

ADCx->SMPR2 = tmpreg1;

接下来还有两件事要做,第一件是允许DMA传输

ADC_DMACmd(ADC1, ENABLE);

第二件是打开ADC1开始转换。

ADC_Cmd(ADC1, ENABLE);

这两件事情都不麻烦,所以就不再分析了。

至此一次ADC转换配置完毕。很麻烦......也许功能强大的副产品就是麻烦吧,没有办法。


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top