STM32F4之ADC1

发布者:MysticGarden最新更新时间:2016-12-19 来源: eefocus关键字:STM32F4  ADC 手机看文章 扫描二维码
随时随地手机看文章

折腾了两天ADC多通道采样,采样的结果都很乱,完全不是预期值。在amobbs求助也没有找到结果。于是决定从简单开始,一步步折腾着破ADC。

【ADC试验1实验说明】

            1、这个实验仅仅是初始化一个ADC,对其输入进行采样。

            2、使用STM32F4的ADC1进行采样,采样值不输出之在编译器里边观察。

            3、使用ST外设库进行实验

            4、本实验只为采集到数据,采样周期、采样间隔设置为最大。

【ADC试验1实验结果】

             成功采集到了ADC1,通道1引脚PA1上的输入。数据稳定不跳变。

【ADC试验1实验步骤】

1、首先怀疑是工程中使用的USART、EXTI什么的影响了ADC的。重建工程,加入ST外设库,添加引用位置。这一步就不说了。

2、开启GPIOA、ADC时钟。因为使用ADC1的通道1,对应的PA1引脚作为输入。

ADC挂接在APB2时钟上,GPIOA挂接在AHB1时钟上。所以要开启这两个时钟。

代码如下:

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);

3、输入引脚配置

          输入端口PA,引脚1.模拟输入,引脚时钟100M

//PA1 PA2 PA3,模拟输入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Pin = GPIO_PinSource1 | GPIO_PinSource2 | GPIO_PinSource3;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);

4、ADC通用的初始化

        这是F4系列新出来的东西,与F1不同。这里通过库函数配置一个新增的寄存器ADC_CCR,这个配置将影响片上所有的ADC。

//ADC通用配置
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;  //不用DMA
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;  //独立采样
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div8;  //速度尽可能低
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_20Cycles;
ADC_CommonInit(&ADC_CommonInitStructure);

5、ADC1初始化

        之后对单独的ADC1进行配置,设定一些参数。最后的ADC_RegularChannelConfig完成通道选择和扫描顺序设置

主要参数:连续采样/数据右对齐/不用外部触发/采样通道数1/12位精度

//ADC1配置
ADC_InitStructyre.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructyre.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructyre.ADC_ExternalTrigConv = ADC_ExternalTrigConvEdge_None;
ADC_InitStructyre.ADC_NbrOfConversion = 1;  //通道数
ADC_InitStructyre.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructyre.ADC_ScanConvMode = ENABLE;
ADC_Init(ADC1,&ADC_InitStructyre);
  
ADC_Cmd(ADC1,ENABLE);
ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_144Cycles);

6、手动开始ADC采样,由于配置为连续扫描所有只需要开启一次即可:

     使用函数ADC_SoftwareStartConv(ADC1);完成

7、获取ADC采样数据:

    可以通过读ADC的DR或者使用库函数ADC_GetConversionValue来完成。我使用的是库函数。

adcvalue1 = ADC_GetConversionValue(ADC1);

adcvota = adcvalue1 *3300 / 0xfff;

8、最后加上串口功能,让数据回显

while(1)
{
   adcvalue1 = ADC_GetConversionValue(ADC1);
   adcvota = adcvalue1 *3300 / 0xfff;
  
  for(i = 0;i<10000;i++)
  {
      sum += adcvota;
    if(i ==9999)
    {
       avgvota = sum/10000;
       sum = 0;
      printf("avg vota is: %d\r\n",avgvota);
    }
  }
}

9、完整的代码:

#include
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_adc.h"
#include "stm32f4xx_conf.h"

#include "usart.h"

#include

NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
ADC_InitTypeDef ADC_InitStructyre;

int adcvalue1,adcvalue2,adcvalue3;
int adcvota ;

int i,sum,avgvota;

