玩转STM32-数模转换器ADC(详细-慢工出细活)

一、ADC的特性与结构(了解)

按照转换过程的不同,ADC可以分为逐次逼近型、双积分型和电压-频率变换型3种。
双击分型ADC,一般精度高;对周期变化的干扰信号积分为零,因此抗干扰性好;价格便宜,但转换速度慢。逐次逼近型ADC,在转换速度上同双积分型ADC相比要快得多,精度较高(12位及12位以上),价格较高。电压-频率变换型ADC,突出的优点是高精度,其分辨率可达16位以上;价格便宜,但转换速度不高。
STM32所带的12位ADC是一种逐次逼近型模拟数字转换器,它有多达18个通道,可测量16个外部和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器种,STM32的ADC主要特性如下:
● 12位分辨率
● 转换结束、注入转换结束和发生模拟看门狗事件时产生中断
● 单次和连续转换模式
● 从通道0到通道n的自动扫描模式
● 自校准
● 带内嵌数据一致性的数据对齐
● 采样间隔可以按通道分别编程
● 规则转换和注入转换均有外部触发选项
● 间断模式
● 双重模式(带2个或以上ADC的器件)
● ADC转换时间: (与型号有关)
─ STM32F103xx增强型产品:时钟为56MHz时为1μs(时钟为72MHz为1.17μs)
─ STM32F101xx基本型产品:时钟为28MHz时为1μs(时钟为36MHz为1.55μs)
─ STM32F102xxUSB型产品:时钟为48MHz时为1.2μs
─ STM32F105xx和STM32F107xx产品:时钟为56MHz时为1μs(时钟为72MHz为1.17μs)
● ADC供电要求:2.4V到3.6V
● ADC输入范围:VREF- ≤ VIN ≤ VREF+
● 规则通道转换期间有DMA请求产生。
STM32的ADC结构如下:
来自STM32F103数据手册
STM32的ADC主要组成部分包括模拟电源(VDDA、VSSA)、16个外部信号源(ADCx_IN0~ADCx_IN15),在大容量产品种x=1,2,3其他产品中x = 1,2和两个外部触发(EXTI_15、EXTI_11),此外有的型号的芯片还具有模拟参考电源(VREF+,VREF-),这些都具有相应的引脚与电源或外部设备连接。

二、ADC的工作模式(掌握)

2.1 开关、时钟及通道

1. ADC开关控制
通过设置ADC_CR2寄存器的ADON位可给ADC上电。当第一次设置ADON位时,它将ADC从断电状态下唤醒。 ADC上电延迟一段时间后(tSTAB),再次设置ADON位时开始进行转换。 通过清除ADON位可以停止转换,并将ADC置于断电模式。在这个模式中,ADC几乎不耗电(仅几个μA)。
2. ADC时钟
由时钟控制器提供的ADCCLK时钟和PCLK2(APB2时钟)同步。RCC控制器为ADC时钟提供一个专用的可编程预分频器。
3. 通道选择
有16个多路通道。可以把转换组织成两组:规则组和注入组。在任意多个通道上以任意顺序进
行的一系列转换构成成组转换。例如,可以如下顺序完成转换:通道3、通道8、通道2、通道2、通道0、通道2、通道2、通道15。
(1) 规则组由多达16个转换组成。规则通道和它们的转换顺序在ADC_SQRx寄存器中选择。规
则组中转换的总数应写入ADC_SQR1寄存器的L[3:0]位中。
(2) 注入组由多达4个转换组成。注入通道和它们的转换顺序在ADC_JSQR寄存器中选择。注入组里的转换总数目应写入ADC_JSQR寄存器的L[1:0]位中。
如果ADC_SQRx或ADC_JSQR寄存器在转换期间被更改,当前的转换被清除,一个新的启动脉冲将发送到ADC以转换新选择的组。 温度传感器/ VREFINT内部通道
温度传感器和通道ADC1_IN16相连接,内部参照电压VREFINT和ADC1_IN17相连接。可以按注入或规则通道对这两个内部通道进行转换。

2.2 模式控制

1. 单次转换模式和连续转换模式
单次转换模式下,ADC只执行一次转换。该模式下即可通过设置ADC_CR2寄存器的ADON位启动,也可通过外部触发启动,这时CONT位为0。
连续转换模式下,前面ADC转换结束后立即开启另一次转换。此模式可通过外部触发启动或通过设置ADC_CR2寄存器上的ADON位启动,此时CONT位是1。
每次转换完成后,如果是规则通道被转换,转换数据被存储在16位的ADC_DR寄存器中,EOC(转换结束)标志被设置,如果设置了EOCIE,则产生中断。如果是注入通道被转换,转换数据被存储在16位的ADC_DRJ1寄存器中,JEOC(注入转换结束)标志被设置,如果设置了JEOCIE位,则产生中断。
2. 扫描模式
次模式用来扫描一组模拟 通道。扫描模式可通过设置ADC_CR1寄存器的SCAN位来选择,一旦这个位置被置1,ADC扫描被ADC_SQRx寄存器(对规则通道)或ADC_JSQR(对注入通道)选中的所用通道。在每个组的每个通道上执行单次转换,在每个转换结束后,同一组的下一个通道被自动转换。如果设置了CONT位,转换不会再选择组的最后一个通道上停止,而是再次从选择组的第一个通道继续转换。如果设置了DMA位,再每次EOC后,DMA控制器把规则组通道的转换数据传输到SRAM中。而注入通道转换的数据总是存储再ADC_JDRx寄存器中。
3. 间断模式
(1)规则组间断模式。此模式通过设置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
(2)注入组间断模式。此模式通过设置ADC_CR1寄存器的JDISCEN位激活。在一个外部触发事件后,该模式按通道顺序逐个转换ADC_JSQR寄存器中选择的序列。 一个外部触发信号可以启动ADC_JSQR寄存器选择的下一个通道序列的转换,直到序列中所有的转换完成为止。总的序列长度由ADC_JSQR寄存器的JL[1:0]位定义。
例子:
n=1,被转换的通道 = 1、2、3
第一次触发:通道1被转换
第二次触发:通道2被转换
第三次触发:通道3被转换,并且产生EOC和JEOC事件
第四次触发:通道1被转换
4. 双ADC模式
有2个或2个以上ADC模块的产品中,可以使用双ADC模式。在双ADC模式中,根据ADC1_CR1寄存器中DUALMOD[2:0]位所选的模式,转换的启动可以是ADC1主和ADC2从的交替触发或同步触发。当所有ADC1/ADC2注入通道都被转换时,产生JEOC中断。

2.3 中断和DMA

1. 中断
规则组和注入组转换结束时能产生中断,当模拟看门狗状态为被设置1时也能产生中断。它们都能有独立的中断使能位。
2. DMA请求
因此规则通道转换的值存储在一个仅有的数据寄存器中,所以当转换多个规则通道时需要使用DMA,这可以避免丢失已经存储在ADC_DR寄存器中的数据。只有规则通道的转换结束才产生DMA请求,并将转换的数据从ADC_DR寄存器传输到用户指定的目的地址。

2.4 其他功能

1. 模拟看门狗
如果被ADC转换的模拟电压低于低阀值或高于高阀值,AWD模拟看门狗状态位被设置。阀值位
于ADC_HTR和ADC_LTR寄存器的最低12个有效位中。通过设置ADC_CR1寄存器的AWDIE位
以允许产生相应中断。 阀值独立于由ADC_CR2寄存器上的ALIGN位选择的数据对齐模式。比较是在对齐之前完成的通过配置ADC_CR1寄存器,模拟看门狗可以作用于1个或多个通道。
2. 校准
ADC有一个内置自校准模式。校准可大幅减小因内部电容器组的变化而造成的准精度误差。在校准期间,在每个电容器上都会计算出一个误差修正码(数字值),这个码用于消除在随后的转换中每个电容器上产生的误差。 通过设置ADC_CR2寄存器的CAL位启动校准。一旦校准结束,CAL位被硬件复位,可以开始正常转换。建议在上电时执行一次ADC校准。校准阶段结束后,校准码储存在ADC_DR中。
在这里插入图片描述
3. 数据对齐
ADC_CR2寄存器中的ALIGN位选择转换后数据储存的对齐方式。数据可以左对齐或右对齐。注入组通道转换的数据值已经减去了在ADC_JOFRx寄存器中定义的偏移量,因此结果可以是一个负值。SEXT位是扩展的符值。 对于规则组通道,不需减去偏移值,因此只有12个位有效。
(1)数据右对齐
在这里插入图片描述
(2)数据左对齐
在这里插入图片描述
4. 可编程的通道采样时间
ADC使用若干个ADC_CLK周期对输入电压采样,采样周期数目可以通过ADC_SMPR1和ADC_SMPR2寄存器中的SMP[2:0]位更改。每个通道可以分别用不同的时间采样。 总转换时间如下计算:
TCONV = 采样时间+ 12.5个周期
5. 外部触发转换
转换可以由外部事件触发(例如定时器捕获,EXTI线)。如果设置了EXTTRIG控制位,则外部事
件就能够触发转换。EXTSEL[2:0]和JEXTSEL2:0]控制位允许应用程序选择8个可能的事件中的
某一个,可以触发规则和注入组的采样。

三、ADC常用的库函数(掌握)

以下是ADC常用库函数的表格,具体实现的功能有简单的描述,用法可以通过查看相关库函数中的函数的具体介绍。自己去动手查看和应用更能加深记忆。这里面就简单的列举了一个常用库函数,想要了解更多可以查找相关库函数进行学习。

函数名称功能
ADC_DeInit将外设ADCx的全部寄存器重新设置为缺省值
ADC_Init根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器
ADC_StrucInit把ADC_InitStruct中的每一个参数按缺省值填入
ADC_Cmd使能或失能指定的ADC
ADC_DMACmd使能或失能指定的ADC的DMA请求
ADC_ITConfig使能或失能指定ADC的中断
ADC_RestCalibrationStatus重置ADC指定的校准寄存器
ADC_StartCalibration开始指定ADC的校准程序
ADC_SoftwareStartConvCmd使能或失能指定的ADC的软件转换启动功能
ADC_GetSoftwareStartConvStatus获取ADC软件装欢启动状态
ADC_RegularChannelConfig设置指定ADC的规则组通道,设置它们的转换顺序和采样时间
ADC_ExternalTrigConvConfig失能或使能ADCx的经外部触发启动转换功能
ADC_GetConversionValue返回最近一次ADCx规则组的转换结果
ADC_GetDuelModeConversionValue返回最近一次双ADCx模式下的转换结果

四、应用实例

1. 实例介绍
利用ADC单通道模式,对电压值进行采集,并将其电压值进行转化,,最后通过OLED进行显示。
2. 部分实例代码

static void ADC_Driver_GPIO_Configuration(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	ADC_InitTypeDef ADC1_InitStructure;
	
	RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB , ENABLE);
	RCC_APB2PeriphClockCmd( RCC_APB2Periph_ADC1, ENABLE); 
	// ADC1 ==> PB0
	GPIO_InitStructure.GPIO_Pin = GPIO_MSP_AD_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIO_MSP_AD_PORT, &GPIO_InitStructure);
	// ADC_IN8 
	ADC_DeInit(ADC1);
	ADC1_InitStructure.ADC_Mode = ADC_Mode_Independent;  
	ADC1_InitStructure.ADC_ScanConvMode = DISABLE;
	ADC1_InitStructure.ADC_ContinuousConvMode = ENABLE;
	ADC1_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
	ADC1_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
	ADC1_InitStructure.ADC_NbrOfChannel = 1;
	ADC_Init(MSP_ADC, &ADC1_InitStructure);
	// 8/ 2 = 4Mhz
	RCC_ADCCLKConfig(RCC_PCLK2_Div2);
//	ADC_RegularChannelConfig(MSP_ADC,MSP_ADC_CHANNEL,1,ADC_SampleTime_55Cycles5);
//	ADC_ITConfig(MSP_ADC,ADC_IT_EOC,ENABLE);
	
	ADC_Cmd(MSP_ADC, ENABLE);
	
	ADC_ResetCalibration(MSP_ADC);
	while(ADC_GetResetCalibrationStatus(MSP_ADC));
	ADC_StartCalibration(MSP_ADC);
	while(ADC_GetCalibrationStatus(MSP_ADC));
	
//	ADC_SoftwareStartConvCmd(MSP_ADC,ENABLE);
}
// 通过软件控制方式 对电压值进行获取
uint16_t ADC_GetValue(void)
{
	uint16_t value = 0;
	ADC_RegularChannelConfig(MSP_ADC,MSP_ADC_CHANNEL,1,ADC_SampleTime_239Cycles5);
	ADC_SoftwareStartConvCmd(MSP_ADC,ENABLE);
	while(!ADC_GetFlagStatus(MSP_ADC,ADC_FLAG_EOC));
	value = ADC_GetConversionValue(ADC1);
	return value;
}
#include "stm32f10x.h"
#include "OLEDDrvier.h"
#include "ADCDriver.h"
#include "Timer.h"

uint16_t ADC_ConvertedValue;

void main()
{
	uint16_t = tValue ;
	ADCDriver_Init();
	KeyDriver_Init();
	OLED_Init();
	
	while(1)
	{
		tValue = ADC_GetValue();
		Delay_ms(100);
		ADC_ConvertedValueLoca = ((float )tValue) / 4095 * 3.3;
		OLED_ShowChar(2,8,((char)(TempValue1 / 100)));
		OLED_ShowChar(2,9,((char)(TempValue1 % 100 / 10)));
		OLED_ShowChar(2,10,((char)(TempValue1 % 100 % 10)));
		Delay_ms(100);
	}
}

  • 26
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 野火是一家致力于开发和销售嵌入式开发板的公司,他们的产品系列中包括了很多基于STM32-F103芯片的开发板。这款芯片是意法半导体推的一款低功耗、高性能的32位微控制,广泛应用于工业控制、汽车电子、消费电子等领域。 野火的开发板采用了精美的设计和丰富的功能,使得学习和开发STM32-F103变得更加简单和有趣。它们不仅提供了各种接口和外设,如GPIO、串口、I2C、SPI等,还具备了丰富的软件资源,包括示例代码、库函数和开发工具等。这些资源可以帮助开发者快速上手,并且能够实现各种功能,如LED闪烁、蜂鸣发声、温度传感读取等。 野火开发板的另一个亮点是它们的零死角设计。无论是电源、传感、扩展接口还是USB接口,野火都考虑到了用户的需求,并且尽可能地做到了完善和完整。这样一来,用户就可以在不受限制的情况下进行各种创意的嵌入式开发,不再为接口不够或功能不完善而烦恼。 与此同时,野火开发板也提供了丰富的学习资源和教学视频,帮助初学者了解和掌握STM32-F103的基本原理和应用。无论是学生、工程师还是爱好者,都可以通过野火的开发板来深入了解嵌入式系统的开发和应用,进一步提升自己的技能和能力。 总之,野火的开发板可以说是零死角玩转STM32-F103的理想选择。它们的丰富功能、完善的接口和外设,以及全面的学习资源,都使得开发者能够轻松地进行嵌入式系统的开发和应用。无论是初学者还是专业人士,都能够通过野火的产品来探索和实践嵌入式技术的魅力。 ### 回答2: 野火 零死角玩转STM32-F103是一本关于如何全面掌握野火STM32-F103开发板的书籍。 首先,野火STM32-F103是一款功能强大的开发板,搭载了STM32F103C8T6的微控制芯片。该开发板具有丰富的外设资源,如LED指示灯、按键、蜂鸣ADC、串口等,可用于各种实际应用。在这本书中,通过详细的实例和案例,作者教读者如何充分利用这些外设实现各种功能。 此外,书中还详细介绍了STM32开发环境的搭建和使用。从软件安装到简单的“Hello World”程序的编写,再到更复杂的项目开发,都有详细的步骤和指导。读者可以根据书中的指导逐步学习和掌握STM32的开发工具和编程语言。 在书的后面章节中,还介绍了一些高级应用,如通过外部中断、定时和PWM等方式控制外设,以及使用WiFi、蓝牙等无线通信模块进行远程控制等。这些内容可以帮助读者更加深入地理解STM32的应用场景,并扩展自己的知识和技能。 总之,野火 零死角玩转STM32-F103是一本全面而实用的书籍,适合初学者和有一定基础的读者。通过学习这本书,读者可以轻松地掌握STM32的开发技术,将其应用于自己的项目中。无论是做电子制作、嵌入式系统设计还是其他领域,这本书都会成为读者的得力助手。 ### 回答3: 野火是一款基于STM32-F103开发板的强大工具,它集成了丰富的硬件资源和强大的软件支持,让开发者能够充分发挥STM32-F103的潜力。野火开发板具有零死角的设计,使得开发者可以以各种方式玩转STM32-F103。 首先,野火开发板提供了丰富的外设接口,包括GPIO、UART、SPI、I2C、ADC等等,这些接口可以连接各种外部设备,如传感、显示屏、通信模块等。同时,野火还配备了大容量存储,包括FLASH和RAM,可以存储大量的代码和数据。 其次,野火开发板支持多种开发环境和编程语言,包括keil、IAR、STM32CubeMX等,可以满足不同开发者的需求。野火还提供了丰富的软件库和示例代码,开发者可以轻松地使用这些库和代码进行开发,加快开发进度。 最重要的是,野火具有强大的性能和稳定性,能够在各种应用场景下稳定运行。它采用了STM32-F103芯片,配备了高速处理和丰富的内存,能够处理各种复杂的任务。此外,野火还支持多种调试功能,如JTAG、SWD和串口调试,方便开发者进行调试和测试。 总而言之,野火开发板零死角玩转STM32-F103,不仅提供了丰富的硬件资源和软件支持,还具有强大的性能和稳定性,能够满足开发者的各种需求。无论是初学者还是有经验的开发者,都可以通过野火开发板来开发高质量的STM32-F103应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值