当前位置:   article > 正文

基于STM32F103RBT6实现ADC转换_stm32f103rbt6实现adc采样电路

stm32f103rbt6实现adc采样电路

一 ADC 简介

12位ADC是一个逐次必经型模式数字转换器。多达18个通道,
可测量 16个外部 和2个内部信号源.每个通道的A/D转换可以单次,
连续 扫描 或者 间断模式运行。
  • 1
  • 2
  • 3

时钟选择

ADC 的输入时钟 不得超过 14Mhz 他是由Pclk2 经过分频 产生的。
  • 1

二 ADC 框图讲解

我们想了解ADC的功能  第一步应该从看结构图开始 
大概他的主要组成有7个部分 
  • 1
  • 2

在这里插入图片描述
下面来对重点 部分组成 进行讲解

1电压输入范围

第"1"部分

ADC 测量的电压 范围是 VREF-<ADCIN<VREF+  我门把 VREF+ 和VDDA接3.3电源的正极
VREF- 和 VSSA 接电源的负极,这样形成的电压范围是 0-3.3V
  • 1
  • 2

2 输入通道

ADC的十几个通道 对应了不同的io口 ADC1 有两个通道是有特殊用法 请往下看。
在这里插入图片描述
输入转换过程

ADC IN0 是ADC 的输入通道 ,信号通过输入通道进入单片机。
ADC转换 :A(模拟量)--D(数字量)也就是 输入了模拟 信号 0或信号1  
通过单片机转换变成了数字信号 即 3.3V或者 2.33V(对应的电压值
根据实际来看 这里只是举例说明)
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述
外部通道转换又分为 规则通道和注入通道 ,规则通道多达16个 注入通道多达4个
注入通道很少用 下面继续说下两个通道区别

规则通道

顾名思义 就是 规规矩矩的 通道 很普通 一般我们就用它来进行adc转换 
  • 1

注入通道

他可以在 规则通道 转换过程,强行加入,这里可以理解为一个中断通道。
它会先执行中断通道 它结束以后 才会返回规则通道继续运行.
  • 1
  • 2

转换顺序

在这里插入图片描述

SQR1 寄存器控制着 ADC的转换顺序和 数目 如果是只有一个通道那倒无所谓了。

  • 1
  • 2

在这里插入图片描述

SQR2 寄存器控制着 ADC的转换顺序和 数目 如果是只有一个通道那倒无所谓了。
  • 1

在这里插入图片描述

SQR3 寄存器控制着 ADC的转换顺序和 数目 如果是只有一个通道那倒无所谓了。
规则通道转换顺序总的来说 有三个寄存器来控制 (SQR1 SQR2 SQR3)
  • 1
  • 2

注入通道转换顺序控制寄存器 JSQR
在这里插入图片描述

他只有一个 很好记 也就是只有一个中断通道。
  • 1

三 硬件搭建

1)电路图
就比如 你拿到的题目是
在这里插入图片描述
看到的电路图是这样的
在这里插入图片描述

在这里插入图片描述

如果板子没有PA15 那可能是和别的io短接了 这样很明显看出 他是和R27 R28 R29 JTDO 短接了 
但是板子只有 JIDO 有对应的 io 这样我们可以理解为 JTDO的PB3 ==PA15
  • 1
  • 2

2)稍微普及一下初中知识

短接相当于 串联  串联电路  电压处处相等。
  • 1

四 配置代码

1)代码的 4 部分组成