int main()
{
  USART_Config();
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
  //PA1 PA2 PA3,模拟输入
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
//   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Pin = GPIO_PinSource1 | GPIO_PinSource2 | GPIO_PinSource3;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_Init(GPIOA,&GPIO_InitStructure);
  //ADC通用配置
  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;  //不用DMA
  ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;  //独立采样
  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div8;  //速度尽可能低
  ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_20Cycles;
  ADC_CommonInit(&ADC_CommonInitStructure);
  
  //ADC1配置
  ADC_InitStructyre.ADC_ContinuousConvMode = ENABLE;
  ADC_InitStructyre.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructyre.ADC_ExternalTrigConv = ADC_ExternalTrigConvEdge_None;
  ADC_InitStructyre.ADC_NbrOfConversion = 1;
  ADC_InitStructyre.ADC_Resolution = ADC_Resolution_12b;
  ADC_InitStructyre.ADC_ScanConvMode = ENABLE;
  ADC_Init(ADC1,&ADC_InitStructyre);
    
  ADC_Cmd(ADC1,ENABLE);
  ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_144Cycles);
  
  ADC_SoftwareStartConv(ADC1);
  
  sum = 0;
  while(1)
  {
     adcvalue1 = ADC_GetConversionValue(ADC1);
     adcvota = adcvalue1 *3300 / 0xfff;
    
    for(i = 0;i<10000;i++)
    {
        sum += adcvota;
      if(i ==9999)
      {
         avgvota = sum/10000;
         sum = 0;
        printf("avg vota is: %d\r\n",avgvota);
      }
    }
  }
}
  
  //重定义printf
int fputc(int ch,FILE *f)
{
  //检查发送寄存器为空之后再往里边放数据 
  while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
  {}
  //USART发送一个字符
  USART_SendData(USART1, (uint8_t) ch);
  return ch;
}


关键字:STM32F4  ADC 引用地址:STM32F4之ADC1

上一篇:STM32F4 ADC采集数据的DMA数据传输
下一篇:STM32F4 外部中断EXTI

推荐阅读最新更新时间:2024-03-16 15:26

[MSP430]实战 ADC使用, 内部测温使用
首先说说问题, 感觉这个Code Compose Studio 比较奇怪 #include TFTTFT_Driver.h 找不到文件, 无法打开 没有include 仅在同一工程下就可以使用函数 每次运行程序结果不同 下面给出一个使用ADC的实例: ADC初始化函数: void ConfigureAdcTempSensor(void) { /* Configure ADC Temp Sensor Channel */ ADC10CTL1 = INCH_10 + ADC10DIV_0 + CONSEQ_2; // Temp Sensor ADC10CLK/4 ADC10CTL0 = SRE
[单片机]
STM32F10x_ADC三通道逐次转换(单次、单通道软件触发)
Ⅰ、概述 本文讲述关于STM32功能比较强大的ADC模块。ADC(Analog to Digital Converter)也就是模拟量转化为数字量,而STM32的ADC模块功能比较多,本文主要讲述“三条通道逐次转换(单次、单通道软件触发)”。 根据笔者的经验,STM32所有系列芯片的ADC模块功能及配置都差不多。因此,本文虽是以F1为例,其实其他系列(F0、F2、F4等)都适用。 本文提供实例代码:三条通道,配置为逐次转换(间隔模式),适用软件触发转换(每触发一次转换一条通道),一个循环也就是需要软件触发三次。 实例实验效果: 通道1接地、通道2接1.5V电源、通道3接VCC 本文讲述的知识点相对较多,若初次学习
[单片机]
STM32F10x_<font color='red'>ADC</font>三通道逐次转换(单次、单通道软件触发)
基于51单片机和 ADC0808 ADC0809的自动数字电压表
前言: 之前讲过基于数码管显示的自动数字电压表,接下来讲一下基于LCD1602显示的相关设计,分别利用的是TI公司的ADC0808和ADC0809。 硬件和软件设计 基于51单片机+ADC0808+LCD1602 测试电压范围为2.1~25V(超出这个范围,程序会卡死),精度<0.05 仿真图如下: 部分代码如下: #include AT89X52.H #define LEDDATA P0 #define v20_on {s3=0;s2=0;s1=1;} //宏定义不同量程,不同的开关状态 #define v2_on {s3=0;s2=1;s1=0;} #define v02_on {s3=1;s2=0;s
[单片机]
基于51单片机和 <font color='red'>ADC</font>0808 <font color='red'>ADC</font>0809的自动数字电压表
由开关电源驱动的高速ADC设计
  系统设计人员正面临越来越多的挑战,他们必须在不降低系统元件(如高速资料转换器)性能的情况下让设计最大程度地实现节能。设计人员们可能转而採用许多以电池供电的应用(如某种手持终端、软体无线设备或可携式超音波扫描器),也可能缩小产品的外形尺寸,因而必须寻求减少发热的诸多方法。   极大降低系统功耗的一种方法是对高速资料转换器的电源进行最佳化。资料转换器设计和製程技术的一些最新进展,让许多新型ADC可直接由开关电源来驱动,因而达到最大化功效的目的。   系统设计人员们习惯在交换式稳压器和ADC之间使用一些低杂讯、低压降稳压器(LDO),以清除输出杂讯和开关频率突波(请参见图1)。但是,这种乾净的电源设计代价是高功耗,因为LDO要求压降
