stm32 的adc使用(借鉴)

1100阅读 0评论2014-02-24 枫海8深蓝
分类:C/C++

STM32F407_ADC查询模式配置介绍
1.ADC对应管脚介绍
|---管脚------对应ADC----||---管脚------对应ADC----|
| PA0 <---> ADC123_IN0 ||   PA1 <---> ADC123_IN1 |
| PA2 <---> ADC123_IN2 ||   PA3 <---> ADC123_IN3 |
| PA4 <---> ADC12_IN4  ||   PA5 <---> ADC12_IN5  |
| PA6 <---> ADC12_IN6  ||   PA7 <---> ADC12_IN7  |
| PB0 <---> ADC12_IN8  ||   PB1 <---> ADC12_IN9  |
| PC4 <---> ADC12_IN14 ||   PC5 <---> ADC12_IN15 |
| PC0 <---> ADC123_IN10||   PC1 <---> ADC123_IN11|
| PC2 <---> ADC123_IN12||   PC3 <---> ADC123_IN13|
| PF3 <---> ADC3_IN9   ||   PF4 <---> ADC3_IN14  |
| PF5 <---> ADC3_IN15  ||   PF6 <---> ADC3_IN4   |
| PF7 <---> ADC3_IN5   ||   PF8 <---> ADC3_IN6   |
| PF9 <---> ADC3_IN7   ||   PF10<---> ADC3_IN8   |


2.配置查询模式如下
void ADC_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef  ADC_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

//初始化GPIOA的Pin_0为模拟量输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
GPIO_Init(GPIOA, &GPIO_InitStructure);

ADC_DeInit();
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;   //精度为12位           
ADC_InitStructure.ADC_ScanConvMode = DISABLE;   //扫描转换模式失能,单通道不用
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;   //连续转换使能
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; //不用外部触发,软件触发转换
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //数据右对齐,低字节对齐
ADC_InitStructure.ADC_NbrOfConversion = 1;     //规定了顺序进行规则转换的ADC通道的数目
ADC_Init(ADC1, &ADC_InitStructure);


ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_3Cycles);//ADC,通道,1转换,所选通道的采样周期

ADC_Cmd(ADC1, ENABLE);   //使能
ADC_SoftwareStartConv(ADC1);    //软件启动转换
}


unsigned short GetADCValue(void)
{
return ADC_GetConversionValue(ADC1);
}


3.其他具体配置介绍如下
通道选择:
可以把转换组织成两组:规则组和注入组。在任意多个通道上以任意顺序进行的一系列
转换构成成组转换。例如,可以如下顺序完成转换:通道 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 被转换


作者:Flame
日期:2012-12-10

上一篇:stm32 dma adc
下一篇:stm32f407 usart1的使用