stm32adc多通道数据采集

发布者:Wanderlust123最新更新时间:2022-05-24 来源: eefocus关键字:stm32  adc  多通道  数据采集 手机看文章 扫描二维码
随时随地手机看文章

word文档链接:http://download.csdn.net/detail/mjlsuccess/6031351,免费的

工程连接:http://download.csdn.net/detail/mjlsuccess/6202155

/** @date   2013/8/28
    @author   Mei Jilin
@brief       ADC1的配置完成3通道的数据采集
    @attention
       1 ----------- adc_config();                     //配置adc
       2 ----------- adc_start();                      //启动adc,开始转换
       3 ----------- get_ChannelValue(ADC_Channel_x);  //读取相应通道的adc值
**/
#include "stm32f10x.h"
#include "adc.h"
#define CH_NUM  3           //要使用的ADC通道数


static uint16_t ad_value[CH_NUM]={0};
/** @para none
  * @ret  none
  * @brief adc对应的gpio初始化
  */
void adc_gpio_init(void)
{
    GPIO_InitTypeDef gpio;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    gpio.GPIO_Mode = GPIO_Mode_AIN;                         //配置为模拟输入
    gpio.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;   //ADC1 --channel0,1,2
    gpio.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&gpio); 
}
/** @para none
  * @ret  none
  * @brief adc配置
  */
void adc_init(void)
{
    ADC_InitTypeDef adc;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
    RCC_ADCCLKConfig(RCC_PCLK2_Div6);                       //设置ad时钟为72/6=12M,ad最大时钟频率为14M
    
    ADC_DeInit(ADC1);
    adc.ADC_Mode                = ADC_Mode_Independent;     //工作在独立模式
    adc.ADC_ContinuousConvMode  = ENABLE;                   //连续转换模式
    adc.ADC_DataAlign           = ADC_DataAlign_Right;      //数据右对齐
    adc.ADC_ExternalTrigConv    = ADC_ExternalTrigConv_None;//不使用外部触发
    adc.ADC_NbrOfChannel        = CH_NUM ;                       //转换3个通道
    adc.ADC_ScanConvMode        = ENABLE;                   //连续转换模式
    ADC_Init(ADC1,&adc);
    //设定指定的ADC通道组,设置转化顺序和采样时间
    ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_55Cycles5);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_55Cycles5);
    //开启adc的DMA
    ADC_DMACmd(ADC1,ENABLE);
    //使能ADC1
    ADC_Cmd(ADC1, ENABLE);
    /* Enable ADC1 reset calibaration register */   
    ADC_ResetCalibration(ADC1);    //重新校准
    /* Check the end of ADC1 reset calibration register */
    while(ADC_GetResetCalibrationStatus(ADC1));  //等待重新校准完成
    /* Start ADC1 calibaration */
    ADC_StartCalibration(ADC1);   //开始校准
    /* Check the end of ADC1 calibration */
    while(ADC_GetCalibrationStatus(ADC1));     //等待校准完成


}
/** @para none
  * @ret  none
  * @brief 配置dma
  */
void adc_dma_init()
{
    DMA_InitTypeDef dma;
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
    
    DMA_DeInit(DMA1_Channel1);
    dma.DMA_PeripheralBaseAddr  = (u32)&(ADC1->DR);     //DMA对应的外设基地址
    dma.DMA_MemoryBaseAddr      = (u32)&ad_value;       //内存存储基地址
    dma.DMA_DIR                 = DMA_DIR_PeripheralSRC;//DMA的转换模式为SRC模式,由外设搬移到内存
    dma.DMA_M2M                 = DMA_M2M_Disable;      //M2M模式禁用
    dma.DMA_PeripheralDataSize  = DMA_PeripheralDataSize_HalfWord;//定义外设数据宽度为16位
    dma.DMA_MemoryDataSize      = DMA_MemoryDataSize_HalfWord;  //DMA搬移数据尺寸,HalfWord就是为16位    
    dma.DMA_BufferSize          = CH_NUM;                       //DMA缓存大小CH_NUM个
    dma.DMA_MemoryInc           = DMA_MemoryInc_Enable;         //接收一次数据后,目标内存地址后移
    dma.DMA_PeripheralInc       = DMA_PeripheralInc_Disable;    //接收一次数据后,设备地址禁止后移
    dma.DMA_Mode                = DMA_Mode_Circular;            //转换模式,循环缓存模式。
    dma.DMA_Priority            = DMA_Priority_High;            //DMA优先级高
    DMA_Init(DMA1_Channel1,&dma); 
}
/** @para none
  * @ret  none
  * @brief 完成adc配置
  */
void adc_config(void)
{
    adc_gpio_init();
    adc_dma_init();
    adc_init();
}
/** @para none
  * @ret  none
  * @brief 启动adc,开始转换
  */
void adc_start(void)
{
    /* Start ADC1 Software Conversion */ 
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);    //连续转换开始,ADC通过DMA方式不断的更新RAM区。 
    DMA_Cmd(DMA1_Channel1,ENABLE);    
}


/** @para ADC_Channel --- (ADC_Channel0 ~ ADC_Channel17)
  * @ret  ADC_Channel_x 的ADC值
  */
uint16_t get_ChannelVale(uint8_t ADC_Channel)
{
    uint16_t ret = 0;
    switch(ADC_Channel)
    {
        case ADC_Channel_0:
            ret = ad_value[0];
            break;
        case ADC_Channel_1:
            ret = ad_value[1];
            break;
        case ADC_Channel_2:
            ret = ad_value[2];
            break;
    }
    return ret;
}