1  对应的 IO配置 
2 基本的 ADC结构体配置 
3 ADC 转换周期配置
4  校准 数据 函数 
{
1 复位检查 
2 校准 
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

初始化结构体

typedef struct
{
  uint32_t ADC_Mode; //ADC模式                                                                                             
  FunctionalState ADC_ScanConvMode;     //adc扫描模式 
  FunctionalState ADC_ContinuousConvMode; //单次转换 或者 连续转换
  uint32_t ADC_ExternalTrigConv;        //adc 触发信号选择                                                                              
  uint32_t ADC_DataAlign;     //对齐模式            
  uint8_t ADC_NbrOfChannel;       //通道 几     
                                                                                   
}ADC_InitTypeDef;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

通过配置参数变量 来初始化 adc 函数

   
	GPIO_InitTypeDef GPIO_Initstruct;
	ADC_InitTypeDef ADC_Initstruct;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//IO的时钟使能
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//ADC 1 时钟使能  、
//注意不要和转换周期混乱  两个是不一样的概念 不会冲突  要同时存在  缺一不可 
	
	GPIO_Initstruct.GPIO_Mode=GPIO_Mode_AIN; //模拟输入 固定 
	GPIO_Initstruct.GPIO_Pin=GPIO_Pin_1; //和PB3 短接 相当于是 PA1==BP3
	GPIO_Initstruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_Initstruct);
	
	ADC_Initstruct.ADC_Mode=ADC_Mode_Independent; //独立模式 
	ADC_Initstruct.ADC_ScanConvMode =DISABLE; //关闭扫描
	ADC_Initstruct.ADC_ContinuousConvMode= DISABLE;//关闭连续转换 
	ADC_Initstruct.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//选择软件模式触发
	ADC_Initstruct.ADC_NbrOfChannel=1;//对应的采集通道数目 
	ADC_Initstruct.ADC_DataAlign=ADC_DataAlign_Right;//采取右对齐 
	
	ADC_Init(ADC1,&ADC_Initstruct);//初始化
	ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_1Cycles5);    
	ADC_Cmd(ADC1,ENABLE);	//使能 ADC1 
	 ADC_ResetCalibration(ADC1);
	while( ADC_GetResetCalibrationStatus(ADC1));
	ADC_StartCalibration(ADC1);
	while( ADC_GetCalibrationStatus(ADC1));

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
1 2 部分就不讲解了  不懂的看备注  
  • 1

第 3 转换周期
在这里插入图片描述
比如 :
在这里插入图片描述

 	ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_1Cycles5);   
 	                    备注//ADC1,对应通道,采集通道数,转换周期 (1.5+12)
 	                         1.5 并不是 真实的转换周期 要加上 12才行.
  • 1
  • 2
  • 3

周期计算

f=14 0 0 0  0 0 0 单位(s)根据公式 :f=1/T    也就是 1s内发生了 
14 0 0 0 0 0 0 个周期事件, 那么一个周期 就是 1/14 00 00 00 s。
14个周期 就是 14/14000 000 = 1/1000 000 S  
1 000  000us =1s , 那么 14周期就是 1us
  • 1
  • 2
  • 3
  • 4

4 校准数据
{ 1 }

	 ADC_ResetCalibration(ADC1); //复位检查 
	while( ADC_GetResetCalibrationStatus(ADC1));//等待检查完毕 
	
  • 1
  • 2
  • 3

什么是复位

 复位就是 多检查 一次 以防 出错 而已  并没有多高级
  • 1

4 校准数据
{ 2 }

	ADC_StartCalibration(ADC1); //校准 
	while( ADC_GetCalibrationStatus(ADC1));//等待校准结束 
  • 1
  • 2

ADC Turn.c

开始转换数据 
  • 1
	float ADC_turnfloat;
	ADC_SoftwareStartConvCmd(ADC1,ENABLE); //软件转换使能 
	while( ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==0); 	 //等待转换结束 
	ADC_turnfloat=ADC_GetConversionValue(ADC1)*3.30/0XFFF;//公式 
	return ADC_turnfloat;//返回显示 
  • 1
  • 2
  • 3
  • 4
  • 5
	while( ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==0); 	 //等待转换结束 
//用了这个标志位来表示数据转换结束 
  • 1
  • 2

在这里插入图片描述
注意

我并没有使用中断  不要混乱了 。
  • 1

标志位选择注意

在这里插入图片描述

杜邦线

配置完之后  用杜邦线把 PA1 和 PB3 串起来 
  • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/717230
推荐阅读
  

闽ICP备14008679号