历史上的今天
返回首页

历史上的今天

今天是:2024年09月20日(星期五)

正在发生

2018年09月20日 | stm32f407之ADC(操作寄存器)

2018-09-20 来源:eefocus

ADC

12位ADC是一种逐次逼近型模拟数字转换器。它有多达19个通道,可测量16个外部和2个内部信号源和Vbat通道。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。

模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。

有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]位中。如果ADC_SQRx或ADC_JSQR寄存器在转换期间被更改,当前的转换被清除,一个新的启动脉冲将发送到ADC以转换新选择的组。

 

单次转换模式:


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

一旦选择通道的转换完成:

如果一个规则通道被转换:

─ 转换数据被储存在16位ADC_DR寄存器中

─ EOC(转换结束)标志被设置 ─ 如果设置了EOCIE,则产生中断。

如果一个注入通道被转换:

─ 转换数据被储存在16位的ADC_DRJ1寄存器中

─ JEOC(注入转换结束)标志被设置 ─ 如果设置了JEOCIE位,则产生中断。

然后ADC停止

 

连续转换模式:


在连续转换模式中,当前面ADC转换一结束马上就启动另一次转换。此模式可通过外部触发启动或通过设置ADC_CR2寄存器上的ADON位启动,此时CONT位是1。

每个转换后:


如果一个规则通道被转换:

─ 转换数据被储存在16位的ADC_DR寄存器中

─ EOC(转换结束)标志被设置

─ 如果设置了EOCIE,则产生中断。

注入通道不能被用于连续转换模式,唯一的例外是当规则通道配置为连续转换后,注入通道配置为自动转换。

 

扫描模式:

此模式用来扫描一组模拟通道。


扫描模式可通过设置ADC_CR1寄存器的SCAN位来选择。一旦这个位被设置,ADC扫描所有被ADC_SQRX寄存器(对规则通道)或ADC_JSQR(对注入通道)选中的所有通道。在每个组的每个通道上执行单次转换。在每个转换结束时,同一组的下一个通道被自动转换。如果设置了CONT位,转换不会在选择组的最后一个通道上停止,而是再次从选择组的第一个通道继续转换。

如果设置了DMA位,在每次EOC后,DMA控制器把规则组通道的转换数据传输到SRAM中。而注入通道转换的数据总是存储在ADC_JDRx寄存器中。

 

在以下情况中,ADC_SR寄存器的EOC位将被设置:
在每个规则组序列结束后,如果EOCS位被清0
在每个规则通道转换结束,如果EOCS位设置为1
注入通道转换结束数据总是存放在ADC_JDRx寄存器中

 

注入通道管理:

触发注入

清除ADC_CR1寄存器的JAUTO位,并且设置SCAN位,即可使用触发注入功能。

1. 利用外部触发或通过设置ADC_CR2寄存器的ADON位,启动一组规则通道的转换。

2. 如果在规则通道转换期间产生一外部注入触发或者JSWSTART位被设置,当前转换被复位,注入通道序列被以单次扫描方式进行转换。

3. 然后,恢复上次被中断的规则组通道转换。如果在注入转换期间产生一规则事件,注入转换不会被中断,但是规则序列将在注入序列结束后被执行。

注:当使用触发的注入转换时,必须保证触发事件的间隔长于注入序列。例如:序列长度为30个ADC时钟周期(即2个具有3个时钟间隔采样时间的转换),触发之间最小的间隔必须是31个ADC时钟周期。

自动注入

如果设置了JAUTO位,在规则组通道之后,注入组通道被自动转换。这可以用来转换在ADC_SQRx和ADC_JSQR寄存器中设置的多至20个转换序列。

在此模式里,必须禁止注入通道的外部触发。

如果除JAUTO位外还设置了CONT位,规则通道至注入通道的转换序列被连续执行。

 

间断模式:

规则组

此模式通过设置ADC_CR1寄存器上的DISCEN位激活。它可以用来执行一个短序列的n次转换(n<=8),此转换是ADC_SQRx寄存器所选择的转换序列的一部分。数值n由ADC_CR1寄存器的DISCNUM[2:0]位给出。

一个外部触发信号可以启动ADC_SQRx寄存器中描述的下一轮n次转换,直到此序列所有的转换完成为止。总的序列长度由ADC_SQR1寄存器的L[3:0]定义。

例如:

n=3,被转换的通道 = 0、1、2、3、6、7、9、10

第一次触发:转换的序列为 0、1、2

第二次触发:转换的序列为 3、6、7

第三次触发:转换的序列为 9、10,并产生EOC事件

第四次触发:转换的序列 0、1、2

注: 当以间断模式转换一个规则组时,转换序列结束后不自动从头开始。 当所有子组被转换完成,下一次触发启动第一个子组的转换。在上面的例子中,第四次触发重新转换第一子组的通道0、1和2

 

注入组

此模式通过设置ADC_CR1寄存器的JDISCEN位激活。在一个外部触发事件后,该模式按通道顺序逐个转换ADC_JSQR寄存器中选择的序列。

 一个外部触发信号可以启动ADC_JSQR寄存器选择的下一个通道序列的转换,直到序列中所有的转换完成为止。总的序列长度由ADC_JSQR寄存器的JL[1:0]位定义。

例如: n=1,被转换的通道 = 1、2、3

第一次触发:通道1被转换

第二次触发:通道2被转换

第三次触发:通道3被转换,并且产生EOC和JEOC事件

第四次触发:通道1被转换

 

 

设置步骤:

1. 配置相关输入通道的IO口。

2. 设置DMA

3. 如果双重ADC或三重采样,设置ADC的公共寄存器

4. 配置要使用到的ADC

程序:

/************************************  

    标题:一个ADC连续采样  

    软件平台:IAR for ARM6.21  

    硬件平台:stm32f4-discovery  

    主频:168M  

      

    author:小船  

    data:2012-02-14  

*************************************/  

  

#include   

#include "MyDebugger.h"  

  

__IO uint16_t ADC3ConvertedVault[10000];  

char TXbuffer[] = "PC1输入电压为:x.xxxV\n\r";  

  

void ADC3_IN11_Config(void);  

  

void main ()  

{     

  SCB->AIRCR = 0x05FA0000 | 0x400;  //中断优先级分组 抢占:响应=3:1  

   

  ADC3_IN11_Config();  

     

  MyDebugger_Init();  

  

  while(1)  

  {  

  };  

}  

  

void ADC3_IN11_Config(void)  

{  

    /***GPIO设置***/  

  RCC->AHB1ENR |= (1<<2); //打开GPIOC时钟  

  GPIOC->MODER &= 0xfffffff3;//PC1模拟模式  

  GPIOC->MODER |= 0x0000000C;  

  GPIOC->PUPDR &= 0xfffffff3;//无上拉无下拉     

   

  /***DMA设置***/  

  RCC->AHB1ENR |= (1<<22); //使能DMA2时钟  

  ADC3->CR2 &= ~(1<<8);//ADC3 dma发送模式除能  

  DMA2_Stream0->CR &= 0xFFFFFFFE; //除能DMA2_Stream0  

  while(DMA2_Stream0->CR & 0x00000001);//确保DMA可以被设置   

  DMA2->LIFCR |= 0x0000003D;//传送前清空DMA1_Stream5所有中断标志   

  DMA2_Stream0->PAR = (uint32_t)&ADC3->DR;//设置外设地址  

  DMA2_Stream0->M0AR = (uint32_t)ADC3ConvertedVault; //设置内存地址  

  DMA2_Stream0->CR |= 0x0002800;//16位数据  

  DMA2_Stream0->NDTR = 10000; //设置dma传输数据的数量  

  /*  

    设置dma2通道2,即ADC3  

    优先级Medium  

    传输方向外设到内存  

    内存递增模式  

    循环模式  

    传输完成中断  

  */  

  DMA2_Stream0->CR |= ( 0x04000000 | 0x00010000 | 0x0  

                        | (1<<10) | (1<<8) | (1<<4) );   

    

  NVIC->IP[56] = 0xB0;  

  NVIC->ISER[1] |= (1<<(56-32));  

    

  DMA2_Stream0->CR |= 1; //DMA2数据流0使能  

    

  /***ADC3设置***/  

  RCC->APB2ENR |= (1<<10); //使能ADC3时钟  

  ADC3->SQR1 = 0x00000000;//转换一个通道  

  ADC3->SQR3 = 0x0000000B;//第一个通道为ADC3_in11  

  ADC3->CR1 &= 0x00000000;   

  ADC3->CR2 &= 0x00000000;    

  ADC3->CR2 |= (1<<1);  //连续转换  

  ADC3->CR2 |= (1<<9); //最后一次ADC转换后发出dma请求  

  ADC3->CR2 |= (1<<0);   //开启AD转换  

    

  ADC3->CR2 |= (1<<8);//ADC dma发送模式使能  

    

  ADC3->CR2 |= (1<<30); //规则通道转换开始   

}  

  

void DMA2_Stream0_IRQHandler (void)  

{  

  uint32_t i;  

  uint32_t Average;  

  if(DMA2->LISR & 0x00000010)  

  {  

      DMA2->LIFCR |= 0x00000010;  

      for(i = 0; i < 10000; i++)  // 对一万个数据取平均值  

        Average += ADC3ConvertedVault[i];  

      Average *= 3;  

      Average /= 40960;  

      TXbuffer[14] = ( Average / 1000 ) % 10 + 0x30;//转换成ASCII码  

      TXbuffer[16] = ( Average / 100 ) % 10 + 0x30;  

      TXbuffer[17] = ( Average / 10 ) % 10 + 0x30;  

      TXbuffer[18] = Average % 10 + 0x30;  

      MyDebugger_Message(TXbuffer, sizeof(TXbuffer)/sizeof(char));    

  }  

}  

运行结果:


推荐阅读

史海拾趣

Elpakco Inc公司的发展小趣事

随着电子行业的不断发展,Elpakco Inc公司意识到,只有不断创新才能在激烈的市场竞争中立于不败之地。公司加大研发投入,积极引进先进技术和设备,不断推出具有创新性和竞争力的新产品。其中,公司研发的一款智能封装技术,不仅提高了生产效率,还降低了生产成本,引领了行业的技术潮流。

Anaren公司的发展小趣事

Elpakco Inc公司深知,企业的成功离不开社会的支持和帮助。因此,公司始终将履行社会责任作为企业的重要使命。公司积极参与环保、公益等活动,努力减少生产过程中的环境污染和资源浪费。同时,公司还注重员工的成长和发展,为员工提供良好的工作环境和福利待遇,让员工在为企业创造价值的同时,也能实现个人的成长和发展。

GSME Electronics公司的发展小趣事

随着公司业务的不断拓展和市场竞争的日益激烈,GSME Electronics开始实施国际化战略。公司积极参与国际市场竞争,加强与国外客户的合作与交流,不断提升产品的国际竞争力。同时,公司还注重品牌建设,通过提升产品质量和服务水平,树立了良好的品牌形象。如今,“桂微牌”产品已经在国内外市场上赢得了广泛的认可度和美誉度,为公司未来的发展奠定了坚实的基础。

BOWEI公司的发展小趣事

GSME Electronics的起点可以追溯到2001年,当时公司在广西桂林市成立,作为桂林国家高新区的高新技术企业。初期,公司面临着技术设备落后的挑战,但管理层高瞻远瞩,决定从日本、韩国、欧美等国家引进具有国际先进水平的自动化生产设备。这一决策为公司后续的发展奠定了坚实的基础,使得公司能够快速进入半导体器件的生产领域,并不断提升产品质量和生产效率。

Diodes公司的发展小趣事

