AADC1跟ADC3可以用DMA,因为多通道,然而ADC只有一个数据寄存器,因此可以用DMA开一个数组来存数据

ADC1只能用DMA1的通道1

ADC3只能用DMA2的通道5

最近在学模拟量的测试,我用了光敏传感器和雨滴传感器,跟上一篇的光敏传感器差不多,只不过这里多了DMA的初始,可以实现独立ADC的多通道数据采集。

adc.h

#ifndef ADC_H
#define ADC_H#include "sys.h"void ADC3_Init(void);
//u16 ADC3_Get(u8 ch);
u16 ADC3_GetLightValue(void);
u16 ADC3_GetYuDiValue(void);
//u16 ADC3_GetSmogValue(void);
#endif /* ADC_H */

adc.c

#include "adc.h"
#include "delay.h"
#include "usart.h"//ADC3使用的是DMA2的通道5u16 ADC_ConversionValue[2] = {0,0};
void ADC3_Init(void)
{DMA_InitTypeDef DMA_InitStruct;ADC_InitTypeDef ADC_InitStruct;RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE);     //开启时钟RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC3,ENABLE);       //复位RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC3,DISABLE);    //关闭RCC_ADCCLKConfig(RCC_PCLK2_Div6);         //时钟分频,ADC不能超过14Mhz,不然会不精准,系统内部时钟是72Mhz,所以要分频//DMA设置DMA_DeInit(DMA2_Channel5);DMA_InitStruct.DMA_PeripheralBaseAddr = (u32)(&ADC3->DR);//外设的基地址DMA_InitStruct.DMA_MemoryBaseAddr = (u32)&ADC_ConversionValue; //内存存储地址,即数据的基地址DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC;//数据来源于外设DMA_InitStruct.DMA_BufferSize = 2;//缓冲区大小,数组的长度DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//只有一个外设,地址不增DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;//内存地址递增,即数组地址增DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//外设数据大小为半字,也就是两个字节DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//内存大小为半字,也就是两个字节DMA_InitStruct.DMA_Mode = DMA_Mode_Circular;//循环传输DMA_InitStruct.DMA_Priority  = DMA_Priority_High;//DMA通道优先级为高,当使用一个DMA通道是,优先级不影响DMA_InitStruct.DMA_M2M = DMA_M2M_Disable;    //外设到内存模式DMA_Init(DMA2_Channel5, &DMA_InitStruct);DMA_Cmd(DMA2_Channel5, ENABLE);//ADC设置ADC_DeInit(ADC3);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_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;        //转换结果右对齐,放在低12位ADC_InitStruct.ADC_NbrOfChannel = 2;   //顺序进行规则转换的ADC通道的数目ADC_Init(ADC3, &ADC_InitStruct);ADC_RegularChannelConfig(ADC3, ADC_Channel_4, 1, ADC_SampleTime_55Cycles5);//规则通道,ADC3,通道4,第一个转换,采样时间为55.5周期ADC_RegularChannelConfig(ADC3, ADC_Channel_5, 2, ADC_SampleTime_55Cycles5);//规则通道,ADC3,通道5,第一个转换,采样时间为55.5周期
//  ADC_RegularChannelConfig(ADC3, ADC_Channel_6, 3, ADC_SampleTime_55Cycles5);ADC_DMACmd(ADC3, ENABLE);  //使能ADC的DMA请求ADC_Cmd(ADC3, ENABLE);ADC_ResetCalibration(ADC3);    //重置指定的ADC3的复位寄存器while(ADC_GetResetCalibrationStatus(ADC3));    //获取ADC3重置校准寄存器的状态,设置状态则等待ADC_StartCalibration(ADC3);    //开启精准计算while(ADC_GetCalibrationStatus(ADC3));ADC_SoftwareStartConvCmd(ADC3, ENABLE);  //使能指定的ADC3的软件转换启动功能}u16 ADC3_GetLightValue(void)
{
//   printf("ADC_ConversionValue[0]:%d\r\n", ADC_ConversionValue[0]);return (u16)ADC_ConversionValue[0];
}u16 ADC3_GetYuDiValue(void)
{
//   printf("ADC_ConversionValue[1]:%d\r\n", ADC_ConversionValue[0]);return (u16)ADC_ConversionValue[1];
}
//
//u16 ADC3_GetSmogValue(void)
//{
//   printf("ADC_ConversionValue[1]:%d\r\n", ADC_ConversionValue[0]);
//   return (u16)ADC_ConversionValue[2];
//}

