stm32 ADC的规则通道和注入通道混合使用

发布者:huanli最新更新时间:2016-07-27 来源: eefocus关键字:stm32  ADC  规则通道  注入通道  混合使用 手机看文章 扫描二维码
随时随地手机看文章
之前完成了规则通道DMA的数据传输了,不过平时在使用ADC的时候可能就会遇到很多情况,不可能就这样简单的按规则通道来采样,DMA存储,使用数据的;可能有时候会需要立刻采样,那样我们就需要利用到注入通道了。文档关于注入通道的解释:
1      利用外部触发或通过设置ADC_CR2寄存器的ADON位,启动一组规则通道的转换。 
2      如果在规则通道转换期间产生一外部注入触发,当前转换被复位,注入通道序列被以单次扫描方式进行转换。 
3      然后,恢复上次被中断的规则组通道转换。如果在注入转换期间产生一规则事件,注入转换不会被中断,但是规则序列将在注入序列结束后被执行。
  将变阻器的那路ADC设置为注入通道:
1  ADC_InjectedSequencerLengthConfig(ADC1, 1);\\设置注入通道长度
2  ADC_InjectedChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_7Cycles5);\\配置注入通道
3  ADC_SoftwareStartInjectedConvCmd(ADC1, ENABLE);\\开始注入通道数据采样和转换
   开始之后,延迟足够的时间,让ADC采样和转换完成。
     用ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_1);读取注入通道1的数据,结果发现数据一直不变,那肯定是哪里设置出错了,找了下别人的设置,并做了一些尝试,发现了原来是设置的问题,注入采样的触发方式没有设置:
ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_None);
     这个函数设置注入方式使用软件触发方式,设置完之后用开始采样和读取数据函数,就能采到正确的数据。
 
     上面的例子使用触发注入完成的,下面又尝试了自动注入。这样每次进行规则通道采样时,也会顺便把注入通道也进行采样了,而启动注入通道采样则不会对规则通道进行采样。
如果设置了 JAUTO 位,在规则组通道之后,注入组通道被自动转换。这可以用来转换在 ADC_SQRx 和 ADC_JSQR 寄存器中设置的多至 20 个转换序列。
     
     还有在规则通道使用DMA数据传输,且使用注入通道采样时,不知道会不会对数据有影响?
    查了下文档,只有在规则通道的转换结束时才产生 DMA 请求,并将转换的数据从 ADC_DR 寄存器传输到用户指定的目的地址,还有注入方式转换后数据存储到 ADC_DRJx寄存器和规则方式转换后数据存储在ADC_DR寄存器中。
  在注入通道和规则通道的混合使用中,我花了不少时间去找正确的设置,问题是不知道哪些库函数是必要的,哪些是非必要的,后来对着例子尝试之后才知道。后面我还想了解下具体的寄存器设置,看了几个初始化的函数,发现其实很多设置都是对ADC_CR1的设置,有不少不明白的看了寄存器就知道了,看来函数的使用还是要和寄存器对应的位结合起来,这样才能理解的透彻点。
  下面是我整个代码的设置,其他设置和上篇例子一样,只改了ADC设置:

 

[cpp] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. static void Protect_AdcInit(void)  
  2. {  
  3.     ADC_InitTypeDef ADC_InitStructure;  
  4.       
  5.     ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;  
  6.     ADC_InitStructure.ADC_ScanConvMode = ENABLE;  
  7.     ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;  
  8.     ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//软件触发  
  9.     ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;  
  10.     ADC_InitStructure.ADC_NbrOfChannel = 2;//规则通道的数量  
  11.     ADC_Init(ADC1, &ADC_InitStructure);//这个大部分是初始化规则通道的  
  12.       
  13.     ADC_TempSensorVrefintCmd(ENABLE);  
  14.     ADC_RegularChannelConfig(ADC1,ADC_Channel_TempSensor,1,ADC_SampleTime_239Cycles5);  
  15.     ADC_RegularChannelConfig(ADC1,ADC_Channel_Vrefint,2,ADC_SampleTime_239Cycles5);  
  16.       
  17.     ADC_InjectedSequencerLengthConfig(ADC1, 1);  
  18.      ADC_InjectedChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_7Cycles5);  
  19.     ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_None);//设置规则通道软件触发  
  20.     /* Enable automatic injected conversion start after regular one */  
  21.   //  ADC_AutoInjectedConvCmd(ADC1, ENABLE);  
  22.   
  23.       
  24.     ADC_DMACmd(ADC1, ENABLE);  
  25.     /* Enable ADC1 external trigger */  
  26.     ADC_ExternalTrigConvCmd(ADC1, DISABLE);  
  27.     ADC_ExternalTrigInjectedConvCmd(ADC1, DISABLE);  
  28.   
  29.     ADC_Cmd(ADC1, ENABLE);  
  30.   
  31.     ADC_ResetCalibration(ADC1);  
  32.   
  33.     while(ADC_GetResetCalibrationStatus(ADC1));  
  34.   
  35.     ADC_StartCalibration(ADC1);  
  36.   
  37.     while(ADC_GetCalibrationStatus(ADC1));  
  38.   
  39. }  

