stm32f103最少有2个AD模数转换器.docx

上传人:b****2 文档编号:24397075 上传时间:2023-05-27 格式:DOCX 页数:22 大小:460.68KB
下载 相关 举报
stm32f103最少有2个AD模数转换器.docx_第1页
第1页 / 共22页
stm32f103最少有2个AD模数转换器.docx_第2页
第2页 / 共22页
stm32f103最少有2个AD模数转换器.docx_第3页
第3页 / 共22页
stm32f103最少有2个AD模数转换器.docx_第4页
第4页 / 共22页
stm32f103最少有2个AD模数转换器.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

stm32f103最少有2个AD模数转换器.docx

《stm32f103最少有2个AD模数转换器.docx》由会员分享,可在线阅读,更多相关《stm32f103最少有2个AD模数转换器.docx(22页珍藏版)》请在冰豆网上搜索。

stm32f103最少有2个AD模数转换器.docx

stm32f103最少有2个AD模数转换器

 STM32 ADC 采样 频率的确定

   (4)16.7 可编程的通道采样时间

ADC 使用若干个ADC_CLK 周期对输入电压采样,采样周期数目可以通过

ADC_SMPR1 和ADC_SMPR2 寄存器中的SMP[2:

0]位而更改。

每个通道可以以

不同的时间采样。

总转换时间如下计算:

TCONV = 采样时间+12.5 个周期

例如:

当ADCCLK=14MHz 和1.5 周期的采样时间

TCONV = 1.5+12.5=14 周期 =1μs

 

 

SMPx[2:

0]:

选择通道x的采样时间

这些位用于独立地选择每个通道的采样时间。

在采样周期中通道选择位必须保持不变。

000:

1.5周期 100:

41.5周期

001:

7.5周期 101:

55.5周期

010:

13.5周期 110:

71.5周期

011:

28.5周期 111:

239.5周期

注:

–ADC1的模拟输入通道16和通道17在芯片内部分别连到了温度传感器和VREFINT。

–ADC2的模拟输入通道16和通道17在芯片内部连到了VSS。

 

2.     具体分析如下:

 

(1)我们的输入信号是50Hz (周期为20ms),初步定为1周期200个采样点,(注:

一周期最少采20个点,即采样率最少为1k),每2个采样点间隔为 20ms/200=100us

ADC可编程的通道采样时间我们选最小的 1.5 周期,则 ADC采样周期一周期大小为

100us/1.5=66us 。

 ADC 时钟频率为 1/66us=15KHz。

  ADC可编程的通道采样时间我们选71.5 周期,则 ADC采样周期一周期大小为

(100us/71.5)。

 ADC 时钟频率为 7.15MHz。

 

(2)接下来我们要确定系统时钟:

我们用的是 8M Hz 的外部晶振做时钟源(HSE),估计得经过 PLL倍频 PLL 倍频系数分别为2的整数倍,最大72MHz。

为了提高数据计算效率,我们把系统时钟定为72MHz,(PLL9倍频)。

则 PCLK2=72MHz,PCLK1=36MHz;

 

我们通过设置时钟配置寄存器(RCC_CFGR) 中 有 为ADC 时钟提供一个专用的可编程预分器,将PCLK28 分频后作为ADC 的时钟,则可知ADC 时钟频率为 9MHz

        从手册可知:

 ADC 转换时间:

STM32F103xx 增强型产品:

ADC 时钟为56MHz 时为1μs(ADC 时钟为72MHz 为1.17μs)

 (3)由以上分析可知:

不太对应,我们重新对以上中内容调整,提出如下两套方案:

 

方案一:

我们的输入信号是50Hz (周期为20ms),初步定为1周期2500个采样点,(注:

一周期最少采20个点,即采样率最少为1k),每2个采样点间隔为 20ms/2500=8us

ADC可编程的通道采样时间我们选71.5 周期,则 ADC采样周期一周期大小为

8us/71.5 。

 ADC 时钟频率约为 9MHz。

