STM32的ADC实验

发布者:BlissfulHeart最新更新时间:2024-08-02 来源: elecfans关键字:STM32  ADC实验  精度 手机看文章 扫描二维码
随时随地手机看文章

1、ADC 简介

STM32f103系列有3个ADC,精度为12位,每个ADC最多有16个外部通道。其中ADC1和ADC2都有16个外部通道,ADC3一般有8个外部通道,各通道的A/D转换可以单次、连续、扫描或间断执行,ADC转换的结果可以左对齐或右对齐储存在16位数据寄存器中。ADC的输入时钟不得超过14MHz,其时钟频率由PCLK2分频产生。


2、ADC配置

#include 'stm32f10x.h'

#include 'stdio.h' 


//-------------------------------------------------------------------------

//函数功能 : 重定向

//-------------------------------------------------------------------------

int fputc(int ch,FILE *p)  //函数默认的,在使用printf函数时自动调用

{

  USART_SendData(USART1,(u8)ch);  

  while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);

  return ch;

}


//-------------------------------------------------------------------------

//函数功能 : USART1初始化

//输入说明 : bound为波特率配置参数

//-------------------------------------------------------------------------

void USART1_Init(u32 bound)

{

   //GPIO端口设置

  GPIO_InitTypeDef GPIO_InitStructure;

  USART_InitTypeDef USART_InitStructure;

  NVIC_InitTypeDef NVIC_InitStructure;

  

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);   //打开时钟

 

  

  /*  配置GPIO的模式和IO口 */

  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//TX         //串口输出PA9

  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;      //复用推挽输出

  GPIO_Init(GPIOA,&GPIO_InitStructure);  /* 初始化串口输入IO */

  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//RX       //串口输入PA10

  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;      //模拟输入

  GPIO_Init(GPIOA,&GPIO_InitStructure); /* 初始化GPIO */

  


   //USART1 初始化设置

  USART_InitStructure.USART_BaudRate = bound;//波特率设置

  USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式

  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); //初始化串口1

  

  USART_Cmd(USART1, ENABLE);  //使能串口1 

  

  USART_ClearFlag(USART1, USART_FLAG_TC);

    

  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启相关中断


  //Usart1 NVIC 配置

  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断通道

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3

  NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;    //子优先级3

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;      //IRQ通道使能

  NVIC_Init(&NVIC_InitStructure);  //根据指定的参数初始化VIC寄存器、  

}


//-------------------------------------------------------------------------

//函数功能 : USART1中断函数

//-------------------------------------------------------------------------

void USART1_IRQHandler(void)                  //串口1中断服务程序

{

  u8 r;

  if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断

  {

    r =USART_ReceiveData(USART1);//(USART1->DR);  //读取接收到的数据

    USART_SendData(USART1,r);

    while(USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET);

  } 

  USART_ClearFlag(USART1,USART_FLAG_TC);


//-------------------------------------------------------------------------

//函数功能 : 延迟 N ms

//输入说明 : time为延时的时间参数

//-------------------------------------------------------------------------

void delay_nms(u16 time)

{    

   u16 i=0;  

   while(time--)

   {

      i=12000;  //自己定义

      while(i--) ;    

   }

}



//-------------------------------------------------------------------------

//函数功能 : ADC初始化  

//-------------------------------------------------------------------------

void ADCx_Init(void)

{

  GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量  

  ADC_InitTypeDef  ADC_InitStructure;

  

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE);

  

  RCC_ADCCLKConfig(RCC_PCLK2_Div6);//设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M

  

  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;//ADC

  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//模拟输入

  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

  GPIO_Init(GPIOA,&GPIO_InitStructure);

  

  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;//1个转换在规则序列中 也就是只转换规则序列1

  ADC_Init(ADC1, &ADC_InitStructure);//ADC初始化

  

  ADC_Cmd(ADC1, ENABLE);//开启AD转换器

  

  ADC_ResetCalibration(ADC1);//重置指定的ADC的校准寄存器

  while(ADC_GetResetCalibrationStatus(ADC1));//获取ADC重置校准寄存器的状态

  

  ADC_StartCalibration(ADC1);//开始指定ADC的校准状态

  while(ADC_GetCalibrationStatus(ADC1));//获取指定ADC的校准程序


  ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能或者失能指定的ADC的软件转换启动功能

}


