STM32——ADC实验

知识点

1、ADC位数:
STM32的ADC是12位的,表示从0-4095的数

2、读到的值怎么换算成实际的电压值
0表示GND 4095表示参考电压,线性求解。

3、参考电压
由于外接的参考电压可能精度不够,所以芯片厂商给ADC模块中引入参考电压,由非常标准的参考电压芯片来接入参考电压引脚。标准的电压芯片,我们一般叫做参考电压芯片,或者叫做基准电压芯片。例如REF3133(输出3.300V) REF3025(输出2.500V)等等。
注意:STM32 的100脚以上(含100脚)有参考电压引脚。在没有参考电压引脚的单片机上,可以把基准电压芯片接入VDDA,但是VDDA和VDD的电压差不能超过0.3V,例如,VDD是3.3V的话,可以给VDDA接入一个3.3V的参考电压芯片或者3.0V的参考电压芯片,但是不能接入2.5V的参考电压芯片,后果就是芯片不能工作。

ADC引脚的输入电压范围是多大
一般情况下,ADC引脚的输入电压,是从0 -VDD,如果有REF引脚,一般是0-Vref,也有0~2Vref的情况。
如果被测的电压大于ADC的输入电压,例如,要用STM32测量0~5V的电压的话,可以在输入ADC引脚之前,加入电阻分压和放大器电路。

4、ADC参数

  • a. 分辩率(Resolution) 指数字量变化一个最小量时模拟信号的变化量,定义为满刻度与 2n 的 比值。分辩率又称精度,通常以数字信号的位数来表示。
  • b. 转换速率(Conversion Rate)是指完成一次从模拟转换到数字的 AD 转换所需的时间的倒数。 积分型 AD 的转换时间是毫秒级属低速 AD,逐次比较型 AD 是微秒级属中速 AD,全并行/ 串并行型 AD 可达到纳秒级。采样时间则是另外一个概念,是指两次转换的间隔。为了保 证转换的正确完成,采样速率(Sample Rate)必须小于或等于转换速率。因此有人习惯上将 转换速率在数值上等同于采样速率也是可以接受的。常用单位是 ksps 和Msps,表示每秒 采样千/百万次(kilo / Million Samples per Second)。
  • c. 量化误差(Quantizing Error) 由于 AD 的有限分辩率而引起的误差,即有限分辩率 AD 的阶梯 状转移特性曲线与无限分辩率 AD(理想 AD)的转移特性曲线(直线)之间的最大偏差。 通常是 1 个或半个最小数字量的模拟变化量,表示为 1LSB、1/2LSB。
  • d. 偏移误差(Offset Error) 输入信号为零时输出信号不为零的值,可外接电位器调至最小。
  • e. 满刻度误差(Full Scale Error) 满度输出时对应的输入信号与理想输入信号值之差。
  • f. 微分非线性(Differential nonlinearity,DNL)ADC 相邻两刻度之间最大的差异。
  • g. 积分非线性(Integral nonlinearity,INL)表示了 ADC 器件在所有的数值点上对应的模拟值 和真实值之间误差最大的那一点的误差值,也就是输出数值偏离线性最大的距离。

内部结构详解

程序

main.c

/*********************************************************
**  FileName: 		  ADC实验
**  Description: 
使用电位器调整电阻值,ADC扫描电阻值,输入电压值
 
**  Author:		      老猫
**  Date:   		  2019/10/7
**  Others:	  
*********************************************************/
#include "stm32f10x.h" //STM32头文件
#include "stm32f10x_adc.h"
#include "stdio.h"
#include "sys.h"
void RCC_Configuration(void);
void GPIO_Configuration(void);
void USART_Configuration(void);
void ADC_Configuration(void);

int main (void){//主程序
	float VolValue=0.00;
	u32 ticks=0;
	RCC_Configuration();
	GPIO_Configuration();
	USART_Configuration();
	ADC_Configuration();
	printf("\r\n The AD_Value is:----------------\r\n");
	while(1)
	{
		if(ticks++>=2000000)
		{
			ticks=0;
			VolValue=2.56*ADC_GetConversionValue(ADC1)/0X0FFF;
			printf("\r\n The current volvalue=%.2fv\r\n",VolValue);
		}
	}
}
void GPIO_Configuration(void)
{
    /* 定义 GPIO 初始化结构体 GPIO_InitStructure */
    GPIO_InitTypeDef GPIO_InitStructure;   
    /* 设置 USART1 的Tx脚(PA.9)为第二功能推挽输出功能 */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA , &GPIO_InitStructure);    
    /* 设置 USART1 的Rx脚(PA.10)为浮空输入脚 */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA , &GPIO_InitStructure);
	
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;	
	GPIO_Init(GPIOB , &GPIO_InitStructure);
}
void ADC_Configuration(void)
{
	ADC_InitTypeDef ADC_InitStructure;
	RCC_ADCCLKConfig(RCC_PCLK2_Div4);
		/*	
	*	独立工作模式;
	*	多通道扫描模式;
	*	连续模数转换模式;
	*	转换触发方式:转换由软件触发启动;
	*	ADC 数据右对齐 ;
	*	进行规则转换的 ADC 通道的数目为1; 
	*/
	ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;
	ADC_InitStructure.ADC_ScanConvMode=ENABLE;
	ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;
	ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;
	ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;
	ADC_InitStructure.ADC_NbrOfChannel=1;
	ADC_Init(ADC1,&ADC_InitStructure);
	ADC_RegularChannelConfig(ADC1,ADC_Channel_8,1,ADC_SampleTime_55Cycles5);
	ADC_Cmd(ADC1,ENABLE);
	ADC_ResetCalibration(ADC1);
	while(ADC_GetResetCalibrationStatus(ADC1));
	ADC_StartCalibration(ADC1);
	while(ADC_GetCalibrationStatus(ADC1));
	ADC_SoftwareStartConvCmd(ADC1,ENABLE);
}
void USART_Configuration(void)
{
    /* 定义 USART 初始化结构体 USART_InitStructure */
    USART_InitTypeDef USART_InitStructure;
    
    /*	
    *	波特率为115200bps;
    *	8位数据长度;
    *	1个停止位,无校验;
    *	禁用硬件流控制;
    *	禁止USART时钟;
    *	时钟极性低;
    *	在第2个边沿捕获数据
    *	最后一位数据的时钟脉冲不从 SCLK 输出; 
    */
    USART_InitStructure.USART_BaudRate = 115200;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No ;
    USART_InitStructure.USART_HardwareFlowControl =  USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    USART_Init(USART1 , &USART_InitStructure);   
    /* 使能 USART1 */
    USART_Cmd(USART1 , ENABLE);
}

/******************************************************************************
* 函数名  		: fputc
* 函数描述    	: 将printf函数重定位到USATR1
* 输入参数    	: 无
* 输出结果    	: 无
* 返回值			: 无
******************************************************************************/
int fputc(int ch, FILE *f)
{
    USART_SendData(USART1, (u8) ch);
    while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
    return ch;
}

实验结果
STM32——ADC实验_第1张图片

你可能感兴趣的:(单片机)