将PCLK2 8 分频后作为ADC 的时钟,则可知ADC 时钟频率为 9MHz

 

方案二:

我们的输入信号是50Hz (周期为20ms),初步定为1周期1000个采样点,(注:

一周期最少采20个点,即采样率最少为1k),每2个采样点间隔为 20ms/1000=20us

ADC可编程的通道采样时间我们选239.5周期,则 ADC采样周期一周期大小为

20us/239.5 。

 ADC 时钟频率约为 12MHz。

将PCLK26 分频后作为ADC 的时钟,则可知ADC 时钟频率为 12MHz

 

stm32f103最少有2个AD模数转换器,每个ADC都有18个通道,可以测量16个外部和2个内部模拟量。

最大转换频率为1Mhz,也就是转换时间为1us(在ADCCLK=14Mhz,采样周期为1.5个时钟周期时)。

最大时钟超过14Mhz,将导致ADC转换准确度降低。

stm32的ADC是12位精度的。

stm32的ADC转换有两种通道,规则通道和注入通道,注入通道可以抢占式地打断规则通道的采样,执行注入通道采样后,再执行之前的规则通道采样,和中断类似。

本例只使用规则通道实现独立模式的中断采样,这里不再赘述两种通道区别。

stm32的ADC可以由外部事件触发(例如定时器捕获,EXTI线)和软件触发(即在配置相关寄存器时,直接开启采样)。

STM32的ADC在单次转换模式下,只执行一次转换,该模式可以通过ADC_CR2寄存器的ADON位(只适用于规则通道)启动,也可以通过外部触发启动(适用于规则通道和注入通道),这是CONT位为0。

以规则通道为例,一旦所选择的通道转换完成,转换结果将被存在ADC_DR寄存器,EOC(转换结束)标志将被置位,如果设置了EOCIE,则会产生中断。

然后ADC将停止,直到下次启动。

寄存器简介

ADC控制寄存器(ADC_CR1和ADC_CR2)

ADC_CR1的SCAN位,该位用于设置扫描模式,由软件设置和清除,如果设置为1,则使用扫描模式,如果为0,则关闭扫描模式。

在扫描模式下,由ADC_SQRx或ADC_JSQRx寄存器选中的通道被转换。

如果设置了EOCIE或JEOCIE,只在最后一个通道转换完毕后才会产生EOC或JEOC中断。

ADC_CR1[19:

16]用于设置ADC的操作模式

ADC_CR2

ADCON 位用于开关AD转换器。

而CONT位用于设置是否进行连续转换,我们使用单次转换,所以CONT位必须为0。

CAL和RSTCAL用于AD校准。

ALIGN用于设置数据对齐,我们使用右对齐,该位设置为0 。

EXTSEL[2:

0]用于选择启动规则转换组转换的外部事件,详细的设置关系如下:

这里使用的是软件触发(SWSTART),所以设置这3个位为111。

ADC_CR2的SWSTART位用于开始规则通道的转换,我们每次转换(单次转换模式下)都需要向该位写1。

AWDEN为用于使能温度传感器和Vrefint。

ADC采样事件寄存器(ADC_SMPR1和ADC_SMPR2)

这两个寄存器用于设置通道0~17的采样时间,每个通道占用3个位。

ADC_SMPR2的各位描述如下

对于每个要转换的通道,采样时间建议尽量长一点,以获得较高的准确度,但是这样会降低ADC的转换速率。

ADC的转换时间可以由下式计算:

Tcovn=采样时间+12.5个周期

其中:

Tcovn为总转换时间,采样时间是根据每个通道的SMP位的设置来决定的。

例如,当ADCCLK=14Mhz的时候,并设置1.5个周期的采样时间,则得到:

Tcovn=1.5+12.5=14个周期=1us。

ADC规则序列寄存器(ADC_SQR1~3)

L[3:

0]用于存储规则序列的长度,我们这里只用了1个,所以设置这几个位的值为0。