======================没完,继续=================

 

读取数据在这里:

/* 注入转换中断 */
void ADC1_2_IRQHandler(void)
{
s32 inj_v1,inj_v2,inj_v3,inj_v4;


if(ADC_GetITStatus(ADC1,ADC_IT_JEOC) == SET){
ADC_ClearITPendingBit(ADC1,ADC_IT_JEOC);
inj_v1 = ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_1);
inj_v1 += ADC_GetInjectedConversionValue(ADC2,ADC_InjectedChannel_4);
inj_v1 >>= 1;


inj_v2 = ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_2);
inj_v2 += ADC_GetInjectedConversionValue(ADC2,ADC_InjectedChannel_3);
inj_v2 >>= 1;


inj_v3 = ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_3);
inj_v3 += ADC_GetInjectedConversionValue(ADC2,ADC_InjectedChannel_2);
inj_v3 >>= 1;


inj_v4 = ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_4);
inj_v4 += ADC_GetInjectedConversionValue(ADC2,ADC_InjectedChannel_1);
inj_v4 >>= 1;
}
}


/* 规则转换中断 */
void DMA1_Channel1_IRQHandler(void)
{
if(DMA_GetFlagStatus(DMA1_FLAG_TC1) == SET){
DMA_ClearFlag(DMA1_FLAG_TC1);
DMA_ClearITPendingBit(DMA1_IT_GL1);
ADC_SoftwareStartConvCmd(ADC1,DISABLE);
DMA_Cmd(DMA1_Channel1,DISABLE);


/* ¼ÆËãת»»Öµ */
regular_convert_calc();


/* Æô¶¯ÏÂÒ»´Î´«Êä */
DMA1_Channel1->CNDTR = NUM_OF_REG_CHANNEL;
DMA_Cmd(DMA1_Channel1,ENABLE);
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
}
}

还有这篇说的也不错: 用TIM1产生6路ADC,用CCR4触发ADC1的注入通道采样

关键字:stm32  ADC  规则通道  注入通道  混合使用 引用地址:stm32 ADC的规则通道和注入通道混合使用

上一篇:stm32 双adc 采集问题 dma数据有一个没有 adc2为0
下一篇:STM32+Keil 如何使用printf函数?

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

