原文地址::http://www.9mcu.com/9mcubbs/forum.php?mod=viewthread&tid=961171

相关网帖----http://d1.ourdev.cn/bbs_upload782111/files_37/ourdev_624088CA1C2E.pdf

在经过半个月的不懈努力下,终于将32的ADC多通道的信号采集完成,在网上能找到一些对于多通道信号采集的范例,要么就是用多个ADC,要么就是指贴出部分关键代码,也不对其中的配置及实现做一些细致的说明,这让人会走很多弯路,但也正是这样才能不断提升,才能认识自己的不足。好了,下面就先对STM的ADC做个简单的介绍;

ADC又称'模拟/数字转换器',在STM32单片机中模拟/数字转换器(ADC)是一种提供可选择多通道输入,逐次逼近型的模数转换器。分辨率为12位,在一般的信号采集应用中已经算是很高的分辨率了。

它有18个通道,可测量16个外部和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。

下面就是对ADC多通道采集是如何实现做详细说明:
        第一:先讲讲大家在调试这功能可能遇到的一些困惑,我也是这样过来的,不知道你们是不是这样.
        1、范例是用DMA的方式对所采集到的数据进行的读取,这是我首先困惑的,存储到哪个地方去了,为此我还专门看了DMA(直接记忆存取/直接内存存取)到底是什么东西;
        2、我们就认为采集的数据已经被DMA提取并存储了,怎么把这么多通道的数据分离!!! 真滴是伤神~~~
        把上面这两个主要的大问题解决了,那么就能将这个模块调通,并能在实际中得到应用。16路信号的采集还不是小小的应用哟~~~

下面上代码
//多通道转换函数
vu32 ADC_MultiChannelConvertedValue;
void ADC1_MultiChannel_Configuration(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        DMA_InitTypeDef DMA_InitStruct;
        ADC_InitTypeDef ADC_InitStruct;

//ADC input init PA0-7 AD0-7
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
        GPIO_InitStructure.GPIO_Pin = GPIO_PinSource0|GPIO_PinSource1|GPIO_PinSource2|GPIO_PinSource3|GPIO_PinSource4|GPIO_PinSource5|GPIO_PinSource6|GPIO_PinSource7;
        GPIO_Init(GPIOA,&GPIO_InitStructure);

//ADC input init PB0-1 AD8-9
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
        GPIO_InitStructure.GPIO_Pin = GPIO_PinSource0|GPIO_PinSource1;
        GPIO_Init(GPIOB,&GPIO_InitStructure);

//ADC input init Pc0-5 AD10-15
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
        GPIO_InitStructure.GPIO_Pin = GPIO_PinSource0|GPIO_PinSource1|GPIO_PinSource2|GPIO_PinSource3|GPIO_PinSource4|GPIO_PinSource5;
        GPIO_Init(GPIOC,&GPIO_InitStructure);
    
                
        DMA_DeInit(DMA1_Channel1);//开启DMA1的第一通道
        DMA_InitStruct.DMA_PeripheralBaseAddr = ADC1_DR_Address; //DMA对应的外设基地址
        DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
        DMA_InitStruct.DMA_MemoryBaseAddr = (unsigned long)&ADC_MultiChannelConvertedValue;        这就是单片机采集后存储的值的地址
        DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC;
        DMA_InitStruct.DMA_M2M = DMA_M2M_Disable;
        DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;//DMA_MemoryDataSize_HalfWord  DMA搬运的数据尺寸,注意ADC是12位的,HalfWord就是16位。这个地方只有用word方式才能对位转换搬移,具体原因不详wxm
        DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Disable;
        DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable; //接收一次数据后,目标内存地址是否后移--重要概念,用来采集多个数据的,多通道的时候需要使能它
        DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//接收一次数据后,设备地址是否后移
        DMA_InitStruct.DMA_Mode  = DMA_Mode_Circular;//转换模式,循环缓存模式,常用
        DMA_InitStruct.DMA_Priority = DMA_Priority_High;//DMA优先级,高
        DMA_InitStruct.DMA_BufferSize = 16;//DMA缓存大小,1*16个
        DMA_Init(DMA1_Channel1,&DMA_InitStruct);

ADC_InitStruct.ADC_Mode = ADC_Mode_Independent; //转换模式,为独立转换
        ADC_InitStruct.ADC_ScanConvMode = ENABLE; 
        ADC_InitStruct.ADC_ContinuousConvMode = ENABLE; //连续转换模式开启
        ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//ADC外部触发开关,关闭 
        ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right; //对齐方式,ADC结果是12位的,显然有个对齐左边还是右边的问题。一般是右对齐
        ADC_InitStruct.ADC_NbrOfChannel = 16; //开启通道数,16个
        ADC_Init(ADC1, &ADC_InitStruct);

/* 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));  
}
//多通道转换函数
u8 MultiChannel_AsciiBuff[5];
void Read_ADC1_MultiChannel(unsigned char u8_channNo)
{  
          unsigned short  ADC_data = 0;
        unsigned char i,id;
        ADC_SoftwareStartConvCmd(ADC1, DISABLE);
                
        for(i=16;i>0;i--)
        {        
                //ADC1,ADC 通道 x,规则采样顺序值为 1,采样时间为 7.5 周期,大于此周期除了通道 0 能识别外,其他不能识别
                ADC_RegularChannelConfig(ADC1, u8_channNo, 1, ADC_SampleTime_7Cycles5 );
                ADC_SoftwareStartConvCmd(ADC1, ENABLE);                         /* 软件启动 ADC1 */                
                do
                {
                        id = ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC);                         /* 读取转换标志 */
                }        while(!id);                                                                                 /* 等待,直到转换完成 */
                
                ADC_data += ADC_GetConversionValue(ADC1);                                这里将值读出,后面就是解析的过程咯
                ADC_SoftwareStartConvCmd(ADC1, DISABLE);                                 /* 软件停止 ADC1 */                                                                          
        }
                                 
        ADC_data = ADC_data >> 4;                                                                         /* 取 16 次采样平均值 */        
        ADC_data = (unsigned int)(((unsigned int)ADC_data)*3300>>12);/* 把采集到的数值转换成电压数据 */

