日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2023/12/9 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ADC的DMA多通道数据采集(雨滴传感器+光敏传感器) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

AADC1跟ADC3可以用DMA,因為多通道,然而ADC只有一個數(shù)據(jù)寄存器,因此可以用DMA開一個數(shù)組來存數(shù)據(jù)

?ADC1只能用DMA1的通道1

??ADC3只能用DMA2的通道5

最近在學模擬量的測試,我用了光敏傳感器和雨滴傳感器,跟上一篇的光敏傳感器差不多,只不過這里多了DMA的初始,可以實現(xiàn)獨立ADC的多通道數(shù)據(jù)采集。

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,不然會不精準,系統(tǒng)內(nèi)部時鐘是72Mhz,所以要分頻//DMA設置DMA_DeInit(DMA2_Channel5);DMA_InitStruct.DMA_PeripheralBaseAddr = (u32)(&ADC3->DR);//外設的基地址DMA_InitStruct.DMA_MemoryBaseAddr = (u32)&ADC_ConversionValue; //內(nèi)存存儲地址,即數(shù)據(jù)的基地址DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC;//數(shù)據(jù)來源于外設DMA_InitStruct.DMA_BufferSize = 2;//緩沖區(qū)大小,數(shù)組的長度DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//只有一個外設,地址不增DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;//內(nèi)存地址遞增,即數(shù)組地址增DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//外設數(shù)據(jù)大小為半字,也就是兩個字節(jié)DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//內(nèi)存大小為半字,也就是兩個字節(jié)DMA_InitStruct.DMA_Mode = DMA_Mode_Circular;//循環(huán)傳輸DMA_InitStruct.DMA_Priority = DMA_Priority_High;//DMA通道優(yōu)先級為高,當使用一個DMA通道是,優(yōu)先級不影響DMA_InitStruct.DMA_M2M = DMA_M2M_Disable; //外設到內(nèi)存模式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; //模數(shù)轉(zhuǎn)換工作在多通道模式ADC_InitStruct.ADC_ContinuousConvMode = ENABLE; //連續(xù)轉(zhuǎn)換ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //不使用外部觸發(fā)ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right; //轉(zhuǎn)換結(jié)果右對齊,放在低12位ADC_InitStruct.ADC_NbrOfChannel = 2; //順序進行規(guī)則轉(zhuǎn)換的ADC通道的數(shù)目ADC_Init(ADC3, &ADC_InitStruct);ADC_RegularChannelConfig(ADC3, ADC_Channel_4, 1, ADC_SampleTime_55Cycles5);//規(guī)則通道,ADC3,通道4,第一個轉(zhuǎn)換,采樣時間為55.5周期ADC_RegularChannelConfig(ADC3, ADC_Channel_5, 2, ADC_SampleTime_55Cycles5);//規(guī)則通道,ADC3,通道5,第一個轉(zhuǎn)換,采樣時間為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重置校準寄存器的狀態(tài),設置狀態(tài)則等待ADC_StartCalibration(ADC3); //開啟精準計算while(ADC_GetCalibrationStatus(ADC3));ADC_SoftwareStartConvCmd(ADC3, ENABLE); //使能指定的ADC3的軟件轉(zhuǎn)換啟動功能}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:采集次數(shù){ // temp += ADC3_Get(LSENS_ch); //多次采集的數(shù)據(jù)和temp =temp + ADC3_GetLightValue(); // printf("temp:%d\r\n", temp);delay_ms(5);}temp /= LightSensor_read_time; // 平均值:多次采集的數(shù)據(jù)和除以采集次數(shù)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); //根據(jù)設定參數(shù)初始化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); //根據(jù)設定參數(shù)初始化GPIOF7ADC3_Init(); }//雨滴傳感器模擬值0-200 u8 YuDi_Val(void) {u32 temp = 0;u8 t;for(t=0;t<10;t++) // LightSensor_read_time:采集次數(shù){ // temp += ADC3_Get(LSENS_ch); //多次采集的數(shù)據(jù)和temp += ADC3_GetYuDiValue();delay_ms(5);}temp /= 10; // 平均值:多次采集的數(shù)據(jù)和除以采集次數(shù)if(temp > 4000) {temp = 4000;BEEP(1); //蜂鳴器響,這個是用來檢測沒有水的時候,蜂鳴器會響,雨滴的值為0}else{BEEP(0);}return (u8)(200-(temp/20)); //模擬量輸出范圍為 0-200 }

?

總結(jié)

以上是生活随笔為你收集整理的ADC的DMA多通道数据采集(雨滴传感器+光敏传感器)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。