×
嵌入式 > 嵌入式开发 > 详情

STM32之ADC

发布时间:2024-05-13 发布时间:
|

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转换配置完毕。很麻烦......也许功能强大的副产品就是麻烦吧,没有办法。



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
Diodes 推出单闸逻辑设备.助力ADAS 等车用产品应用