MultiChannel_AsciiBuff[0] = ADC_data/1000%10 + 0x30;
        MultiChannel_AsciiBuff[1] = ADC_data/100%10 + 0x30;
        MultiChannel_AsciiBuff[2] = ADC_data/10%10 + 0x30;                                                 /* 数据分离送 USART1 显示 */
        MultiChannel_AsciiBuff[3] = ADC_data%10 + 0x30;
        MultiChannel_AsciiBuff[4] = 0;

USART1Write((u8*)MultiChannel_AsciiBuff,4);
        USART1Write((u8*)"\r\n",sizeof("\r\n"));

//return (unsigned int)(((unsigned long)(ADC_data>>4))*3300>>12);
}       
        对于那两个问题的答案也在这里面。首先是DMA的存储地址,用横着的红线做了标记;对于采集数据的分离在最后一个红色竖线部分。呵呵,看着是不是就很简单咯~

STM32的ADC多通道采集的实现相关推荐

  1. STM32 ADC多通道采集

    ADC多通道采集(阻塞模式.ADC_DMA模式) ADC多通道采集(阻塞模式) ADC多通道采集(DMA模式) ADC多通道采集(阻塞模式) 1.时钟源配置 2.配置RCC时钟(选择第三个选项 Cry ...

  2. dma和通道的区别_STM32 定时器触发 ADC 多通道采集,DMA搬运至内存

    引言 ADC 的功能是将模拟信号采样得到数字信号,而有些时候,我们需要使用到定时采样,比如在计算一个采集的波形的频率的时候,我们需要精确的知道采样频率,也就是 1 s 内采集的点数,这个时候,就需要使 ...

  3. 记录基于MXCube,使用STM32F103RCT6 ADC多通道采集 的学习经验

    记录基于MXCube,使用STM32F103RCT6 ADC多通道采集 推荐保存一下参考博客(https://www.cnblogs.com/xingboy/p/10212308.html) ADC转 ...

  4. 基于STM32的ADC电压采集(DMA传输)

    我最近在写stm32的adc电压采集过程中遇到了一些问题,这些问题或许对stm32初学者入手adc有所帮助. 对adc采集到的数据进行均值滤波处理,新建一个数组ADC_ConvertedValue_1 ...

  5. stm32cubeide 多通道adc_STM32L0开发——ADC多通道采集,IDE和IAR开发注意事项

    keil开发L0系列是免费的,官方提供许可的.因此建议Keil开发, L011F3由于flash只有8K,因此不建议HAL库,建议使用cubemx+LL(或snippets库). 0.起初,可以参考官 ...

  6. STM32L0开发——ADC多通道采集,IDE和IAR开发注意事项

    keil开发L0系列是免费的,官方提供许可的.因此建议Keil开发, L011F3由于flash只有8K,因此不建议HAL库,建议使用cubemx+LL(或snippets库). 0.起初,可以参考官 ...

  7. STM32f103的数电采集电路的ADC多通道采集程序

    STM32拥有1~3个ADC(STM32F101/102 系列只有1个ADC),这些ADC可以独立使用,也可以使用双重模式(提高采样率).STM32 的ADC是12位逐次逼近型的模拟数字转换器.它有1 ...

  8. STM32之ADC多通道连续例程

    #include "stm32f10x.h" /* RCC时钟配置 */ void RCC_config(void) {  ErrorStatus HSEStartUpStatus ...

  9. STM32F030 使用CUBEMX配置ADC多通道采集 DMA传输

    STM32CubeMX的配置 以下为测试代码 //usart重定向,注意使用前需要包含头文件<stdio.h> int fputc(int ch, FILE *f) {HAL_UART_T ...

  10. stm32双adc电压采集

    ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;    //ADC工做模式:ADC同步规则组模式 ADC_DMACmd(ADC1, ENABLE);  ...

最新文章

  1. 你是如何自学 Python 的?
  2. html 3d转换动画,开源项目:CSS 3D转换和动画学习示例教程
  3. MapReduce简介
  4. 原生JS封装ajax以及request
  5. 面试加分项!Android权限处理,手慢无
  6. 推动Windows的限制:进程和线程
  7. Vue中diff算法的理解
  8. 力扣1009.十进制整数的反码
  9. Spark 中 map 与 flatMap 的区别
  10. 关于unicode,mbcs,utf8,charset,encoding等相关概念的说明
  11. 电脑光驱不见了(错误代码39 黄色感叹号)的解决办法
  12. 2021.3.23 富途牛牛笔试
  13. MySQL原理与实践(二):一条update语句引出MySQL日志系统
  14. Excel vba按指定列号内容插入分页符
  15. USYD悉尼大学DATA 2002 【R语言学习1】【介绍R】Introduction to R「虽迟但到」
  16. 关于物联网远程控制技术,你了解的有多少?
  17. STL容器底层实现数据结构
  18. 第一阶段冲刺团队贡献值总结
  19. 微信电脑版 V3.3.0.84 多开消息防撤回绿色版
  20. 抢滩产研高地:零售To B的新探索

热门文章

  1. 制作window11系统U盘启动盘
  2. Win10怎么设置自动锁屏? win10自动锁屏的两种方法
  3. mysql的函数的写法_mysql中分组函数的写法
  4. 亲密爱人:《亲密关系》读书笔记
  5. 阿里巴巴面试题含答案
  6. 马克思主义基本原理概论复习资料
  7. mysql grant 用户权限总结
  8. 表格表头绘制对角线(不固定表格宽高)
  9. 伴随矩阵例题_考研数学一真题详解:伴随矩阵有关问题
  10. CSI-RS资源配置