stm32f407之三ADC交替采样(操作寄存器)

发布者:轻松自在最新更新时间:2016-10-12 来源: eefocus关键字:stm32f407  ADC  交替采样  操作寄存器 手机看文章 扫描二维码
随时随地手机看文章
stm32f407之三ADC交替采样(操作寄存器)

三ADC交替采样

在多ADC模式中,ADC1为主,ADC2或ADC3为从,交替或者同时触发,工作模式取决于ADC_CCR寄存器的MULTI[4:0]。

多ADC模式中,转换后的数据可以多模式的数据寄存器(ADC_CDR)中读取。状态可以在多模式的状态寄存器(ADC_CSR)读取。

多ADC模式下的DMA传输方式:

方式1:每个AD转换完都发出DMA请求,多模式的数据寄存器(ADC_CDR)用低位保存转换结果。

1st request: ADC_CDR[31:0] = ADC1_DR[15:0]

2nd request: ADC_CDR[31:0] = ADC2_DR[15:0]

3rd request: ADC_CDR[31:0] = ADC3_DR[15:0]

4th request: ADC_CDR[31:0] = ADC1_DR[15:0]

方式2:每两个AD转换完都发出DMA请求。

双ADC模式:

高十六位保存ADC2结果,低十六位保存ADC1结果

1st request: ADC_CDR[31:0] = ADC2_DR[15:0] |ADC1_DR[15:0]

2nd request: ADC_CDR[31:0] = ADC2_DR[15:0] |ADC1_DR[15:0]

三ADC模式:

1st request: ADC_CDR[31:0] = ADC2_DR[15:0] |ADC1_DR[15:0]

2nd request: ADC_CDR[31:0] = ADC1_DR[15:0] |ADC3_DR[15:0]

3rd request: ADC_CDR[31:0] = ADC3_DR[15:0] |ADC2_DR[15:0]

4th request: ADC_CDR[31:0] = ADC2_DR[15:0] |ADC1_DR[15:0]

方式2:每两个AD转换完都发出DMA请求。与方式2相似,但是DMA以半字方式传输。

用于6位或者8位分辨率中。

双ADC模式:

高8位保存ADC2结果,低8位保存ADC1结果

1st request: ADC_CDR[15:0] = ADC2_DR[7:0] | ADC1_DR[7:0]

2nd request: ADC_CDR[15:0] = ADC2_DR[7:0] | ADC1_DR[7:0]

三ADC模式:

1st request: ADC_CDR[15:0] = ADC2_DR[7:0] | ADC1_DR[7:0]

2nd request: ADC_CDR[15:0] = ADC1_DR[7:0] | ADC3_DR[7:0]

3rd request: ADC_CDR[15:0] = ADC3_DR[7:0] | ADC2_DR[7:0]

4th request: ADC_CDR[15:0] = ADC2_DR[7:0] | ADC1_DR[7:0]

多ADC转换模式:

1. 注入同步模式

2. 规则同步模式

3. 交替模式

4. 交替触发模式

5. 规则同步+注入同步模式

6. 规则同步+交替触发模式

交替模式配置步骤:

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

2. 设置DMA

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

a. 设置公共寄存器首先要打开任意一个ADC的时钟,否则这部分数字电路是没有开始工作的。

b. 设置DMA模式

c. 设置ADC转换完成后,发送DMA请求

d. 设置多ADC模式

e. 设置两次采样间隔周期

4. 配置要使用到的ADC(必须ADC1为主,其他为从)。

程序:/************************************

标题:ADC

软件平台:IAR for ARM6.21

硬件平台:stm32f4-discovery

主频:168M

author:小船

data:2012-02-16

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

#include

#include "MyDebugger.h"

__IO uint16_t ADCConvertedVault[10000];

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

void ADC_IO_Config(void);

void ADC_DMA_Config(void);

void ADC_Common_Config(void);

void ADC3_IN11_Config(void);

void ADC2_IN11_Config(void);

void ADC1_IN11_Config(void);

void main ()

{

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

ADC_IO_Config();

ADC_DMA_Config();

ADC_Common_Config();

ADC3_IN11_Config();

ADC2_IN11_Config();

ADC1_IN11_Config();

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

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

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

ADC1->CR2 |= (1<<30); //触发转换开始

MyDebugger_Init();

while(1)

{

};

}

void ADC_Common_Config(void)

{

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

ADC->CCR &= 0x00000000;

/*

DMA模式1

最后一次ADC转换后发出dma请求

交错模式

2次采样之间的延迟5个周期

*/