在竞争激烈的电子行业中,合作共赢是企业发展的重要途径。Diodes公司始终坚持合作共赢的理念,与众多上下游企业建立了紧密的合作关系。例如,在供应链方面,Diodes与多家原材料供应商建立了长期稳定的合作关系,确保原材料的稳定供应和质量保障;在销售方面,Diodes与多家分销商建立了战略合作伙伴关系,共同开拓市场、推广产品。这些合作关系不仅为Diodes带来了更多的商业机会和市场份额,也促进了整个产业链的健康发展。

Fedco_Batteries公司的发展小趣事

在快速发展的同时,Fedco_Batteries始终关注社会责任。公司积极参与公益事业,捐款捐物支持灾区重建、教育扶贫等项目。同时,公司还注重环保和可持续发展,致力于研发环保型电池产品,减少对环境的影响。这种关注社会责任的企业精神,让Fedco_Batteries在社会上树立了良好的形象。

问答坊 | AI 解惑

研究下驱动步进电机软硬件类型和方法-大赛必备知识

本帖最后由 paulhyde 于 2014-9-15 09:42 编辑 步进电机在控制类系统中使用非常广泛,我设计过步进电机在工业系统中的应用有三次,一次是关于线切割铣床上工件移动的设计,一次是关于超声波小径管无损探伤驱动小径管旋转和探头水平移动的设计,还 ...…

查看全部问答>

如何用译码器实现对多电机的控制?

大家好,本人新手,希望得到大家的帮助! 我想使用C51单片机连接一个74HC154译码器,进而实现对多个步进电机的控制,我想问的是这能否实现?如果不能实现,我该怎样才能做到用单片机控制多个电机呢? 非常感谢! 简单地说,怎样实现用单片机控制 ...…

查看全部问答>

msp430串口收发程序

现在想用msp430的串口进行收发程序开发,但不知道对方一次发送过来多少数据?如何才能完整接收呢?我感觉使用中断的方式一次只能接收一个字节的数据,不能把对方发送的完整数据全部接收!请问有什么解决办法?谢谢! 另外,使用串口通信,一方是ms ...…

查看全部问答>

wince下读写IC卡速度问题

在pc下测试,串口读写只要3s 在wince下测试,居然10s啊,怎么解决?? 怎么办 ?? 救命 …

查看全部问答>

有一套串口通信协议需要分析破解,寻求达人帮助

有一套串口通信协议需要分析破解,寻求达人帮助! 谢谢! to:hawking20001981(东东VC++Primer) 请速和我联系! QQ:652650436…

查看全部问答>

在VMware上运行VxWorks遭遇"Error loading file! 0xd0003",已经困扰几天了

【环境】PC、XP、Tornado2.2、VMWare、虚拟软驱RamDiskNT、虚拟网卡为AMD的PC-NET,按要求从AMD的网站上下载的最新驱程 【实施】严格按照网上的《嵌入式实时操作系统VxWorks入门》一文搭建;     VMware Network Adapter VMnet1和VMwar ...…

查看全部问答>

LED显示屏一般性故障诊断常见问题解答

replyreload += \',\' + 704935;Timson,如果您要查看本帖隐藏内容请回复…

查看全部问答>

RealViewMDK一项功能,节约STM32芯片32%的CODE使用量

   安装了MDK3.23版本之后,在keilarmoardsembeststm32v100开发板例程中,使用Blinky的例程,该例程含有LCD显示,ADC,USART,GPIO,NVIC等功能,在C/C++选项中使用三级优化-o3选项后编译结果:Code=7764,RO-data=468,RW-data ...…

查看全部问答>

新手求解答 AD软件中 DB9的原理图后面怎么会有两条线

AD软件中 DB9的原理图后面怎么会有两条线 如图所示正常DB9不是没有吗 怎么去掉??新手求解答…

查看全部问答>

基于STM32和STM8的医疗电子方案

基于STM32和STM8的医疗电子方案,PPT格式,简单介绍了基于stm32的电图机(ECG)  、指甲式脉搏血氧仪、多参数监护仪、B超 、胎心仪、注射泵、输液泵、生化分析仪、麻醉呼吸机,基于stm8的血糖仪以及其它医疗产品的设计…

查看全部问答>