ADC的DMA多通道数据采集(雨滴传感器+光敏传感器)
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多通道数据采集(雨滴传感器+光敏传感器)相关推荐
- [基础代码仓库]基于STM32C8T6的库函数ADC模拟+DMA多通道转运代码
目录 导言 理论部分 STM32F103C8T6最小系统板 代码初始化步骤 代码部分 一.1个通道PA0 二.2个通道PA0.PA1 三.3个通道PA0.PA1.PA2 四.4个通道PA0~PA3 五 ...
- STM32学习笔记(六 定时器及应用 4 光敏传感器实验 )
一.光敏传感器简介 光敏传感器是最常见的传感器之一,它的种类繁多,主要有:光电管.光电倍增管.光敏电阻.光敏三极管.太阳能电池.红外线传感器.紫外线传感器.光纤式光电传感器.色彩传感器.CCD 和 C ...
- 内部温度传感器和光敏传感器实验
内部温度传感器 STM32F407 有一个内部的温度传感器,可以用来测量 CPU 及周围的温度(TA).该温度传感器在内部和 ADC1_IN16输入通道相连接,此通道把传感器输出的电压转换成数字值. ...
- STM32CubeMX | HAL库的ADC多通道数据采集(轮训、DMA、DMA+TIM)、读取内部传感器温度
STM32CubeMX | HAL库的ADC多通道数据采集(轮训.DMA.DMA+TIM).读取内部传感器温度 目录 STM32CubeMX | HAL库的ADC多通道数据采集(轮训.DMA.DMA+ ...
- stm32f429之多通道ADC通过DMA数据采集
stm32f429之多通道ADC通过DMA数据采集 原来的程序使用时stm32f103的芯片,现在给为stm32f429的芯片,查看一下几家开发板例程,发现没有使用adc+dma的,在网上也搜索了一下 ...
- STM32——ADC读取光敏传感器控制LED灯,看门狗中断
本文介绍两种使用方法 一.编写读取AD值的函数,之后判断AD值,进行相应操作,比如点灯. 二.用ADC读取光敏传感器AO口输出,并配置ADC通道看门狗监控这条通道,当光线太暗时打开LED灯. 之后会再 ...
- stm32 adc输入电压范围_正点原子【STM32-F407探索者】第二十五章 光敏传感器实验...
1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 本章我们将向大家介绍探索者 STM32F4 开发板自带的 ...
- STM32F767多通道ADC采集+DMA传输
文章目录 一.ADC简介 1.ADC采样频率 2.ADC转换时间 3.ADC寄存器 4.ADC引脚与外部通道对应关系 二.DMA简介 三.代码配置 1.ADC.DMA初始化配置 2.adc.h文件的配 ...
- c语言光敏程序代码,ADC实验之光敏传感器
ADC实验之光敏传感器 硬件连接 我们可以测量A的电位,进而测量光的强度,光强与A点电压的对应关系如下: 电流反应的光敏二极管的导通状态,光强与电流对应关系如下: 因此,我们可以得出ADC读取的电压值 ...
- ADC实验之光敏传感器
ADC实验之光敏传感器 硬件连接 我们可以测量A的电位,进而测量光的强度,光强与A点电压的对应关系如下: 电流反应的光敏二极管的导通状态,光强与电流对应关系如下: 因此,我们可以得出ADC读取的电压值 ...
最新文章
- String 类型的相关转换
- 面试 - 要不简单聊一下你对MySQL索引的理解?
- SQL Server 关于列的权限控制
- 深入浅出单实例Singleton设计模式
- 计算机电力英语翻译,电力专业英语阅读与翻译..doc
- python json模块详解_深入解析Python编程中JSON模块的使用
- JQ实现仿淘宝条件筛选
- WebBrowser控件使用相关
- python筛选时间段_django admin管理工具自定义时间区间筛选器DateRangeFilter介绍
- 常见的html字体,网页设计中最常用的字体有哪些
- 计算机视觉教程2-3:图解双线性插值算法最近邻插值算法
- 图像文字识别:Python批量识别图片中的文字并自动改名
- 该怎么压缩ppt大小
- 深圳圈子联合将出席2016IT领袖峰会
- samba报错:smbd dead but pid file exists
- 合并多个excel文件数据
- 数据归一化 minmax_scale()函数解析
- MAC系统下解决Teamviewer 被误认为商业用途的问题
- java实现等待程序响应_java – Ning:连接到websocket并等待响应
- 入驻华为云·云享专家了?!
热门文章
- 代码整洁 vs 代码肮脏
- 十、基于FPGA的PCIE协议介绍(一)
- 【日常学习——论文写作】毕业论文的查重
- 华为手机楷体字体下载_正楷字体下载正楷字体官方下载[字体下载]-华军软件园...
- IOMMU简述-上篇
- 常用matlab画图命令 坐标轴倾斜
- OCR身份证识别简单算法流程
- IDEA如何导入MySQL驱动
- Alex 的 Hadoop 菜鸟教程: 第3课 Hadoop 安装教程 - 非HA方式 (一台server)
- Sibelius 8 for Mac(西贝柳斯打谱软件)中文破解版