光敏传感器

lightsensor.h

lightsensor.c

#include "lightsensor.h"
#include "adc.h"
#include "delay.h"
#include "led.h"
#include "usart.h"//extern u16 ADC_ConversionValue[2] = {0,0};
//光敏传感器PF6/ADC3_IN4
void LighrSensor_Init(void)             //初始化GPIO
{GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE);GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;          //采用ADC的时候,这里要用模拟输入模式GPIO_Init(GPIOF, &GPIO_InitStruct);ADC3_Init();
}
//光敏传感器模拟值0-100
u8 LightSensor_Val(void)
{u32 temp = 0;u8 t;for(t=0;t<LightSensor_read_time;t++)        // LightSensor_read_time:采集次数{
//      temp += ADC3_Get(LSENS_ch);                 //多次采集的数据和temp =temp + ADC3_GetLightValue();
//      printf("temp:%d\r\n", temp);delay_ms(5);}temp /= LightSensor_read_time;               // 平均值:多次采集的数据和除以采集次数printf("temp:%d\r\n", temp);if(temp > 4000)                             {temp = 4000;}else{LED1 = 0;}return (u8)(100-(temp/40));                  //模拟量输出范围为 0-100
}

雨滴传感器

mdrh.h

#ifndef __MHRD_H
#define __MHRD_H#include "sys.h"#define YU_DO  PAin(5)// PB5void DO_Init(void);//这个是雨滴传感器作为TTL的高低电平初始化
void MHRD_AO_Init(void);//这个雨滴传感器的模拟初始化
u8 YuDi_Val(void);
#endif /* __MHRD_H */

mdrh.c

#include "mhrd.h"
#include "adc.h"
#include "delay.h"
#include "beep.h"
//PA5 - DO 低电平有效
void DO_Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能PA端口时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                //DO-->PA.5 端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;       //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //IO口速度为50MHzGPIO_Init(GPIOB, &GPIO_InitStructure);                     //根据设定参数初始化GPIOA.5GPIO_SetBits(GPIOA,GPIO_Pin_5);                       //PB.5 输出高,关闭}void MHRD_AO_Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE);  //使能PF端口时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;                //AO-->PF.7 端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;       //模拟输入GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //IO口速度为50MHzGPIO_Init(GPIOF, &GPIO_InitStructure);                     //根据设定参数初始化GPIOF7ADC3_Init();
}//雨滴传感器模拟值0-200
u8 YuDi_Val(void)
{u32 temp = 0;u8 t;for(t=0;t<10;t++)       // LightSensor_read_time:采集次数{
//      temp += ADC3_Get(LSENS_ch);                 //多次采集的数据和temp += ADC3_GetYuDiValue();delay_ms(5);}temp /= 10;              // 平均值:多次采集的数据和除以采集次数if(temp > 4000)                               {temp = 4000;BEEP(1);        //蜂鸣器响,这个是用来检测没有水的时候,蜂鸣器会响,雨滴的值为0}else{BEEP(0);}return (u8)(200-(temp/20));                  //模拟量输出范围为 0-200
}

ADC的DMA多通道数据采集(雨滴传感器+光敏传感器)相关推荐

  1. [基础代码仓库]基于STM32C8T6的库函数ADC模拟+DMA多通道转运代码

    目录 导言 理论部分 STM32F103C8T6最小系统板 代码初始化步骤 代码部分 一.1个通道PA0 二.2个通道PA0.PA1 三.3个通道PA0.PA1.PA2 四.4个通道PA0~PA3 五 ...

  2. STM32学习笔记(六 定时器及应用 4 光敏传感器实验 )

    一.光敏传感器简介 光敏传感器是最常见的传感器之一,它的种类繁多,主要有:光电管.光电倍增管.光敏电阻.光敏三极管.太阳能电池.红外线传感器.紫外线传感器.光纤式光电传感器.色彩传感器.CCD 和 C ...

  3. 内部温度传感器和光敏传感器实验

    内部温度传感器 STM32F407 有一个内部的温度传感器,可以用来测量 CPU 及周围的温度(TA).该温度传感器在内部和 ADC1_IN16输入通道相连接,此通道把传感器输出的电压转换成数字值. ...

  4. STM32CubeMX | HAL库的ADC多通道数据采集(轮训、DMA、DMA+TIM)、读取内部传感器温度

    STM32CubeMX | HAL库的ADC多通道数据采集(轮训.DMA.DMA+TIM).读取内部传感器温度 目录 STM32CubeMX | HAL库的ADC多通道数据采集(轮训.DMA.DMA+ ...

  5. stm32f429之多通道ADC通过DMA数据采集

    stm32f429之多通道ADC通过DMA数据采集 原来的程序使用时stm32f103的芯片,现在给为stm32f429的芯片,查看一下几家开发板例程,发现没有使用adc+dma的,在网上也搜索了一下 ...

  6. STM32——ADC读取光敏传感器控制LED灯,看门狗中断

    本文介绍两种使用方法 一.编写读取AD值的函数,之后判断AD值,进行相应操作,比如点灯. 二.用ADC读取光敏传感器AO口输出,并配置ADC通道看门狗监控这条通道,当光线太暗时打开LED灯. 之后会再 ...

  7. stm32 adc输入电压范围_正点原子【STM32-F407探索者】第二十五章 光敏传感器实验...

    1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 本章我们将向大家介绍探索者 STM32F4 开发板自带的 ...

  8. STM32F767多通道ADC采集+DMA传输

    文章目录 一.ADC简介 1.ADC采样频率 2.ADC转换时间 3.ADC寄存器 4.ADC引脚与外部通道对应关系 二.DMA简介 三.代码配置 1.ADC.DMA初始化配置 2.adc.h文件的配 ...

  9. c语言光敏程序代码,ADC实验之光敏传感器

    ADC实验之光敏传感器 硬件连接 我们可以测量A的电位,进而测量光的强度,光强与A点电压的对应关系如下: 电流反应的光敏二极管的导通状态,光强与电流对应关系如下: 因此,我们可以得出ADC读取的电压值 ...

  10. ADC实验之光敏传感器

    ADC实验之光敏传感器 硬件连接 我们可以测量A的电位,进而测量光的强度,光强与A点电压的对应关系如下: 电流反应的光敏二极管的导通状态,光强与电流对应关系如下: 因此,我们可以得出ADC读取的电压值 ...

最新文章

  1. String 类型的相关转换
  2. 面试 - 要不简单聊一下你对MySQL索引的理解?
  3. SQL Server 关于列的权限控制
  4. 深入浅出单实例Singleton设计模式
  5. 计算机电力英语翻译,电力专业英语阅读与翻译..doc
  6. python json模块详解_深入解析Python编程中JSON模块的使用
  7. JQ实现仿淘宝条件筛选
  8. WebBrowser控件使用相关
  9. python筛选时间段_django admin管理工具自定义时间区间筛选器DateRangeFilter介绍
  10. 常见的html字体,网页设计中最常用的字体有哪些
  11. 计算机视觉教程2-3:图解双线性插值算法最近邻插值算法
  12. 图像文字识别:Python批量识别图片中的文字并自动改名
  13. 该怎么压缩ppt大小
  14. 深圳圈子联合将出席2016IT领袖峰会
  15. samba报错:smbd dead but pid file exists
  16. 合并多个excel文件数据
  17. 数据归一化 minmax_scale()函数解析
  18. MAC系统下解决Teamviewer 被误认为商业用途的问题
  19. java实现等待程序响应_java – Ning:连接到websocket并等待响应
  20. 入驻华为云·云享专家了?!

热门文章

  1. 代码整洁 vs 代码肮脏
  2. 十、基于FPGA的PCIE协议介绍(一)
  3. 【日常学习——论文写作】毕业论文的查重
  4. 华为手机楷体字体下载_正楷字体下载正楷字体官方下载[字体下载]-华军软件园...
  5. IOMMU简述-上篇
  6. 常用matlab画图命令 坐标轴倾斜
  7. OCR身份证识别简单算法流程
  8. IDEA如何导入MySQL驱动
  9. Alex 的 Hadoop 菜鸟教程: 第3课 Hadoop 安装教程 - 非HA方式 (一台server)
  10. Sibelius 8 for Mac(西贝柳斯打谱软件)中文破解版