其他的SQ13~16则存储了规则序列中第13~16个通道的编号(0~17)。

另外两个规则序列寄存器同ADC_SQR1大同小异,我们这里就不再介绍了,要说明一点的是:

我们选择的是单次转换,所以只有一个通道在规则序列里面,这个序列就是SQ0,通过ADC_SQR3的最低5位设置。

ADC规则数据寄存器(ADC_DR)

这里要提醒一点的是,该寄存器的数据可以通过ADC_CR2的ALIGN位设置左对齐还是右对齐。

在读取数据的时候要注意。

ADC状态寄存器(ADC_SR)

这里我们要用到的是EOC位,我们通过判断该位来决定是否此次规则通道的AD转换已经完成,如果完成我们就从ADC_DR中读取转换结果,否则等待转换完成。

寄存器操作步骤

1、开启PA口时钟,设置PA0为模拟输入。

STM32F103RBT6的ADC通道0在PA0上,所以,我们先要使能PORTA的时钟,然后设置PA0为模拟输入。

2、使能ADC1时钟,并设置分频因子。

要使用ADC1,第一步就是要使能ADC1的时钟,在使能完时钟之后,进行一次ADC1的复位。

接着我们就可以通过RCC_CFGR设置ADC1的分频因子。

分频因子要确保ADC1的时钟(ADCCLK)不要超过14Mhz。

3、设置ADC1的工作模式。

在设置完分频因子之后,我们就可以开始ADC1的模式配置了,设置单次转换模式、触发方式选择、数据对齐方式等都在这一步实现。

4、设置ADC1规则序列的相关信息。

接下来我们要设置规则序列的相关信息,我们这里只有一个通道,并且是单次转换的,所以设置规则序列中通道数为1,然后设置通道0的采样周期。

5、开启AD转换器,并校准。

在设置完了以上信息后,我们就开启AD转换器,执行复位校准和AD校准,注意这两步是必须的!

不校准将导致结果很不准确。

6)读取ADC值。

在上面的校准完成之后,ADC就算准备好了。

接下来我们要做的就是设置规则序列0里面的通道,然后启动ADC转换。

在转换结束后,读取ADC1_DR里面的值就是了。

硬件设置:

我们通过ADC1的通道0(PA0)来读取外部电压值。

注意:

这里不能接到板上5V电源上去测试,这可能会烧坏ADC!

程序设计

ADC采样得到的只是一个相对值,将转换值/4096*参考电压即可得到采样电压这里的4096是因为stm32的adc为12位精度,表示参考电压时即为2^12=4096

MAIN.C

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

#include

#include"sys.h"

#include"usart.h"     

#include"delay.h" 

#include"led.h"

#include"key.h"

#include"exti.h"

#include"wdg.h"

#include"timer.h"

#include"lcd.h"      

#include"rtc.h"

#include"wkup.h"

#include"adc.h"

//ADC实验

intmain(void)

