stm32ADC非DMA模式的多通道采集与注入通道的采集

发布者:快乐舞动最新更新时间:2018-05-13 来源: eefocus关键字:stm32  ADC  非DMA模式 手机看文章 扫描二维码
随时随地手机看文章

第一个为非DMA模式的多通道采集

void ADC_DMA_Config(void) 

{
ADC_InitTypeDef ADC_InitStructure;

RCC_HSICmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);  
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
ADC_DeInit(ADC1);
ADC_StructInit(&ADC_InitStructure);
ADC_InitStructure.ADC_Resolution = ADC_Resolution_8b; 
ADC_InitStructure.ADC_ScanConvMode = DISABLE;  //禁止扫描模式
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;  //连续转换
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; 
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; 
ADC_InitStructure.ADC_NbrOfConversion = 1;

ADC_Init(ADC1,&ADC_InitStructure);

/*没有采用中断和DMA方式,这样采样得到的数据很容易丢失,因为规则通道公用一个数据寄存器,因此需要在一个转换周期内读出数据,紧接着读取下一个通道的数据。*/

ADC_DelaySelectionConfig(ADC1, ADC_DelayLength_Freeze);//推迟到转换后的数据被读取

ADC_PowerDownCmd(ADC1, ADC_PowerDown_Idle_Delay, ENABLE);//在延迟和空闲阶段ADC是关闭的


/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);
/* Wait until the ADC1 is ready */
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_ADONS) == RESET)

}

}

uint16_t  GetADCValue(uint32_t CH_Data )//获取通道数据
{
    unsigned char  i;
    for(i=0; i<3; i++)
    {
        AD_Value[i] = 0xFF;
        switch (i)
        {
            case 0: ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_9Cycles); break;
            case 1: ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 1, ADC_SampleTime_9Cycles); break;
    default: ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 1, ADC_SampleTime_9Cycles); break;
        }
ADC_Cmd(ADC1, ENABLE);
       // ADC_TempSensorVrefintCmd(ENABLE);
        ADC_SoftwareStartConv(ADC1);
        while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET) 
        AD_Value[i] = ADC_GetConversionValue(ADC1);
        ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
        ADC_SoftwareStartConv(ADC1);
        ADC_Cmd(ADC1, DISABLE);
    }
return AD_Value[CH_Data];
}


第二个为dma多通道采样与注入采样

__IO uint16_t ADC_ConvertedValue[2];//内存缓存adc通道数据

void ADC1_Mode_Config(void)
{
DMA_InitTypeDef DMA_InitStructure;
ADC_InitTypeDef ADC_InitStructure;

/* DMA channel1 configuration */
DMA_DeInit(DMA1_Channel1);

DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;//ADC地址
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;//内存地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 2;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址固定
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //内存地址后移
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//半字
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1, &DMA_InitStructure);

/* Enable DMA channel1 */
DMA_Cmd(DMA1_Channel1, ENABLE);

/* ADC1 configuration */
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//独立ADC模式
ADC_InitStructure.ADC_ScanConvMode = ENABLE ; //开扫描模式
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//连续转换
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//软件触发
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; 
ADC_InitStructure.ADC_NbrOfChannel = 2;//转换通道数目
ADC_Init(ADC1, &ADC_InitStructure);


ADC_TempSensorVrefintCmd(ENABLE);
ADC_RegularChannelConfig(ADC1, ADC_Channel_TempSensor, 1, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_55Cycles5);


ADC_InjectedSequencerLengthConfig(ADC1, 1); //注入通道与其长度
  ADC_InjectedChannelConfig(ADC1,ADC_Channel_11,1,ADC_SampleTime_7Cycles5);
// ADC_SetInjectedOffset(ADC1, ADC_InjectedChannel_1, 1000);//设置偏置电压值

ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_None);

ADC_ExternalTrigConvCmd(ADC1, DISABLE); //禁止外部触发
ADC_ExternalTrigInjectedConvCmd(ADC1, DISABLE);
//ADC_AutoInjectedConvCmd(ADC1,ENABLE); //规则通道自动转换到注入通道
/* Enable ADC1 DMA */
ADC_DMACmd(ADC1, ENABLE);
/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);

ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}

由下面代码可以得到注入通道ad值

ADC_SoftwareStartInjectedConvCmd(ADC1, ENABLE);//启动adc注入通道
while(RESET ==ADC_GetFlagStatus(ADC1,ADC_FLAG_JEOC));//等待转换完成
value=ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_1);//得到第一组的值

终于把ADC的非DMA的多通道采集完成,也是参考的网上的例子,学会了很多。其中要根据自己需求注意ADC是扫描模式,ADC是单次转换还是连续转换,还有ADC的模式也要注意。觉得ADC很博大精深,自己还得好好研究一番。


关键字:stm32  ADC  非DMA模式 引用地址:stm32ADC非DMA模式的多通道采集与注入通道的采集

上一篇: 经典STM32 ADC多通道转换
下一篇:stm32的多通道ADC和DMA的设置问题

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