ADC->CCR |= ( 0x00004000 | (1<<13) | 0x00000017 | 0x00000000);

}

/***ADC1设置***/

void ADC1_IN11_Config(void)

{

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

ADC1->SQR3 = 0x0000000B;//第一个通道为ADC1_in11

ADC1->CR1 &= 0x00000000;

ADC1->CR2 &= 0x00000000;

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

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

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

}

/***ADC2设置***/

void ADC2_IN11_Config(void)

{

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

ADC2->SQR3 = 0x0000000B;//第一个通道为ADC1_in11

ADC2->CR1 &= 0x00000000;

ADC2->CR2 &= 0x00000000;

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

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

}

/***ADC3设置***/

void ADC3_IN11_Config(void)

{

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

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

ADC3->CR1 &= 0x00000000;

ADC3->CR2 &= 0x00000000;

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

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

}

/***GPIO设置***/

void ADC_IO_Config(void)

{

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

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

GPIOC->MODER |= 0x0000000C;

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

}

/***DMA设置***/

void ADC_DMA_Config(void)

{

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;//传送前清空DMA2_Stream0所有中断标志

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

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

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

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

/*

设置dma2通道0,即ADC1

优先级Medium

传输方向外设到内存

内存递增模式

循环模式

传输完成中断

*/

DMA2_Stream0->CR |= ( 0x00000000 | 0x00010000 | 0x0 | (1<<10) | (1<<8) | (1<<4) );

NVIC->IP[56] = 0xB0;

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

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

}

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 += ADCConvertedVault[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));

}

}

关键字:stm32f407  ADC  交替采样  操作寄存器 引用地址:stm32f407之三ADC交替采样(操作寄存器)

上一篇:CortexM3存储器管理错误分析
下一篇:STM32有关SPI实现DMA程序应用小记

推荐阅读最新更新时间:2024-03-16 15:15

MSP430 中ADC12用法
1.1. 介绍 Figure 4 AD模块图 在处AD时,我们关注的对象有如下几个,参考源、通道、存储地址、时钟、触发方式、精度,速度(200k)。 在上图中我们都可以找到,msp430f149的参考正电源有VRFE+ VeREF+ ,Vcc,同时有对应的负电源。采样通道有16个,存储地址则有对应16个通道,时钟则是有内部时钟及3种时钟源的分频,触发方式有4种。 因此,对于这些特点我们可以实现4种模式,单通道单次采样,单通道多次采样,多通道单次采样,多通道多次采样。 1.2. 相关寄存器 ADC12CTL0:前面8位是对采样保持时间的设置。后8位分别对应8种设置 ADC12CTL1:前4位进行通道选择,
[单片机]
MSP430 中<font color='red'>ADC</font>12用法
stm32 DMA数据搬运 操作寄存器+库函数
DMA(Direct Memory Access)常译为 存储器直接存取 。早在Intel的8086平台上就有了DMA应用了。 一个完整的微控制器通常由CPU、存储器和外设等组件构成。这些组件一般在结构和功能上都是独立的,而各个组件的协调和交互就由CPU完成。如此一来,CPU作为整个芯片的核心,其处理的工作量是很大的。如果CPU先从A外设拿到一个数据送给B外设使用,同时C外设又需要D外设提供一个数据。。。这样的数据搬运工作将使CPU的负荷显得相当繁重。 严格的说,搬运数据只是CPU的比较不重要的一种工作。CPU最重要的工作室进行数据运算,从加减乘除到一些高级的运算,包括浮点、积分、微分、FFT等。CP
[单片机]
stm32 DMA数据搬运 <font color='red'>操作</font><font color='red'>寄存器</font>+库函数
STM8 ADC时序图
STM8 ADC时序图 如图149所示,在ADC上电后,在开始精确转换之前ADC需要一个稳定时间tSTAB(等于一次转换的时间tCONV),对于之后接下来的转换就不需要稳定延时,而且ADON位只需要被置位一次。一次ADC转换需要14个时钟周期,在转换完成后EOC标志被置位,同时转换结果保存在10位ADC数据寄存器里面。 (图149:STM8单次模式的时序图(CONT=0)) (图150:STM8单次模式的时序图(CONT=1))
[单片机]
STM8 <font color='red'>ADC</font>时序图
增强ADC性能的频率抖动法
  自从 70 年代末以来,设计师成功地提高了A/D 转换器的有效分辨力和寄生性能,方法是在变换器的输入端加入抖动(非相关噪声),然后用 DSP 技术将噪声从变换后的数据中中和。最常见的抖动方法是在 A/D变换器输入信号上增加随机振幅噪声。尽管这种方法具有实用性,但增加的噪声中包含有大的随机峰值信号。为使 A/D 变换器输入端口不致进入饱和,设计师必须知道峰值信号以及峰值抖动电平。即使短时间的饱和也会使 A/D 变换器增加更多非线性成分,从而超过抖动可以消除的范围。   另一种方法是增加一个频率抖动而振幅恒定的信号。图1显示一种可能的实现方案,它采用一只Linear公司LTC1799可编程振荡器IC2,工作在VCO(压控振荡器)模
[电源管理]
增强<font color='red'>ADC</font>性能的频率抖动法
STM32F407玩控制—自适应模糊PID控制
自适应模糊PID控制的原理如图1所示,从图中可以看出对偏差和偏差变化率进行模糊推理,获得Δkp、Δki、Δkd,模糊控制器的PID参数实际值为:kp=kp0+qp*Δkp、ki=ki0+qi*Δki、kd=kd0+qd*Δkd,其中qp、qi、qd为比例因子,这是比较常见的一种计算方式,但在薛定宇的《控制数学问题的MATLAB求解》一书中讲了另外一种计算方式:kp(k)=kp(k-1)+γ(k)*Δkp、ki(k)=ki(k-1))+γ(k)*Δki、kd(k)=kd(k-1)+γ(k)*Δkd,显然这种计算方式更复杂,我们这里采用前者,为了进行模糊推理,需要确定模糊规则表和各个模糊变量的隶属度函数,常见的模糊规则表如图2所示,我
[单片机]
用<font color='red'>STM32F407</font>玩控制—自适应模糊PID控制
高速模数转换器动态参数的定义和测试
  高速模数转换器(ADC)的参数定义和描述如表1所示。   表1 动态参数定义       测试方案中的线路板布局和硬件需求   为合理测试高速ADC的动态参数,最好选用制造商预先装配好的电路板,或是参考数据手册中推荐的线路板布局布板,高速数据转换器的布板需要高速电路的设计技巧,通常应遵守以下基本规则:   所有的旁路电容尽可能靠近器件安装,最好和ADC在同一层面,采用表面贴装元件使引线最短,减小寄生电感和电容。   模拟电源、数字电源、基准电源和输入公共端采用两个0.1MF的陶瓷电容和一个2.2M(F双极性电容并联对地旁路。   采用具有独立的地平面和电源平面的多层电路板,保证信号的完整性。   采用独
[测试测量]
高速<font color='red'>模数转换器</font>动态参数的定义和测试
选择最佳测试音和测试设备的成功高速ADC正弦波
Abstract: An earlier application note, "Coherent Sampling vs. Window Sampling," covered the basics of coherent sampling. It showed differences between tests performed with coherent sampling and windowed sampling conditions. The following technical discussion is a follow-up note, which deals with the proper selection o
[模拟电子]
选择最佳测试音和测试设备的成功高速<font color='red'>ADC</font>正弦波
ADI公司发布用于低压14位转换器的低功耗、单电源ADC驱动器
ADI公司的超低噪声ADC驱动器能够驱动20 MHz至100 MHZ频率范围的高保真信号,无需第二电源。 Analog Devices, Inc. (ADI),全球领先的高性能信号处理解决方案供应商及信号调理技术领先者,最近推出用于14位ADC(模数转换器)的低功耗、低噪声驱动器ADA4930-1和ADA4930-2。这两款超低噪声ADC驱动器采用单电源供电,能够驱动直流至1.35 GHz信号,功耗仅115 mW(毫瓦)。 新款ADC驱动器提供业界最低的噪声规格之一(1.2 nV/rt-Hz),并且在20 MHz至100 MHz的频率范围内具有低失真特性。新驱动器适合驱动电子测试和测量设备、数据采集系统、无线直接变
[模拟电子]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved