ADC-DMA-光敏电阻MQ2MQMQ135--程序
Posted juan-4-14
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ADC-DMA-光敏电阻MQ2MQMQ135--程序相关的知识,希望对你有一定的参考价值。
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 ",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 ",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(" "); 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(" "); 207 } 208 }
以上是关于ADC-DMA-光敏电阻MQ2MQMQ135--程序的主要内容,如果未能解决你的问题,请参考以下文章
PyQt5 QGraphicsPathItem 绘制一个电阻