STM32 ADC基础与多通道采样

发布者:心满意足最新更新时间:2017-06-04 来源: eefocus关键字:STM32  ADC  多通道采样 手机看文章 扫描二维码
随时随地手机看文章

12位ADC是一种逐次逼近型模拟数字数字转换器。它有多达18个通道,可测量16个外部和2个内部信号源。ADC的输入时钟不得超过14MHZ,它是由PCLK2经分频产生。如果被ADC转换的模拟电压低于低阀值或高于高阀值,AWD模拟看门狗状态位被设置。

ADC通常要与DMA一起使用 这里只是简单的用库配置ADC 不断扫描来实现ADC的应用。

配置DMA:

复制代码

void DMA_Config(void) {     DMA_InitTypeDef DMA_InitStructure;//定义DMA初始化结构体     DMA_DeInit(DMA_Channel1);//复位DMA通道1     DMA_InitStructure.DMA_PeripheralBaseAddr =     ADC1_DR_Address; //定义 DMA通道外设基地址=ADC1_DR_Address     DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue; //定义DMA通道存储器地址     DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//指定外设为源地址     DMA_InitStructure.DMA_BufferSize = 1;//定义DMA缓冲区大小1     DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//当前外设寄存器地址不变     DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;//当前存储器地址不变     DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//定义外设数据宽度16位     DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //定义存储器数据宽度16位    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//DMA通道操作模式位环形缓冲模式    DMA_InitStructure.DMA_Priority = DMA_Priority_High;//DMA通道优先级高    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//禁止DMA通道存储器到存储器传输    DMA_Init(DMA_Channel1, &DMA_InitStructure);//初始化DMA通道1    DMA_Cmd(DMA_Channel1, ENABLE); //使能DMA通道1 }

复制代码

 

配置ADC的运行:

复制代码

void ADC_Config(void) {   ADC_InitTypeDef ADC_InitStructure;//定义ADC初始化结构体变量   ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//ADC1和ADC2工作在独立模式   ADC_InitStructure.ADC_ScanConvMode = ENABLE; //使能扫描   ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//ADC转换工作在连续模式   ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//有软件控制转换   ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//转换数据右对齐   ADC_InitStructure.ADC_NbrOfChannel = 1;//转换通道为通道1   ADC_Init(ADC1, &ADC_InitStructure); //初始化ADC   ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_28Cycles5); //ADC1选择信道14,音序器等级1,采样时间239.5个周期   ADC_DMACmd(ADC1, ENABLE);//使能ADC1模块DMA   ADC_Cmd(ADC1, ENABLE);//使能ADC1   ADC_ResetCalibration(ADC1); //重置ADC1校准寄存器   while(ADC_GetResetCalibrationStatus(ADC1));//等待ADC1校准重置完成   ADC_StartCalibration(ADC1);//开始ADC1校准   while(ADC_GetCalibrationStatus(ADC1));//等待ADC1校准完成   ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能ADC1软件开始转换 }

复制代码

(1)   第一个参数是ADC_Mode,这里设置为独立模式:

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;

在这个模式下,双ADC不能同步,每个ADC接口独立工作。所以如果不需要ADC同步或者只是用了一个ADC的时候,就应该设成独立模式了。

(2)   第二个参数是ADC_ScanConvMode,这里设置为DISABLE。

ADC_InitStructure.ADC_ScanConvMode = DISABLE;

如果只是用了一个通道的话,DISABLE就可以了,如果使用了多个通道的话,则必须将其设置为ENABLE。

(3)   第三个参数是ADC_ContinuousConvMode,这里设置为ENABLE,即连续转换。如果设置为DISABLE,则是单次转换。两者的区别在于连续转换直到所有的数据转换完成后才停止转换,而单次转换则只转换一次数据就停止,要再次触发转换才可以。所以如果需要一次性采集1024个数据或者更多,则采用连续转换。

(4)   第四个参数是ADC_ExternalTrigConv,即选择外部触发模式。这里只讲三种:

1、第一种是最简单的软件触发,参数为ADC_ExternalTrigConv_None。设置好后还要记得调用库函数:

ADC_SoftwareStartConvCmd(ADC1, ENABLE);

这样触发才会启动。

2、第二种是定时器通道输出触发。共有这几种:ADC_ExternalTrigConv_T1_CC1、ADC_ExternalTrigConv_T1_CC2、ADC_ExternalTrigConv_T2_CC2、

ADC_ExternalTrigConv_T3_T以及ADC_ExternalTrigConv_T4_CC4。定时器输出触发比较麻烦,还需要设置相应的定时器。以

ADC_ExternalTrigConv_T2_CC2触发为例设置相应的定时器:

复制代码

void TIM2_Configuration(void){     TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;     TIM_OCInitTypeDef  TIM_OCInitStructure;     TIM_TimeBaseStructure.TIM_Prescaler = 4;     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;     TIM_TimeBaseStructure.TIM_Period = 0XFF;     TIM_TimeBaseStructure.TIM_ClockDivision = 0;     TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;     TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;     TIM_OCInitStructure.TIM_Pulse = 0X7F;     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;     TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;             TIM_OC2Init(TIM2, &TIM_OCInitStructure);     TIM_Cmd(TIM2, ENABLE);     TIM_CtrlPWMOutputs(TIM2, ENABLE); }

复制代码

这样设置之后就可以用定时器2的输出触发了,至于触发的周期,设置TIM2的时间即可。这里不再赘述。

3、第三种是外部引脚触发,对于规则通道,选择EXTI线11和TIM8_TRGO作为外部触发事件;而注入通道组则选择EXTI线15和TIM8_CC4作为外部触发事件。

(5)   第五个参数是ADC_DataAlign,这里设置为ADC_DataAlign_Right右对齐方式。建议采用右对齐方式,因为这样处理数据会比较方便。当然如果要从高位开始传输数据,那么采用左对齐优势就明显了。

(6)   第六个参数是ADC_NbrOfChannel,顾名思义:通道的数量。要是到多个通道采集数据的话就得设置一下这个参数。此外在规则通道组的配置函数中也许将各个通道的顺序定义一下,如:

 ADC_RegularChannelConfig(ADC1,ADC_Channel_13,1,ADC_SampleTime_13Cycles5);  ADC_RegularChannelConfig(ADC1,ADC_Channel_14,2,ADC_SampleTime_13Cycles5);

       多通道数据传输时有一点还要注意:若一个数组为ADC_ValueTab[4],且设置了两个通道:通道1和通道2,则转换结束后,ADC_ValueTab[0]和ADC_ValueTab[2]存储的是通道1的数据,而ADC_ValueTab[1]和ADC_ValueTab[3]存储的是通道2的数据。如果数组容量大则依次类推。

       补充一点:在使用DMA传输数据的时候,需要设置外设地址和存储器地址,外设地址当然就是ADC的地址了,而存储器的地址如果使用8位数据的话,存储器必须定义为8位缓冲区;如果使用16位数据格式的话,存储器则为16位缓冲器,不可定义为32位或更多,否则,数据将出错。


关键字:STM32  ADC  多通道采样 引用地址:STM32 ADC基础与多通道采样

上一篇:STM32F10xxx 之 System tick Timer(SYSTICK Timer)
下一篇:STM32之光敏电阻传感器模块的使用

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

基于STM32LED书写点阵屏设计与实现
  近年来,随着信息产业的高速发展,点阵LED 显示屏已广泛应用于金融行业、邮电行业、体育馆、广告业等各种广告发布和信息显示系统,成为信息传送的重要手段。本文介绍的LED 书写点阵屏,不但可以像普通显示屏一样作为信息输出设备,而且可以通过光笔直接在LED 显示屏上进行信息输入,普通的显示屏也具有"手写"的功能了。    1 硬件系统设计   本系统总体框图如图1 所示,由键盘与显示模块、光笔模块、LED 点阵屏模块、STM32 控制模块、电源模块五部分组成。 图1 总体方案方框图    1. 1 核心控制模块   本系统以STM32F103VCT6 为控制核心。   STM32 是32 位微处理器,
[电源管理]
基于STM32LED书写点阵屏设计与实现
STM32_DAC输出三角波形
今天的软件工程下载地址(360云盘): https://yunpan.cn/cPi8GB2DyeKzI 访问密码 1a45 STM32F10x的资料可以在我360云盘下载: https://yunpan.cn/crBUdUGdYKam2 访问密码 ca90 工程概要说明:该工程通过配置,输出固定三角波形,频率和幅度也是固定的,当然也是可以变化,如果有朋友需要可以微信公众号中留言。 关于“STM32F103 DAC输出三角波形” 我把重要的几点在下面分别讲述,若不明白,请关注微信公众号“EmbeddDeveloper”查阅或留言。 一、RCC时钟配置 该函数位于在bsp.c文件下面; 使能RCC时钟:RC
[单片机]
STM32_DAC输出三角波形
stm32 RAM分配及占有
一个小的项目,在测试时间和产品量稍微大一些之后,出现了一些莫名其妙的非逻辑错误的Bug(最头疼的是不能每次都能复制出来)。经过修改后,最近一个月的测试都没有出现。本人在这里得到了原子哥和其他朋友的很多帮助,也把自己的一些经验分享给各位,也欢迎大家指正。 1. 程序偶尔会出现一些Bug,经过output串口信息发现一些堆栈的临时变量被莫名其妙的修改。 stm32103rbt6的内存是20K,算比较小了,看到程序出错的那个函数申请了很多零时变量,也需要访问很多全局变量。猜想是内存被其他操作更改所致。 解决ram被使用过多的一个方法是尽量少用全局变量,能用const就用一定用const变量,因为这样会放在flash,而不是ram. 我的
[单片机]
意法半导体STM32十周年:出货超过24亿,已构建起强大生态
集微网 4月25日报道 俗话说“十年磨一剑”,而从2007年起意法半导体(ST)推出第一颗STM32以来至今恰好十年,该系列产品不仅出货量超过20亿颗,而且还构建起了庞大、强壮的产业生态链。 4月25日,ST在深圳专门召开了“STM32中国峰会”。据悉,这是继2016年在深圳举行的首届STM32中国峰会取得了成功后第二次举办。本次峰会以“专注生态合作,整合技术创新”为主题,特别聚焦智能硬件、智慧城市和智能工业等热点领域。现场除了ST展示十年来STM32 的发展成果外,还邀请了众多合作伙伴分享与ST的合作经验。 会议具体安排上,4月25日为意法半导体高层主旨演讲及STM32生态系统伙伴针对智能硬件、智慧城市和智能工业的分论坛
[手机便携]
STM32】TIM---基本定时器
一、TIM 简介 定时器最基本功能:定时 定时发送 USART 数据 定时采集 AD 数据等 定时器与 GPIO 结合 测量输入信号脉冲宽度 产生输出波形 等 ▲ 各个定时器的特性 二、基本定时器 基本定时器 :TIM6 和 TIM7 ,基本功能完全一样,但所占资源彼此完全独立。 ▲ 基本定时器的功能框图 基本定时器时钟只能来自内部时钟 基本定时器的内部时钟(CK_INT)频率为 84MHz 基 本定时器还专门用于 DAC 转换触发 只要设置 CK_PSC 和 TIMx_ARR 这两个寄存器的值就可以控制事件生成的时间 三、定时器周期计算 T o u t ToutTout:溢出时间,即定时多长时间
[单片机]
【<font color='red'>STM32</font>】TIM---基本定时器
STM32串口IAP
让STM32的应用程序能够通过串口在线升级,这就是STM32的串口IAP。要实现串口升级,简单来说,就是给STM32编写一个bootloader引导程序,就想计算机的BIOS一样,在这段代码中接收串口的数据,然后将数据固化到STM32内部指定的flash地址空间中,接着再跑到这段代码执行。 接触过Linux uboot的应该会注意到,除了功能的实现外,bootloader的界面设计也非常重要。通过串口在计算机的串口软件中实现一个简洁的界面,列出bootloader的各项功能,并支持用户选择。实现这样一个人际交互的界面也是一个优秀的bootloader必不可少的一部分。 本文就要讲讲如何设计这个有功能有界面的bootloader程
[单片机]
<font color='red'>STM32</font>串口IAP
STM32 串口通讯 发送 接收
STM32的使用有利有弊,种类多---但是种类有太多,资料也是比较乱的,还有就是库的调用,经常忘记一些函数的使用------比如最常用的串口------ ------------------------------------------------------------------------------USART ----设置------------------------------- void USART1_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC
[单片机]
详解STM32定时器捕获功能
一、STM32定时器捕获功能 STM32的定时器是支持信号输入捕获的,何为输入捕获?主要做什么应用? 输入捕获:通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变的时候,将当前的定时器的值(TIMx_CNT)存放到对应的捕获比较寄存器里面,完成一次捕获。输入捕获主要应用于测量信号的脉宽或频率。 下图是定时器原理图的输入捕获框图部分 第一部分是设置滤波器,用来对信号进行滤波,信号从TI1输入,通过滤波器,输出TIF信号,正常情况下信号没有抖动,TI1F信号等于TI1的输入信号。 ICF 用来设置输入采样频率的数字滤波器的长度,如ICF=0011,会在捕获上升沿时,以fCK_INT的频率连续采样八次通道1的信号电平,
[单片机]
详解<font color='red'>STM32</font>定时器捕获功能
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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