CC1101接口与STM32
【目的】 移植原来TI对于CC1101与MSP430接口库到STM32平台,参考原TI库应用笔记 MSP430 Interface to CC1100/2500 Code Library ,做到尽量保持所有函数名不改变,以方便以前基于MSP430的程序向STM32移植。 【要求】 1.编程要求:改写原来基于MSP430的程序,使用于STM32,尽量保持所有函数名不改变,以方便以前基于MSP430的程序向STM32移植。 2.实现功能:STM32与CC1101通过SPI接口正常传输数据,不同节点的CC1101可以正常传输数据。 3.实验现象:STM32与CC1101连接后,可以与另一个节点通信
[单片机]
CC1101接口与<font color='red'>STM32</font>
stm32专题一:GPIO输出—点亮LED
新建led文件夹和bsp_led.c和bsp_led.h的板级支持包。 在bsp_led.c中,函数LED_GPIO_Config(void)提供了gpio的初始化过程: 定义GPIO初始化结构体; 开启RCC时钟,这一步非常重要,要找到对应的总线和外设时钟; 给初始化结构体成员赋值,由于和硬件相关,都在bsp_led.h中定义成宏,提高可移植性。 bsp_led.c // bsp: board support package 板级支持包 #include bsp_led.h void LED_GPIO_Config(void) { // 定义GPIO初始化结构体 GPIO_InitTypeDef G
[单片机]
<font color='red'>stm32</font>专题一:GPIO输出—点亮LED
低噪声差分ADC缓冲器驱动300MHz信号
  凌力尔特公司 (Linear Technology Corporation) 推出宽带单位增益 2GHz 差分缓冲器 LTC6416,旨在应对驱动高分辨率 ADC的挑战。LTC6416 在高频时提供卓越的噪声指数和低失真的性能。凭借其可编程输出电压箝位,LTC6416 限制了施加至 ADC 输入端的最大电压值,从而确保不存在 ADC 过驱动恢复问题。   LTC6416 在高频时具有低的 1.8nV/√Hz 输出参考的噪声,就较高分辨率 ADC 而言不会降低输入信号质量。这个缓冲器可以与一个在其输入端的变压器一起使用,以在高带宽应用中实现附加的低噪声系统增益。该缓冲器的输入和输出可以 AC 或 DC 耦合。LTC6416
[模拟电子]
STM32简单数据传输方法与通信协议(适合串口和一般总线)
引言 在一般的项目开发过程中,往往需要两块或以上单片机进行通信完成数据传输,例如四旋翼无人机在飞行过程中无线传输数据回到地面站,治疗仪器需要实时将患者和机器运转情况传回上位机平台,粮仓温控装置需将各种传感器通过RS485总线或者CAN总线的方式达到数据传输的目的等等,这些数据传输往往需要合适稳定的总线和灵活的通信协议,我发现无论什么数据传输,原理大同小异,这里简单以stm32的几种数据传输总结下平时项目中用的一些传输方法。 通信协议 简单情况(如一对一) 首先在数据传输前一定要想好通信协议,如果传输的数据和过程非常简单,那么就可以采用简单的传输协议,例如: 直接上代码: int temp; u8 RS485_rec
[单片机]
这些单片机按键设计方案,请拿好,不谢!
在单片机系统里,按键是常见的输入设备,在本文中介绍几种按键硬件、软件设计方面的技巧。一般的在按键的设计上,一般有四种方案。 一是GPIO口直接检测单个按键,如图1.1所示; 二是按键较多则使用矩阵键盘,如图1.2所示; 三是将按键接到外部中断引脚上,利用按键按下产生的边沿信号进行按键检测,如图1.3所示; 四是利用单片机的ADC,在不同的按键按下后,能够使得ADC接口上的电压不同,根据电压的不同,则可以识别按键,如图1.4所示。 图1.1方案一 图1.2方案二 图1.3方案三 图1.4方案四 在以上四种设计上,各有优点和不足。 第一种是最简单和最基础的,对于单片机初学者很
[单片机]
这些单片机按键设计方案,请拿好,不谢!
利用ADC对工业多通道数据采集系统进行信号调理
本应用笔记旨在帮助设计人员在高性能、多通道数据采集系统(DAS)设计中优化工业传感器与高性能ADC之间的连接电路。以电网监测系统为例,本文说明了使用MAX11040 Σ-Δ ADC的优势以及如何选择适当的架构和外围器件,优化系统性能。 引言 许多高端工业应用中,高性能数据采集系统(DAS)与各种传感器之间需要提供适当的接口电路。如果信号接口要求提供多通道、高精度的幅度和相位信息,这些工业应用可以充分利用MAX11040等ADC的高动态范围、同时采样以及多通道优势。本文介绍了MAX11040的Σ-Δ架构,以及如何合理选择设计架构和外部元件,以获得最佳的系统性能。 高速、Σ-Δ架构的优势 图1所示为高
[模拟电子]
STM32入门学习之USART(STM32F030F4P6基于CooCox IDE)
#include stm32f0xx.h #include stm32_lib/inc/stm32f0xx_rcc.h #include stm32_lib/inc/stm32f0xx_gpio.h #include stm32_lib/inc/stm32f0xx_usart.h int main(void) { //1、使能时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //特别注意:因为串口有使用GPIO,所以对应GPIO的时钟也要使能 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
[单片机]
客户案例 | 多通道数模转换器ADC动静态参数测试解决方案
模数转换器,即Analog-to-Digital Converter,常称ADC,是指将连续变量的模拟信号转换为离散的数字信号的器件。大部分现实世界的电信号是模拟信号,ADC构建了模拟世界数字世界的联系。本文就模数转换器ADC的分类、技术点、测试方案等方面,为您提供相关技术说明及解决方案。 模数转换原理 模数转换器 Analog-to-Digital Converter ADC的原理:通过采样、量化以及编码电路,将输入的连续模拟信号变换成离散的数字信号。采样将信号在时间上离散化,量化将信号在幅度上离散化。 ▲ 模数转换器原理示意图 ADC芯片追求的主要指标有采样率和垂直分
[测试测量]
客户案例 | 多通道数模转换器<font color='red'>ADC</font>动静态参数测试解决方案
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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