{      

    u16adcx;

    floattemp;

    Stm32_Clock_Init(9);//系统时钟设置

    delay_init(72);    //延时初始化

    uart_init(72,9600);//串口1初始化  

    led_init();

    LCD_Init();    

    Adc_Init();

 

    POINT_COLOR=RED;//设置字体为红色

    LCD_ShowString(60,110,"ADCTEST"); 

    //显示提示信息

    POINT_COLOR=BLUE;//设置字体为蓝色

    LCD_ShowString(60,130,"ADC_CH0_VAL:

");       

    LCD_ShowString(60,150,"ADC_CH0_VOL:

0.000V");         

    while

(1)

    {

        adcx=Get_Adc(ADC_CH0);

        LCD_ShowNum(156,130,adcx,4,16);//显示ADC的值

        temp=(float)adcx*(3.3/4096);

        adcx=temp;

        LCD_ShowNum(156,150,adcx,1,16);//显示电压值

        temp-=adcx;

        temp*=1000;

        LCD_ShowNum(172,150,temp,3,16);

        LED0=!

LED0;

        delay_ms(250);

    }

}

ADC.C

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

#include

#include"adc.h"

//ADC驱动代码                

//初始化ADC

//这里我们仅以规则通道为例

//我们默认将开启通道0~3                                                                    

void Adc_Init(void)

{   

    //先初始化IO口

    RCC->APB2ENR|=1<<2;   //使能PORTA口时钟

    GPIOA->CRL&=0XFFFF0000;//PA0123anolog输入

    //通道10/11设置         

    RCC->APB2ENR|=1<<9;   //ADC1时钟使能   

    RCC->APB2RSTR|=1<<9;  //ADC1复位

    RCC->APB2RSTR&=~(1<<9);//复位结束     

    RCC->CFGR&=~(3<<14);  //分频因子清零   

    //SYSCLK/DIV2=12MADC时钟设置为12M,ADC最大时钟不能超过14M!

    //否则将导致ADC准确度下降!

    RCC->CFGR|=2<<14;          

 

    ADC1->CR1&=0XF0FFFF;  //工作模式清零

    ADC1->CR1|=0<<16;     //独立工作模式 

    ADC1->CR1&=~(1<<8);   //非扫描模式  

    ADC1->CR2&=~(1<<1);   //单次转换模式

    ADC1->CR2&=~(7<<17);     

    ADC1->CR2|=7<<17;    //软件控制转换 

    ADC1->CR2|=1<<20;     //使用用外部触发(SWSTART)!

!

!

  必须使用一个事件来触发

    ADC1->CR2&=~(1<<11);  //右对齐   

    ADC1->SQR1&=~(0XF<<20);

    ADC1->SQR1&=0<<20;    //1个转换在规则序列中也就是只转换规则序列1              

    //设置通道0~3的采样时间

    ADC1->SMPR2&=0XFFFFF000;//通道0,1,2,3采样时间清空     

    ADC1->SMPR2|=7<<9;     //通道3 239.5周期,提高采样时间可以提高精确度   

    ADC1->SMPR2|=7<<6;     //通道2 239.5周期,提高采样时间可以提高精确度   

    ADC1->SMPR2|=7<<3;     //通道1 239.5周期,提高采样时间可以提高精确度   

    ADC1->SMPR2|=7<<0;     //通道0 239.5周期,提高采样时间可以提高精确度   

 

    ADC1->CR2|=1<<0;      //开启AD转换器   

    ADC1->CR2|=1<<3;       //使能复位校准 

    while(ADC1->CR2&1<<3); //等待校准结束           

    //该位由软件设置并由硬件清除。

在校准寄存器被初始化后该位将被清除。

      

    ADC1->CR2|=1<<2;       //开启AD校准     

    while(ADC1->CR2&1<<2); //等待校准结束

    //该位由软件设置以开始校准,并在校准结束时由硬件清除 

}                

//获得ADC值

//ch:

通道值0~3

u16Get_Adc(u8ch)  

{

    //设置转换序列            

    ADC1->SQR3&=0XFFFFFFE0;//规则序列1通道ch

    ADC1->SQR3|=ch;                     

    ADC1->CR2|=1<<22;      //启动规则转换通道

    while(!

(ADC1->SR&1<<1));//等待转换结束         

    returnADC1->DR;    //返回adc值   

}

ADC.H

1

2

3

4

5

6

7

8

9

10

11

12

#ifndef__ADC_H

#define__ADC_H

 

#defineADC_CH0 0//通道0

#defineADC_CH1 1//通道1

#defineADC_CH2 2//通道2

#defineADC_CH3 3//通道3      

  

voidAdc_Init(void);

u16 Get_Adc(u8ch); 

  

#endif

[转载]STM32的ADC的采样时间及模拟信号的最大带宽

 (2011-08-0816:

48:

56)

转载▼

标签:

 

转载

分类:

 MCU

原文地址:

STM32的ADC的采样时间及模拟信号的最大带宽作者:

邵道君

请看STM32技术参考手册的16.2节,和STM32F103xx数据手册的5.3.17节表44。

可以在ST的中文网站下载到上述2个手册:

[url=

前面所说“STM32的ADC的采样及转换时间最小为1us”,实际上STM32的ADC采样及转换时间可以通过程序编程进行调整,共有8种选择,按ADC模块的驱动时钟算分别为:

1.5ADC时钟周期

7.5ADC时钟周期

13.5ADC时钟周期

28.5ADC时钟周期

41.5ADC时钟周期

55.5ADC时钟周期

71.5ADC时钟周期

239.5ADC时钟周期

采样及转换时间最小的1us是在CPU时钟为56MHz(STM32F101xx为28MHz)时达到。

 

 

可能提出的问题

tS(fADC=14MHz)最小=0.107?

s.实际上就是=1.5T/14.还有几件事:

 

1.采样及转换时间最小的1us是在CPU时钟为56MHz(STM32F101xx为28MHz)时达到。

"这句话出自何处?

 

我倒是看到fADC的最大值是14MHz.

 

2.这句话是自身矛盾的。

为什么为了达到1Mhz的采样率,好芯片要更高的时钟?

 

3.采样时间和采样周期是两个概念。

采样时间是整个ADC性能的重要参数。

(请参考采样示波器的“采样”的概念)

 

4.您在上面提到的采样时间的选择,AD转换周期(TCONV)=采样时间+12.5个周期。

如何选择?

依据是什么?

 

5.我上面提到的“模拟信号的最大带宽”这个概念,我在坛上关注了大半年,发现大家从未讨论过。

而这对用好ADC是很重要的。

 

 

问题1:

采样及转换时间最小的1us是在CPU时钟为56MHz(STM32F101xx为28MHz)时达到。

"这句话出自何处?

我倒是看到fADC的最大值是14MHz

 

答:

这句话出自《STM32技术参考手册》第16.2节

 

ADCconversiontime:

 

–STM32F103xxperformancelinedevices:

1usat56MHz(1.17usat72MHz)

 

–STM32F101xxaccesslinedevices:

1usat28MHz(1.55usat36MHz)

 

关于fADC的最大值是14MHz,请看《STM32F103xx数据手册》第5.3.5节,表18下面的注释:

 

SpecificconditionsforADC:

fHCLK=56MHz,fAPB1=fHCLK/2,fAPB2=fHCLK,fADCCLK=fAPB2/4,ADONbitintheADC_CR2registerissetto1.

 

即fADC在fHCLK=fAPB2=56MHz时达到14MHz。

 

2.这句话是自身矛盾的。

为什么为了达到1Mhz的采样率,好芯片要更高的时钟?

 

103当然可以用和101同样的时钟并达到1Mhz的采样率。

 

但因为103的APB2可达72MHz,而101的APB2只可达36MHz,如果用户想使用APB2的其他外设,用户会不希望为了配合ADC的14M而采用低的时钟。

所以这句话可以这样说:

“在不影响ADC最高采样率的情况下,APB2最高可跑到56M"

 

3.采样时间和采样周期是两个概念。

采样时间是整个ADC性能的重要参数。

(请参考采样示波器的“采样”的概念)

 

103的DATASHEET有的,"ADCcharacteristics"

 

tSSamplingtime,fADC=14MHz,0.107μs ,就是1.5×1/fADC

 

4.您在上面提到的采样时间的选择,AD转换周期(TCONV)=采样时间+12.5个周期。

如何选择?

依据是什么?

 

要看外接的等效输入电阻及电容。

103的DATASHEET上有一个公式

 

R(AIN)

 

还有一个图表

 

Ts(cycles)tS(μs)RAINmax(kΩ)

 

1.50.111.2

 

7.50.5410

 

13.50.9619

 

28.52.0441

 

41.52.9660

 

55.53.9680

 

71.55.1110

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1