//-------------------------------------------------------------------------

//函数功能 : 获取通道ch的转换值,取times次,然后平均

//输入说明 : ch:通道编号

//      times:获取次数

//输出说明 : 通道ch的times次转换结果平均值

//-------------------------------------------------------------------------

u16 Get_ADC_Value(u8 ch,u8 times)

{

  u32 temp_val=0;

  u8 t;

  //设置指定ADC的规则组通道,一个序列,采样时间

  ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5);  //ADC1,ADC通道,239.5个周期,提高采样时间可以提高精确度          

  

  for(t=0;t;t++)>


3、验证程序,实验现象如下图

poYBAGPl6sqASJWDAAENAz_VYio849.png?imageView2/2/w/1000

--END--


关键字:STM32  ADC实验  精度 引用地址:STM32的ADC实验

上一篇:STM32怎么实现按键开关机
下一篇:STM32H5 DA初体验

推荐阅读最新更新时间:2026-03-20 12:56

stm32 嵌入式开发 用标准库进行 ADC 实验总结
硬件原理图 ,滑动电位器与芯片PC3引脚连接 根据开发板可知:STM32F429IGT6 有 3 个 ADC,每个 ADC 有 12 位、 10 位、 8 位和 6 位可选,每个ADC 有 16 个外部通道。         每个ADC 同时还有3个内部通道:通道16/17/18         工作模式有3种:独立模式、双重模式和三重模式 。 转换顺序可分为:规则序列,注入序列。如下图所示: 规则序列寄存器设置根据表由上到下选择通道进行配置 注入序列寄存器JSQR转换顺序为JSQR ,                   X=4-JL,JL为需要转换的通道 触发源可选择:ADC2_CR2-
[单片机]
<font color='red'>stm32</font> 嵌入式开发 用标准库进行 <font color='red'>ADC</font> <font color='red'>实验</font>总结
51单片机学习:ADC模数转换实验--光敏电阻AD采集
实验名称:ADC模数转换实验--光敏电阻AD采集 接线说明: 实验现象:下载程序后,数码管上显示AD模块采集光敏电阻的AD值 注意事项: ***************************************************************************************/ #include public.h #include smg.h #include xpt2046.h /******************************************************************************* * 函 数 名 : main * 函数功能 : 主函数
[单片机]
STM32万年历时钟调试经验(时间精度问题,断电RTC不持续运行)
最初调试STM32的万年历,使用的是内部的 LSI晶振作为RTC晶振来源,发现有两个问题: 第一:由于LSI晶振频率大约在40KHZ附近,实际上会在30~60KHZ之间波动,导致计时不准,基本上一个小时会有1分钟左右的偏差。 第二: 由于LSI内部晶振,在断电的时候,并不在后备供电区域范围内,而外接的3.3V电池连接到VBAT上,只给后备供电区域供电,导致系统断电后,电池只能维持后备RTC的计数,并没有给LSI晶振供电(见下图所示:),导致RTC总是保持在断电之前的时间。虽然重新上电后又可以继续运行。但是需要重新校准了 。 最后使用了外界的32.768KHZ的外部LSE晶振作为RTC晶振来源,调试过程中发现,反复修改,问题
[单片机]
<font color='red'>STM32</font>万年历时钟调试经验(时间<font color='red'>精度</font>问题,断电RTC不持续运行)
基于STM32和AD5791实现单路超高精度可调电压电路的设计
引言 现在很多智能测量仪表要求具有超高精度的电压信号,同时要求高稳定性、高线形度和低噪声、低温度漂移。这样的模拟系统设计面临复杂的工程技术挑战,常规的方法是采用多个较低分辨率的DAC和大量分立元件与支持IC整合在一起,同时伴随着相当大的开发风险和高代价的修改时间,才能优化电路参数、减小误差和设计出复杂的自动校准电路,这样不仅增加了硬件设计的复杂性,通常达到的精度也不是很高。本系统设计的基于STM32微处理器和AD5791的20位超高精度测量系统中,实现了单路超高精度可调电压信号的输出,输出电压信号的幅值可以通过软件来设置。该系统可靠性高,不需要校准电路。 AD5791是美国ADI公司推出的一款高性能的单路20位电压输出数模转换
[单片机]
基于<font color='red'>STM32</font>和AD5791实现单路超高<font color='red'>精度</font>可调电压电路的设计
AD1256之STM32程序——STM32测试高精度ADC篇(四)
1.ADS1256概述 ADS1256是TI(TexasInstruments)公司推出的一款低噪声高分辨率的24位Sigma-Delta(E-v)模数转换器(ADC)。E-vADC与传统的逐次逼近型和积分型ADC相比有转换误差小而价格低廉的优点,但由于受带宽和有效采样率的限制,E-vADC不适用于高频数据采集的场合。该款ADS1256可适合于采集最高频率只有几千赫兹的模拟数据的系统中,数据输出速率最高可为30K采样点/秒(SPS),4路差分与8路伪差分输入,有完善的自校正和系统校正系统,SPI串行数据传输接口。本文结合笔者自己的应用经验,对该ADC的基本原理以及应用做简要介绍。 ADS1256性价比很高,是TI公司24位
[单片机]
AD1256之<font color='red'>STM32</font>程序——<font color='red'>STM32</font>测试高<font color='red'>精度</font><font color='red'>ADC</font>篇(四)
ADC&&触摸屏实验及心得体会
概述: ADC通过把输入的模拟信号进行采集,经过量化和编码后转换为对应的二进制数值,并输出。主要参数有:分辨率(位数)、量程、采样速率。通常高档单片机、嵌入式处理器都会把ADC集成在芯片内部。但是集成在芯片内部的ADC一般采样速率会比较低,高速ADC一般都是自己做一片芯片。用到过的有ADC9288可达到100MSa/S、ADC8D1010可达到1GSa/S的采样率【这里两款ADC都已经把采样和转换集成在一起】。 触摸屏是一张和屏幕大小一样透明的东西,和显示屏是分开的。通常有电阻屏、电容屏、红外屏和超声屏。电阻屏触摸需要按下,使得屏的上下短接,检测电压求坐标。电容屏是靠人体感应到静电的流通,电流由屏的四个角落提供,各个角所提供的电
[单片机]
38. ADC实验
一。ADC通道与引脚的对应关系 二。常用库函数 三。ADC初始化函数 ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct); 例: 四。ADC使能函数,ADC使能软件转换函数 不使用外部触发,使用软件触发,所以调用使能软件转换函数。 五。实验步骤 void Adc_Init(void); // 完成步骤1--4 //初始化ADC //这里我们仅以规则通道为例 //我们默认将开启通道0~3 void Adc_Init(void) { ADC_InitTypeDef ADC_InitStructure; GPIO_In
[单片机]
38. <font color='red'>ADC</font><font color='red'>实验</font>
AVR片内ADC实验
通道3 当前转换值768; #include iom16v.h #include macros.h //#include math.h //#include stdio.h #include 1602.h uchar num ={0,0,0,0,0,0,0,0}; uint addr=0x0000; uchar channel=0,i=48; #pragma data:code const uchar SHAPE ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0X00}
[单片机]
AVR片内<font color='red'>ADC</font><font color='red'>实验</font>
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved