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

--END--


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

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

推荐阅读最新更新时间:2024-11-17 06:22

基于数字移相的高精度脉宽测量系统及其FPGA实现
摘要:采用XILINX公司的SpartanII系列FPGA芯片设计了一种基于数字移相技术的高精度脉宽测量系统,同时给出了系统的仿真结果和精度分析。与通常的脉冲计数法相比,该系统的最大测量误差减小到原来的34.2%。 关键词:脉宽测量 数字移相 脉冲计数法 FPGA 在测量与仪器仪表领域,经常需要对数字信号的脉冲宽度进行测量。这种测量通常采用脉冲计数法,即在待测信号的高电平或低电平用一高频时钟脉冲进行计数, 然后根据脉冲的个数计算待测信号宽度,如图1所示。待测信号相对于计数时钟通常是独立的,其上升、下降沿不可能正好落在时钟的边沿上,因此该法的最大测量误差为一个时钟周期。例如采用80MHz的高频时钟,最大误差为12.5ns。
[应用]
STM32 ADC
STM32 ADC 简介 STM32 拥有 1~3 个 ADC (STM32F101/102 系列只有 1 个 ADC) ,这些 ADC 可以独立使用,也可以使用双重模式(提高采样率)。STM32 的 ADC 是 12 位逐次逼近型的模拟数字转换器。它有 18 个通道,可测量 16 个外部和 2 个内部信号源。各通道的 A/D 转换可以单次、连续、扫描或间断模式执行。 ADC 的结果可以左对齐或右对齐方式存储在 16 位数据寄存器中。 模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。 STM32F103 系列最少都拥有 2 个 ADC,我们选择的 STM32F103ZET 包含有 3 个 ADC。STM32
[单片机]
集成信号调理—高精度温度测量的关键因素
在测量温度、压力、流量和姿态等真实世界中的物理参数时,往往必须从许多信号特性差异很大的换能器中提取数据。这些换能器所产生的信号可能包括高压、低压、电流、频率或者脉冲数据,而每一种信号都会为工程师的测量带来一系列独特的挑战。其中,温度是迄今为止最常被测量的参数,热电偶则是在温度测量应用中最主要的测量设备。 热电偶的物理特性对用户的使用提出了许多独特的挑战。首先,必须将它产生的低电平信号放大,然后还要滤除其中的高频分量和噪声,同时,还必须小心降低邻道的干扰。很明显,要保证热电偶测量的结果准确并可重复,信号调理是十分关键的一环。 热电偶换能器在两片异金属相互接触时产生一个低电平的电压,该电压通常被称作温差电动势,信号强度在毫伏级。例
[测试测量]
集成信号调理—高<font color='red'>精度</font>温度测量的关键因素
STM32移植uC/OS-II总结
uC/OS-II成功移植在STM32 上了,虽然理解还不是很深刻,但大体明白移植方法,以前曾经将uC/OS-II移植到MSP430F1611上,但是也没关注那么多,现在按照网友的介绍进行移植,下载官方的V2.86版本的固件,自己建工程,修改Port部分,建立两个任务,但是调试时死在程序死在了OSStart();里。经过单步发现程序的软件中断触发后调用服务函数失败,停在了 OSStartHang B OSStartHang //停在这里,而且这里正常情况下不应该在这的; 然后就开始查问题,最终解决。发现无论学什么,一定要知其然知其所以然,不然学的永远都只是皮毛。现在把自己的移植过程和理解记录下来。 下载将官
[单片机]
<font color='red'>STM32</font>移植uC/OS-II总结
STM32外设有哪些?外设在总线上是怎么挂载的?
一:STM32外设有哪些? 外设在STM32库文件的下面路径下:(STM32库:stm32f10x_stdperiph_lib) stm32f10x_stdperiph_libSTM32F10x_StdPeriph_Lib_V3.5.0LibrariesSTM32F10x_StdPeriph_Driver 1.MISC:把NVIC的外设驱动放在了misc.c中(NVIC提供中断控制器,用于总体管理异常,称之为“内嵌向量中断控制器) 2.ADC:模数转换 3.BKP:备份数据 4.CAN:CAN总线是一种通信方式。STM32主要负责程序的运行,而CAN总线只是一种通信协议。STM32之间的通信可以通过CAN总线进行数据交换。
[单片机]
<font color='red'>STM32</font>外设有哪些?外设在总线上是怎么挂载的?
再造STM32---第四部分:新建工程---寄存器版
4.1 新建工程: 4.1.1 新建本地工程文件夹: 为了工程目录更加清晰,我们在本地电脑上新建 1 个文件夹用于存放整个工程,如命名为“LED”,然后在该目录下新建 2 个文件夹,具体如下: 表格 8 工程目录文件夹清单 表格 9 工程目录文件夹内容清单 4.1.2 新建工程: 打开 KEIL5,新建一个工程,工程名根据喜好命名,我这里取 LED-REG,直接保存在 LED 文件夹下。 1. 选择 CPU 型号: 这个根据你开发板使用的 CPU 具体的型号来选择, 我的F429选STM32F429IGT 型号。如果这里没有出现你想要的 CPU 型号,或者一个型号都没有,那么肯定是你的 KE
[单片机]
再造STM32---第四部分:新建工程---寄存器版
关于STM32驱动点阵的问题整理及科研思维小酌
之前用51单片机成功将5块级联的16*16点阵成功驱动,闲来无事,沉积内功,用STM32驱动这几个点阵,本觉易事,没想到点阵豆豆竟三天耍脾气,不配合。一筹莫展之际,和别人聊微信,顺手掐断了豆豆的VCC,GND,惊呼哇塞,预期效果。真是无心插柳柳成荫。正预深入测试下去,停电,兴奋若狂,迫不及待,莫非上帝知道问题要揭晓了,急了,连断电的招都使。停电两小时,由缺VCC可正常显示,加VCC反而不亮,已推断出问题范围。入夏的夜,和豆豆玩到10点半,终把豆豆抱。 硬件配置:MCU :STM32,工作电压3.3V; 驱动芯片74HC595; 16*16点阵:五块 问题一:.点阵上电不亮,掉电正常显示 答:74hc595工作电压
[单片机]
STM32系统头文件之数据类型定义u8 u16哪里来的
初学STM32编程时,经常见到数据类型定义的符号:u8、u16等,51都是自己定义数据类型的简写符号,STM32是哪里定义的呢?今天没事就看了看系统头文件,数据类型的定义在其中的3个头文件里: (1)stdint.h(摘取定义部分) /* * 'signed' is redundant below, except for 'signed char' and if * the typedef is used to declare a bitfield. */ /* 7.18.1.1 */ /* exact-width signed integer types */ t
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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