电子-adc.pdf

所需积分/C币:25 2019-09-05 12:45:26 351KB PDF
47
收藏 收藏
举报

电子-adc.pdf,单片机/嵌入式STM32-F0/F1/F2
2016710 Stack Edit Viewer u16 Get_Adc_Average(u8 ch, u8 times) u32 temp_val=0; u8 ti for(t=o; t<times; t++) temp_val+=Get_Adc(ch) delay_ms (5); return temp_val/times; 在main数中只要调用adcx=Get_Adc_ Average(ADC_ Channel_1,10);之类的就可以 读取转换的值。 ADC单通道转换(DMA方式) 为什么要用DMA方式 在上述的ADC转换中,CPU要处理由ADC外设采集回来的数据时,CPU首先要把数据从 ADC外设的寄存器读取到CPU内存中,然后进行运算。但是用CPU来转换数据是有些杀鸡 用牛刀,用DMA方式可以大大减轻CPU工作,从而提高运算效率 贴代码 # define adcl_DR_ Address((u32)0×40012400+0x4c)//DMA传输的外设地 址ADC1DR_ Address是一个自定义的宏ADC_DR保存了ADC转换的值,以它作为DMA传 输的源地址。 to uTnt16 t adc convertedvalue;//在传输地址屮定义一个基地址 //IO ul6 ADC Convertedvaluelocal static void ADCl_GPIO_Config(void) GPIO_InitTypeDef GPIo_InitStructure; /大使能DMA时钟大/ httpsstackedit.ia/viewer# 38 2016710 Stack Edit Viewer RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMAl, ENABLE); RCC APB2PeriphClockcmd (rcc aPB2Periph aDc1 RCC_ APB2Periph_ GPIOC, ENABLE; /大输入的GPIO口定义*/ GPto Initstructure, gPo pin GPIo Pin l1 GPo_ Instructure.GPI0_Mode=GPIO_Mode_AIN;//ADC必须为模拟输 入(输入后ADC转换为二进制) GPIO_Init(GPIOC &GPIo_Initstructure); //PC1,输 入时不用设置速率 static void aDc1_Mode_ Config(void) DMA_InitTypeDef DMA_Initstructure; ADC_InitTypeDef ADC_Initstructure; /大 dMa channel1 configuration为/ DMA_DeInit(DMAl_ Channel1); DMA_Initstructure DMA_Peri phera lBaseAddr = ADC1_DR_Address: //ADC地址 DMA_Initstructure DMA_MemoryBaseAddr (u32)&ADC_ Convertedvalue;//内存地址 DMA_Initstructure DMA_DIR- DMA_DIR_ Peri pheralsrC, DMA Initstructure DMa Buffersize =1 DMA_Initstructure DMA_PeripheralInc DMA_ PeripheralInc_ Disable;//外设地址固定 DMA_InitStructure DMA_MemoryInc =DMA_MemoryInc_Disable; / 内存地址固定 DMA_Initstructure DMA_PeripheralDatasize DMA_ PeripheralDatasize_HalfWord;//半字 DMA Initstructure. dMa Memory datasize DMA_MemoryDataSize_Halfword; DMA_InitStructure DMA_Mode DmA_Mode_circular; //循环传输 DMA Initstructure DMA M2M= DMA M2M Disable,7 DMA_InitStructure DMA_Priority =DMA_Priority_H h DMA_Init(DMAl_Channell, &DMA_Initstructure); / Enable dma channell * DMA- Cmd(dMal Channell, ENABLE) / ADCl configuration * ADC_InitStructure ADC_Mode =ADC_Mode_Independent; //4 nADC 模式 ADC Initstructure.ADC_ ScanConyMode= DISABLE;//禁止扫描模 式,扫描模式用于多通道采集 ADC_ Instructure.ADC_ Continuous convMode= ENABLE;//开启连续 转换模式,即不停地进行ADC转换 ADC_Initstructure ADC_ExternalTrigConv ADC_ ExternalTrigConv_None;//不使用外部触发转换 httpsstackedit.ia/viewer# 4/8 2016710 Stack Edit Viewer ADC_Initstructure ADC_DataAlign ADC_DataAlign_Right; //K 集数据石对齐 ADC InitStructure adc NbrofChannel= 1 //要转挨的通道数目1 ADC_Init(adc1, &ADC_InitStructure): /大配置ADC时钟,为PCLK2的8分频,即9Hz*/ RCC_ADCCLKConfig (RCC_PCLK2_Div8): /*配置ADC1的通道11为55,5个采样周期,序列为1*/ ADC_Regular Channe lConfig(ADC1, ADC_Channel_11, 1, ADC_ Sampletime_55Cycles5) / Enable adc1 DMa * ADC_DMACmd(adc1, ENABLE) / Enable ADC1 * ADC- Cmd (adCl, ENABLE); /+复位校准寄存器*/ ADC-Resetcalibration (adc1) /大等待校准奇存器复位完成*/ while(adc_ getResetcalibrationStatus (ADC1)); /大ADC校准/ ADC StartCalibration(adc1) /*等待校准完成* Thile(adc_getcalibrationstatus(adC1)); /大由于没有采用外部蝕发,所以使用软件触发ADC转换木/ ADC- SoftwareStartConv Cmd(adCl, ENABLE); void ADCl_Init(void) ADCl_GPIO_Config); ADCl_Mode_Config); 在main函数中读取 ADC Convertedvalue就为转换的到的值(一般来说转换为电压较 * f ADC_ConvertedValueLocal =(float) ADC_Convertedvalue /4096*3.3; ) i fi 必须在前面 extern下 ADC多通道转换(ADC多通道转换必须为 DMA方式) httpsstackedit.ia/viewer# 58 2016710 Stack Edit Viewer u8 DMAl_MEM_LEN; //DMA1的各通道[置 //这里的传输形式是固定的,这点要根据不同的情况来修改 //从外设模式->存储器/16位数据宽度/存储器增量模式 //cmar:存储器地址(自己定义的存储地址 AD DATA[4]) cntr:数据传输量,实际 上就是ADC要转换的路数(N) # define adcl_ dr Address((u32)×40012400+6X4c)//DMA传输的外设地址 ADC1_ DR Address是一个自定义的宏ADC_DR保存了ADC转换的值,以它作为DMA传输 的源地址 void DMA_ Config(u32 cmar, u16 cntr) DMA_InitTypeDef DMA_Initstructure RCC_AHBPeriphClock Cmd(RCC_AHBPeriph_DMAl, ENABLE);//AEDMA 时钟 DMA_ Reinit( dmai Channel1);//使用DMA的通道1,stm32有两个DMA 每个有7个通道 DMA_InitStructure DMA_Periphera lBaseAddr ADC1_DR_Address //DMA外设基地址 DMA Initstructure. DMA_ Memory BaseAddr=cmar;//DMA内存基地址 DMA_ Instructure.DMA_DIR=DMA_DIR_ Peri pheralsrc;/数据传输 方向,从外设发送到内存 DMA CCRX位4 DMA_ Initstructure. dMA_ Buffersize= cntr;//DMA通道的DMA缓存的 大小 DMA_Initstructure DMA_Peri pheralInc DMA_ PeripheralInc_ Disable;//外设地址寄存器不变 DMA_InitStructure DMA_MemoryInc=DMA_MemoryInc_Enable; //p 存地址寄存器递増 DMA Initstructure DMA Peri pheraldatasize DMA_ Periphera lDatasize_ Halfword;//外设数据宽度为16位 DMA-Initstructure. DMA- Memory datasize DMA_ MemoryDatasize_halfWord;//内存数据宽度为16位 DMA_ Initstructure. DMA Mode=DMA_Mode_ Circular;//工作在循环缓 存模式 DMA_工 nitstructure. DMA_ Priority= DMA_ Priority_ High;//DMA通道 x拥有高优先级 DMA_ Initstructure.DMAM2M=DMAM2M_ Disab1e;//DMA通道x没有设 置为内存到内存传输 DMA_Init(DMAl_Channell, &DMA_InitStructure;//TJE DMA_ Instruct中指定的参数初始化DMA的通道 USART1TX_DMA_ Channel所标识的 寄存器 # define n4//ADC1的通道数 extern ul6 AD_DATA[4]; httpsstackedit.ia/viewer# 6/8 2016710 Stack Edit Viewer void Adc_ Init(void) ADC_InitTypeDef ADC_Initstructure; GPIO_InitTypeDef GPIO_Initstructure; RCC_APB2Peri phClockCmd(rcc_APB2Periph_GPIOA RCC APB2 Periph_ADC1, ENABLE);//使能端口1的时钟和ADC1的时钟,因为ADC1 的通道1在PA1上 RCC_ADCCLKConfig( RCC PCLK2_Div6);//设置ADC分频因子6 72M/6=12M,ADC最大时间不能超过14M,也就是ADC的时钟频率为12MHz //PAⅹ作为模拟通道输入引脚 GPIo Initstructure. GPio Pin GPIO_Pin_o GPIO_Pin_l GPIo_Pin_3 GPIo_Pin_2 GPIo Initstructure GPio Mode GPIO Mode_aIn; /模拟输入引脚 GPIO_Init(GPIOA, &GPIO_Initstructure); ADC_ Deini t(ADCI);//复位ADC1,将外设ADC1的全部寄存器重设为缺省值 ADC_ Initstructure.ADC_Mode=ADC_Mode_ Independent;//本次实验 使用的是ADC1,并ADC1工作在独立模式ADC_CR1的位19:16,即这几位为⊙000 ADC Initstructure ADc ScanConv Mode = Enable //ADC_ ScanConyMode用来设置是否开启扫描模式,本实验开启扫面模式.ADC_CRI 的位8 ADC_Initstructure ADC_ Continuous Cony Mode ENABLE: //ADC_ Continuouscoη vMode用来改置是否开启连续转换模式模数转换工作在连续 转换模式,ADC_CR2的位1 ADC_Initstructure ADC_ExternalTrigConv ADC_ ExternatTrigConνNone;/转换由软件而不是外部触发启动ADC_CR2的 位19:17 ADC_Initstructure ADC_DataAlign =ADC_DataAlign_Right; //ADC 数据右对齐ADC_CR2的位11 ADC_ Initstructure, adC Nbrofchannel=N;//顺序进行规则转换的ADC 通道的数日ADC_SQR1位23:20 ADC_Init(ADC1,&ADC_ Initstructure);//根据ADC_ Instruct中指定 的参数初始化外设ADCx的寄存器 ADC_Regular Channe cOnfig(aDCl, ADC_Channel_0, 1, ADC_ SampleTime_55 Cycles5);/ADC1:;ADC1通道6;第1转换;采样时间为55周 期 ADC_Regu LarChanne l Config(ADCl, ADC_Channel_1, 2, ADC_ Samp letime55 Cycles5);//ADC1;ADC1通道1;第2转换;采样吋间为55周 期 ADC_RegularChannelConfig (adcl, ADC_channel_2, 3 ADC_ SampleTime_55Cycles5); //ADC1;ADC1通道1;第3转换;采样时间为5周期 ADC_Regular ChannelConfig (ADCl, ADC_Channel_3, 4, ADC_ Sampletime_55 Cycles5);//ADC1;ADC1通道3;第4转换;采样时间为55周 期 这里的ADC_ SampleTime可配置1.5、7.5、13.5、28.5、41.5、55,5、71.5、 httpsstackedit.ia/viewer# 718 2016710 Stack Edit Viewer 239.5其计算公式为T=采样周期+12.5个周期 本代码屮转换时间T=(55.5+12.5)/12 12为ADC时钟配置 注意你要输入的进行规则转换的通道数N要全部进行通道配置 ADC_ DMACmd(ADC1, ENABLE);//使能ADC1的DMA传输,ADC_CR2位8 ADC_Cmd(ADC1, ENABLE);//使能的ADC1,ADC_CR2位6 ADC_ Resetcalibration(ADC1);/使能复位校准,ADC_CR2位3 whiLe(ADC_ GetResetCalibration status(ADC1));//等待复位校准结束 ADC_ StartCalibration(ADC1);/开启AD校准,ADC_CR2位2 while(adC_GetCalibrationStatus(ADC1)); //等待校准结東 在main函数中先声明 define n4//ADC的通道数 u16 AD DATA[N];//AD转换的数字量 float value[N];/AD转换的模拟量 然后启动DMA Adc_工nit() DMA_- Config((u32)&AD_DATA, N) DMA_Cmd(DMA_ Channe11, ENAbLE);/启动DMA通道 ADC_ SoftwarestartConvcmd(ADC1, ENABLE);//软件启动AD转换 最后转换为电压即可 value [i] =(float)AD_DATA[i]*(3.3/4095) httpsstackedit.ia/viewer# 8/8

...展开详情
试读 8P 电子-adc.pdf
立即下载
限时抽奖 低至0.43元/次
身份认证后 购VIP低至7折
一个资源只可评论一次,评论内容不能少于5个字
您会向同学/朋友/同事推荐我们的CSDN下载吗?
谢谢参与!您的真实评价是我们改进的动力~
  • 至尊王者

关注 私信
上传资源赚钱or赚积分
最新推荐
电子-adc.pdf 25积分/C币 立即下载
1/8
电子-adc.pdf第1页
电子-adc.pdf第2页

试读结束, 可继续读1页

25积分/C币 立即下载