关键字:stm32  adc  多通道  数据采集 引用地址:stm32adc多通道数据采集

上一篇:STM32+ULN2003驱动步进电机
下一篇:STM32之外部中断 EXTI

推荐阅读最新更新时间:2024-11-11 18:31

STM32的计数器的使用
因为用stm32f103c8作主控制器,来控制小车,小车的转速由两路光电编码盘输入(左右各一路).因此想到外部时钟触发模式(TIM——ETRClockMode2Config)。 可以试好好久,发现TIM1不能计数,到网上查了很久,也没有找到相关的文章,开始怀疑TIM1是不是需要特殊设置。经过很久的纠结,终于找到了问题——其实是我自己在GPIO设置的时候,后面的不小心覆盖了前面的了——没想到自己也会犯这么SB的事情。 现总结程序如下: 第一步,设置GPIO GPIO_InitTypeDefGPIO_InitStructure; /*PA0,PA12- 左右脉冲输入 */ GPIO_InitStructure.GPIO_Pin
[单片机]
s3c2410_adc中断方式实现
/* * HLG442-S3C2410-ADC_DRV * /26/03/2008 AUTHOR machuanlong */ #include linux/config.h #include linux/module.h #include linux/kernel.h #include linux/init.h #include linux/sched.h #include linux/delay.h #include asm/hardware.h #include asm/semaphore.h #include asm/uaccess.h #include linux/kernel.h /* pri
[单片机]
基于STM32的无线通信模块设计
随着网络和现代通信技术的不断发展,远程无线通信技术经过多年的研究与实际应用,现如今在工业控制领域有了非常重要的地位,并且发挥着越来越大的作用。文中根据厂家的要求,设计的无线通信模块,主要实现了短信与数据收发功能,并且做到了模块的稳定,掉线之后能够自动重连。 1 无线通信模块整体设计方案 模块主要有电源部分、主控部分、通信部分、数据传输部分4个部分组成。通信模块采用SIM900A进行无线通信。主控模块采用STM32作为主控芯片,来控制短信的收发与数据传输的顺利进行。远程终端可以是手机或者上位机的数据中心软件,经过处理之后,储存下来,方便日后的查询。本模块具有低功耗,方便灵活,操作简单并且稳定,掉线之后可以自动连接,运行过程十分稳定,
[单片机]
基于<font color='red'>STM32</font>的无线通信模块设计
STM32_ADC时钟
STM32F103xx系列称为增强型产品,增强型产品的最高时钟频率可以达到72MHz。增强型产品的英文名称为Performance Line。 STM32F101xx系列称为基本型产品,基本型产品的最高时钟频率可以达到36MHz。基本型产品的英文名称为Access Line。 根据设计,当ADC模块的频率为14MHz时,可以达到ADC的最快采样转换速度。 要得到14MHz的ADC频率,就要求SYSCLK的频率是14MHz的倍数,即14MHz、28MHz、42MHz、56MHz、70MHz、84MHz等;对于基本型产品14MHz和28MHz处于它的最大允许频率范围内;对于增强型产品,14MHz、28MHz、42MHz、56MHz和
[单片机]
关于STM32中断库函数写法
在STM32中中断的使用非常的频繁,其中EXTI 线 0~15:对应外部 IO 口的输入中断。 STM32F4 的 IO 口外部中断函数只有 7 个,分别为: EXPORT EXTI0_IRQHandler EXPORT EXTI1_IRQHandler EXPORT EXTI2_IRQHandler EXPORT EXTI3_IRQHandler EXPORT EXTI4_IRQHandler EXPORT EXTI9_5_IRQHandler EXPORT EXTI15_10_IRQHandler 中断线 0-4 每个中断线对应一个中断函数,中断线 5-9 共用中断函数 EXTI9_5_IRQHandler,中 断线 10
[单片机]
STM32CubeMX----杂记
(1)在使用FSMC作为LCD接口时,同时ENABLE了FreeRTOS,发现生成的工程文件,编译之后会出问题。 研究后发现问题出在“FreeRTOSConfig.h”这段代码: /* Cortex-M specific definitions. */ #ifdef __NVIC_PRIO_BITS /* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */ #define configPRIO_BITS __NVIC_PRIO_BITS #else #define configPRIO_BITS 4 #
[单片机]
STM32CubeMX Hal库的一些坑
使用的是stm32f103 V1.40版本的库 UART DMA发送的问题 发送函数 HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); 发送完毕之后成功的回调函数也正常,可是再次发送的时候就发不出去了。一直返回错误。 我们看下这个函数的代码 HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) { uint32_t *tmp;
[单片机]
怎样采用多种单端信号驱动低功率、1Msps、±2.5V 差分输入、16 位 ADC
匹配传感器输出和 ADC 输入范围可能很难,尤其是要面对当今传感器所产生的多种输出电压摆幅时。本文为不同变化范围的差分、单端、单极性和双极性信号提供简便但高性能的 ADC 输入驱动器解决方案,本文的所有电路採用了 LTC2383-16 ADC 单独工作或与 LT6350 ADC 驱动器一起工作来实现 92dB SNR。 LTC2383-16 是一款低噪声、低功率、1Msps、16 位 ADC,具备 ±2.5V 的全差分输入范围。LT6350 是一款轨至轨输入和输出的、低噪声、低功率单端至差分转换器/ADC 驱动器,具备快速稳定时间。运用 LT6350,0V 至 2.5V、0V 至 5V 和 ±10V 的单端输入范围可以很容易转
[电源管理]
怎样采用多种单端信号驱动低功率、1Msps、±2.5V 差分输入、16 位 <font color='red'>ADC</font>
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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