11、STM32的ADC的原理与使用(内附代码)

一、ADC的原理及定义

Analog-to-Digital Converter的缩写。中文译名:模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。其实就是一个取样、量化、编码的一个过程。

典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。比如电量、光照传感器等常用。


二、模拟信号

模拟信号是指用连续变化的物理量表示的信息,其信号的幅度,或频率,或相位随时间作连续变化,如目前广播的声音信号,或图像信号等。


三、数字信号

数字信号指幅度的取值是离散的,幅值表示被限制在有限个数值之内。 二进制码就是一种数字信号。二进制码受噪声的影响小,易于有数字电路进行处理,所以得到了广泛的应用。


四、单次转化与连续转换对比

 


五、扫描模式

其他请参考其中文参考手册


六、ADC精度

精度是衡量ADC转换准确性的一个标准,精度常有8bit 10bit 12bit 16bit四种,如下表所示:

也就是把3.3V的电压分成256,1024,4096,65535份,每一份电压是固定的,显而易见就是分的份数越多,精度就度越高了,也就是精度越小,ADC精度就越高

ADC的转换公式如下:


七、STM32F40x系列ADC外部通道和引脚对应关系 

通道号

ADC1

ADC2

ADC3

通道0

PA0

PA0

PA0

通道1

PA1

PA1

PA1

通道2

PA2

PA2

PA2

通道3

PA3

PA3

PA3

通道4

PA4

PA4

PF6

通道5

PA5

PA5

PF7

通道6

PA6

PA6

PF8

通道7

PA7

PA7

PF9

通道8

PB0

PB0

PF10

通道9

PB1

PB1

PF3

通道10

PC0

PC0

PC0

通道11

PC1

PC1

PC1

通道12

PC2

PC2

PC2

通道13

PC13

PC13

PC13

通道14

PC4

PC4

PF4

通道15

PC5

PC5

PF5


八、实现过程

//1、开启PA口时钟和ADC1时钟,设置PA1为模拟输入。

  RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOA, ENABLE);

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

  对应的GPIO初始化  

  GPIO_Init();      

//2、复位ADC1,同时设置ADC1分频因子。

 ADC_DeInit(ADC1);
//3、初始化ADC_CCR寄存器。

  ADC_CommonInit();

//4、初始化ADC1参数,设置ADC1的工作模式以及规则序列的相关信息。

  void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);

//5、使能ADC。

 ADC_Cmd(ADC1, ENABLE);
//6、配置规则通道参数:

  ADC_RegularChannelConfig();
//7、开启软件转换:

  ADC_SoftwareStartConvCmd(ADC1);

//8、等待转换完成,读取ADC值。

 ADC_GetConversionValue(ADC1);

 

ADC(Analog to Digital Converter,模数转换器)是一种将模拟信号转换为数字信号的电路。它能够将模拟信号转换成数字信号,使得微处理器或微控制器能够对模拟信号进行处理。 在STM32中,ADC原理是采用逐次逼近法进行模数转换。具体来说,ADC会按照设定的采样频率,对输入的模拟信号进行采样并保持住。然后,ADC会将采样到的模拟信号转换为数字信号,通过DMA或中断的方式将结果传输到内存中。 下面是一个简单的STM32 ADC代码示例,假设使用的是单通道、单次转换模式: ```c #include "stm32f10x.h" void ADC1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; ADC_InitTypeDef ADC_InitStructure; // 使能ADC1时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); // 使能GPIOA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 配置PA1为模拟输入 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); // ADC配置 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); // 配置ADC1通道1采样时间 ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5); // 使能ADC1 ADC_Cmd(ADC1, ENABLE); } u16 Get_ADC(u8 ch) { // 配置ADC通道 ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_55Cycles5); // 启动ADC转换 ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 等待转换完成 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); // 返回转换结果 return ADC_GetConversionValue(ADC1); } ``` 上述代码中,首先需要初始化ADC1,将PA1配置为模拟输入,然后配置ADC的工作模式、转换模式、数据对齐方式等参数。接着,配置ADC1的通道1采样时间,并通过Get_ADC函数获取ADC转换结果。在Get_ADC函数中,首先配置ADC通道,然后启动ADC转换,并等待转换完成。最后,通过ADC_GetConversionValue函数获取转换结果并返回。 需要注意的是,ADC的配置和使用方式因具体的STM32型号而异,以上代码仅供参考。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值