STM32串口通信配置(USART1+USART2+USART3+UART4)
一、串口一的配置(初始化+中断配置+中断接收函数) 1 /*=============================================================================== 2 Copyright: 3 Version: 4 Author: 5 Date: 2017/11/3 6 Description: 7 配置独立看门狗初始化函数,在主函数中运行IWDG_ReloadCounter进行喂狗主函数必须在4s内进行一次喂狗不然系统会复位; 8 函数功能是将接收固定长度的字符串,并将接收后的字符串通过串口发送出去 9 revise Descriptio
[单片机]
stm32.cube(一)——系统架构及目录结构
一、前言 Arm的应用场景往往比51单片机复杂得多,如果一个高级应用的开发需要连底层的结构性代码都要重构,那么在成本和研发周期上就会面临巨大的风险。为了简化编码过程,芯片厂商经常会提供一些板卡级支持的BSP包,系统级支持的SDK包,或者芯片级支持的HAL层。对于stm32系列的芯片,意法半导体公司提供一个了cube包,它包含的内容很广泛(HAL,CMSIS,中间层,RTOS),灵活应用这个代码包将使开发过程更加高效。 stm.cube下载地址: http://www.stmcu.com.cn/design_resources.html 二、系统架构 系统架构图 基本上整个cube的代码架构可以分成三层。底层、中间层和上层
[单片机]
介绍如何通过意法的STM32 MCU实现用DMA完成多通道的AD采样功能
在嵌入式产品中有时候需要实现对外部的模拟量进行采样处理和记录,而这就需要使用到ADC功能,将外部的模拟量转换成数字量。而在复杂的嵌入式产品中,往往需要使用多路AD采样,例如在智能家居产品,电池电量检测,热敏温度传感器,烟雾传感器,气敏传感器等都是可以使用ADC来实现采样的。在本文章,将会介绍如何通过意法的STM32 MCU实现用DMA完成多通道的AD采样功能。 什么叫ADC ADC即模拟数字转换器(英语:Analog-to-digital converter)是用于将模拟形式的连续信号转换为数字形式的离散信号的一类设备。一个模拟数字转换器可以提供信号用于测量。与之相对的设备成为数字模拟转换器。 影响AD采样的因素有哪些 分
[单片机]
介绍如何通过意法的<font color='red'>STM32</font> MCU实现用DMA完成多<font color='red'>通道</font>的AD采样功能
STM32 串口采用DMA方式接收数据
环境: 主机:WINXP 开发环境:MDK4.23 MCU:STM32F103CBT6 说明: 串口可以配置成用DMA的方式接收数据,不过DMA需要定长才能产生接收中断,如何接收可变长度的数据呢? 方法有以下3种: 1.将RX脚与一路时钟外部引脚相连,当串口一帧发完,即可利用此定时器产生超时中断.这个实时性较高,可以做到1个字节实时监测. 2.不改变硬件,开启一个定时器监控DMA接收,如果超时则产生中断.这个实时性不高,因为超时时间必须要大于需要接收帧的时间,精度不好控制. 3.STM32单片机有的串口可以监测总线是否处于空闲,如果空闲则产生中断.可以用它来监测DMA接收是否完毕.这种方式实时性很高. 本文采用第3种方式.在波
[单片机]
<font color='red'>STM32</font> 串口采用DMA方式接收数据
STM32基本定时器TIM6和TIM7
1. STM32上定时器的分类 前面学习了STM32系统定时器SysTick,它的主要作用是为OS提供系统滴答,当然我们也可以利用它实现了精准延时。在STM32单片机中,除了属于CM3内核中的一个外设的系统定时器外,还有几个属于片上外设的定时器:基本定时器(TIM6和TIM7)、通用定时器(TIM2/3/4/5)和高级定时器(TIM1和TIM8)。强调,这里指的是除互联型的STM32F1系列单片机。 它们各自具有的功能特点可以详见《STM32中文参考手册_V10.pdf》-P298,这里简单描述: (1)基本定时器(TIM6和TIM7):16位的只能向上计数的定时器,只能实现定时,没有外部IO通道与它关联。
[单片机]
<font color='red'>STM32</font>基本定时器TIM6和TIM7
STM32进入睡眠模式下的GPIO配置参考
1. GPIO内部电路图 1.根据设备原理图查看IO外部引脚连接电路,闲置状态为低电平时,设置为下拉输入;闲置状态为高电平时,设置为上拉输入;闲置状态为悬空时设置为模拟输入;输出引脚根据功能需要设置就行 原因:当IO通过外围电路电阻接地被拉低时,如果设置为上拉输入,则在芯片内部的上拉电阻和外围的下拉电阻构成回路,电流损耗取决于这两个电阻;当IO通过外围电路电阻接电源被拉高时,则在芯片内部的下拉电阻和外围的上拉电阻构成回路,电流损耗也取决于这两个电阻;当悬空时,斯密特触发器是打开的,要判断输入的是高电平还是低电平,需要一点电流损耗,但是设备模拟输入,这个触发器是关闭的 --------------------- 假设你的这个GP
[单片机]
<font color='red'>STM32</font>进入睡眠模式下的GPIO配置参考
高速ADC的低抖动时钟设计
引言 ADC是现代数字解调器和软件无线电接收机中连接模拟信号处理部分和数字信号处理部分的桥梁,其性能在很大程度上决定了接收机的整体性能。在A/D转换过程中引入的噪声来源较多,主要包括热噪声、ADC电源的纹波、参考电平的纹波、采样时钟抖动引起的相位噪声以及量化错误引起的噪声等。除由量化错误引入的噪声不可避免外,可以采取许多措施以减小到达ADC前的噪声功率,如采用噪声性能较好的放大器、合理的电路布局、合理设计采样时钟产生电路、合理设计ADC的供电以及采用退耦电容等。本文主要讨论采样时钟抖动对ADC信噪比性能的影响以及低抖动采样时钟电路的设计。 (a)12位ADC理想信噪比 (b)AD9245实测信噪比 图
[模拟电子]
STM32基础知识:中断系统
中断系统 1 数据传输方式 无条件传输 :处理器不必了解外部设备状态,直接进行数据传输,用于指示灯和按键等简单设备.。 查询方式 :传输前,一方先查询另一方的状态,若已经准备好就传输,否则就继续查询。 中断方式 :一方通过申请中断的方式与另一方进行数据传输,收发双方可以并行工作。 直接存储器访问 :处理器内部建立片内外设和内存之间的数据传输通道,传输过程不需要处理器参与。 2 中断系统的基本概念 2.1 中断全过程 中断发生: 当CPU在处理某一事件A时,发生了另一事件B,请求CPU迅速去处理。 中断处理: CPU暂停当前的工作,转去处理事件B。 中断返回: 当CPU将事件B处理完毕后,再回到事件A中被暂停的地方继
[单片机]
<font color='red'>STM32</font>基础知识:中断系统
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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