[电源管理]
由开关电源驱动的高速<font color='red'>ADC</font>设计
STM32F4XX 采集编码器的溢出处理
STM32F4XX定时器16位,采集编码器时候会在0xFFFF溢出(假设配置period = 0xFFFF) 假设不溢出的情况下1ms之内编码器变化的最大范围小于0x7FFF,则关于溢出则可以进行如下处理,此时EncCnt 便是累计的编码器取值 配置定时器时屏蔽定时器的溢出中断。 反转的变化规律为0溢出突变到65535,然后平缓向0 正转的变化规律为0平缓到65535,然后突变到0 int volatile EncCnt = 0;// 编码器取值 void SysTick_Handler(void) {// systick中断,1ms一次 static int encoder = {0 , 0};// 两次编码器读值,用以计算溢
[单片机]
STM32F407-跑马灯
硬件准备(STM32F407ZGT6) 1.初始准备 1.1打开Template模板,在工程目录下新建HARDWARE文件夹 1.2 新建在HARDWARE路径中新建led.c , led.h两个文件,在工程中新建HARDWARE Groups,并将led.c添加进去,将led.h添加进头文件目录中。 1.3硬件连接 2.程序编写 2.1 库函数 头文件:stm32f4xx_gpio.h 源文件:stm32f4xx_gpio.c 1个初始化函数: void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct
[单片机]
<font color='red'>STM32F4</font>07-跑马灯
STM32F10x_ADC三通道逐次转换 (单次、单通道软件触发)
Ⅰ、概述 本文讲述关于STM32功能比较强大的ADC模块。ADC(Analog to Digital Converter)也就是模拟量转化为数字量,而STM32的ADC模块功能比较多,本文主要讲述“三条通道逐次转换(单次、单通道软件触发)”。 根据笔者的经验,STM32所有系列芯片的ADC模块功能及配置都差不多。因此,本文虽是以F1为例,其实其他系列(F0、F2、F4等)都适用。 本文提供实例代码:三条通道,配置为逐次转换(间隔模式),适用软件触发转换(每触发一次转换一条通道),一个循环也就是需要软件触发三次。 实例实验效果: 通道1接地、通道2接1.5V电源、通道3接VCC 本文讲述的知识点相对较多,若初次学习S
[单片机]
STM32F10x_<font color='red'>ADC</font>三通道逐次转换 (单次、单通道软件触发)
Silicon Laboratories发表C8051T610系列低成本8位MCU
奥斯汀, 德州–2007年12月11日 –Silicon Laboratories近日发表C8051T610系列低成本8位微控制器,进一步扩大其居于领先的小型微控制器产品线。T610系列管脚兼容于Silicon Laboratories的C8051F310系列,提供客户同样精巧体积的低成本替代方案。 T610内含可按字节来烧录的EPROM,设计人员首次烧录这些内存后,还能在稍后继续烧录尚未使用的内存,这使T610系列的EPROM比传统的可单次烧录内存更有弹性。T610采用专利的流水线式单周期8051核心,中央处理器带宽最高25MIPS,还包含可测量模拟信号的高精确度模拟数字转换器 (ADC)、稳压器和精准内部振荡器等许多强大功能
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved