码迷,mamicode.com
首页 > 其他好文 > 详细

ADC-DMA-光敏电阻、MQ2、MQMQ135--程序

时间:2020-04-19 22:08:07      阅读:119      评论:0      收藏:0      [点我收藏+]

标签:函数返回值   第一个   time   启动   通道数   数据存储   方向   ali   rip   

  1 #include "main.h"
  2 /**************************
  3 函数名称:LDR_Init()
  4 函数功能:光敏电阻,MQ2,MQ135初始化
  5 函数参数:无
  6 函数返回值:无
  7 备注:PA3--模拟输入
  8       ADC1-IN3--ADC1通道3
  9             PA2--MQ2--ADC1通道2
 10             PA1--MQ135--ADC1通道1
 11 ****************************/
 12 void LDR_Init(void)
 13 {
 14 #if reg_progream
 15     //1.使能时钟PA3  ADC1--ADCCLK时钟
 16     RCC->APB2ENR|=(1<<2)|(1<<9);
 17     //2.配置ADC1时钟,设置分频因子72M 分频后不能超过14M--6分频
 18     RCC->CFGR |=(2<<14);
 19     //3.PA3,PA2,PA1 --模拟输入
 20     GPIOA->CRL &=~((0xfff<<4));
 21     //4.配置ADC1:1.规则通道转换总数 2.转换顺序 3.采样时间
 22     //*******-3个通道,转换3个
 23     ADC1->SQR1 |=(2<<20);
 24     //*******IN3通道3放在规则组中第一个转换,2--2,1--3
 25     ADC1->SQR3 |=(3<<0);//3--通道编号
 26     ADC1->SQR3 |=(2<<5);//2--通道编号
 27     ADC1->SQR3 |=(1<<10);//1--通道编号
 28     //************通道3/2/1采样时间--239.5周期/28.5周期/71.5周期
 29     ADC1->SMPR2 |=(0x7<<(3*3))|(0x7<<(3*2))|(0x7<<(3*1));
 30     //5.独立模式:000、禁用间断模式,扫描模式
 31     ADC1->CR1 =0;//禁用间断模式
 32     //**********扫描模式
 33     ADC1->CR1 |=(1<<8);
 34     //******连续转换模式
 35     ADC1->CR2 |=(1<<1);
 36     ADC1->CR2 &=~(1<<11);//右对齐--11位为0
 37     ADC1->CR2 |=(1<<20);//使用外部事件启动转换
 38     ADC1->CR2 |=(0x7<<17);//软件触发--SWSTART
 39     //开启A/D转换
 40     ADC1->CR2 |=(1<<0);
 41     //复位校准
 42     ADC1->CR2 |=(1<<3);
 43     //等待校准寄存器被初始化
 44     while(ADC1->CR2 &(1<<3));//初始化校准完成,自动为0,退出whiile
 45     //A/D校准
 46     ADC1->CR2 |=(1<<2);
 47     //等待校准完成
 48     while(ADC1->CR2&(1<<2));
 49 #else
 50   ADC_InitTypeDef ADC_InitStruct;
 51     GPIO_InitTypeDef GPIO_InitStruct;
 52   //1.使能时钟PA3  ADC1--ADCCLK时钟
 53     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE);
 54     //2.配置ADC1时钟,设置分频因子72M 分频后不能超过14M--6分频
 55     RCC_ADCCLKConfig(RCC_PCLK2_Div6);
 56     //3.PA3 --模拟输入
 57     GPIO_InitStruct.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_2|GPIO_Pin_1 ;
 58     GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AIN;
 59     GPIO_Init(GPIOA,&GPIO_InitStruct);
 60     //4.配置ADC1: 2.转换顺序 3.采样时间
 61     //只有一个光敏电阻--一个通道,转换一个
 62     //IN3通道3放在规则组中第一个转换
 63     //ADC_RegularChannelConfig(ADC1, ADC_Channel_3|ADC_Channel_16,1,  ADC_SampleTime_239Cycles5);
 64     //5.独立模式:000、禁用间断模式,扫描模式
 65     ADC_InitStruct.ADC_Mode=ADC_Mode_Independent;//独立模式
 66     ADC_InitStruct.ADC_ScanConvMode= ENABLE;//单通道模式即扫描模式
 67     ADC_InitStruct.ADC_ContinuousConvMode=ENABLE;//连续转换
 68     ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right ;//右对齐--11位为0
 69     ADC_InitStruct.ADC_NbrOfChannel=3;//规则组中ADC转换通道数目--待转换的通道数
 70     ADC_InitStruct.ADC_ExternalTrigConv= ADC_ExternalTrigConv_None ;//软件触发--SWSTART,库函数里不需要在单独进行外部触发
 71   ADC_Init(ADC1,&ADC_InitStruct);
 72         //通道3采样时间--239.5周期
 73     ADC_RegularChannelConfig(ADC1, ADC_Channel_3,1,  ADC_SampleTime_239Cycles5);
 74     ADC_RegularChannelConfig(ADC1, ADC_Channel_2,2,  ADC_SampleTime_239Cycles5);
 75     ADC_RegularChannelConfig(ADC1, ADC_Channel_1,3,  ADC_SampleTime_239Cycles5);
 76 //开启A/D转换
 77     ADC_Cmd(ADC1, ENABLE);
 78     //复位校准
 79      ADC_ResetCalibration(ADC1);
 80     //等待校准寄存器被初始化
 81     while(ADC_GetResetCalibrationStatus(ADC1));//初始化校准完成,自动为0,退出whiile
 82     //A/D校准
 83     ADC_StartCalibration(ADC1);
 84     //等待校准完成
 85     while(ADC_GetCalibrationStatus(ADC1));
 86   //使能内部温度传感器
 87     //ADC_TempSensorVrefintCmd(ENABLE);
 88 #endif
 89 
 90 }
 91 
 92 void GZ_ADCValue(void)
 93 {
 94 #if reg_progream
 95     u16 gz_value;//光照的值
 96     //启动规则通道转换
 97     ADC1->CR2 |=(1<<22);
 98     //等待转换完成
 99     while((ADC1->SR &(1<<1))==0);
100     gz_value=ADC1->DR;
101     printf("gz_value=%d\r\n",gz_value);
102     
103 #else
104     u16 gz_value;//光照的值
105     //启动规则通道转换
106     ADC_SoftwareStartConvCmd(ADC1,ENABLE);
107     //等待转换完成
108     while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);
109     gz_value= ADC_GetConversionValue(ADC1);
110     printf("gz_value=%d\r\n",gz_value);
111     
112 #endif
113 }
114 
115 u16 dmabuff[3]={0};//存储器数据存放
116 /************DMA配置***********/
117 void LDR_DMAConfig(void)
118 {
119 #if reg_progream
120     
121         //使能DMA1时钟
122     RCC->AHBENR |=(1<<0);
123     ADC1->CR2 |= (1<<8);//使能ADC  DMA传输
124     //设置外设寄存器地址
125     DMA1_Channel1->CPAR = (u32)&(ADC1->DR);
126     //设置数据存储器的地址
127     DMA1_Channel1->CMAR = (u32)dmabuff;
128     //设置要传输的数据量
129     DMA1_Channel1->CNDTR = sizeof(dmabuff)/sizeof(dmabuff[0]);
130     //设置通道的优先级:高
131     DMA1_Channel1->CCR |=(2<<12); 
132     //设置数据传输的方向:从外设读
133     DMA1_Channel1->CCR &=~(1<<4);
134     //非存储器到存储器模式
135     DMA1_Channel1->CCR &=~(1<<14);
136     //循环模式
137     DMA1_Channel1->CCR |=(1<<5);
138     //外设不增量模式
139     DMA1_Channel1->CCR &=~(1<<6);
140     //存储器增量模式
141     DMA1_Channel1->CCR |=(1<<7);
142     //外设数据宽度:16位
143     DMA1_Channel1->CCR |=(1<<8);
144     //存储器数据宽度:16位
145     DMA1_Channel1->CCR |=(1<<10);
146     //启动DMA通道
147     DMA1_Channel1->CCR |=(1<<0);
148     //启动规则通道转换
149     ADC1->CR2 |=(1<<22);
150 #else
151  DMA_InitTypeDef DMA_InitStruct;
152     //使能DMA1时钟
153     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
154     ADC_DMACmd(ADC1,ENABLE);//使能DMA传输
155     //外设基地址
156     DMA_InitStruct.DMA_PeripheralBaseAddr = (u32)&(ADC1->DR);
157     //存储器基地址
158     DMA_InitStruct.DMA_MemoryBaseAddr = (u32)dmabuff;
159     //传输的数据量
160     DMA_InitStruct.DMA_BufferSize = sizeof(dmabuff)/sizeof(dmabuff[0]);
161     //优先级:高
162     DMA_InitStruct.DMA_Priority = DMA_Priority_High;
163     //数据传输的方向:外设为数据源
164     DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC;
165     //非存储器到存储器模式
166     DMA_InitStruct.DMA_M2M = DMA_M2M_Disable;
167     //循环模式
168     DMA_InitStruct.DMA_Mode = DMA_Mode_Circular;
169     //外设不增量
170     DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
171     //存储器增量
172     DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;
173     //外设数据宽度:16位
174     DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
175     //存储器数据宽度:16位
176     DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
177     DMA_Init(DMA1_Channel1,&DMA_InitStruct);
178     //使能DMA1通道1
179     DMA_Cmd(DMA1_Channel1,ENABLE);
180     
181     //使能指定ADC软件转换功能
182     ADC_SoftwareStartConvCmd(ADC1,ENABLE);
183 #endif
184 }
185 
186 void DMA_Value(void)
187 {
188     u8 i=0;
189     //取出转换的数目右移20位是因为前20还是存在的,
190     //右移20位只不过是把他移到前面了,+1是因为0000表示1
191     u8 lenth=((ADC1->SQR1 &(0xf<<20))>>20)+1;
192 //    for(i=0;i<3;i++)
193 //    {
194 //        printf("cdata[%d]=%d",i,cdata[i]);    
195 //    }
196 //    if(i>2)
197 //    {
198 //        printf("\r\n");
199 //    }
200     for(i=0;i<lenth;i++)
201     {
202         printf("dmabuff[%d]=%d   ",i,dmabuff[i]);
203     }
204     if(i>=lenth)
205     {
206         printf("\r\n");
207     }
208 }

 

ADC-DMA-光敏电阻、MQ2、MQMQ135--程序

标签:函数返回值   第一个   time   启动   通道数   数据存储   方向   ali   rip   

原文地址:https://www.cnblogs.com/juan-4-14/p/12733964.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!