版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、网上很多类似资料,总结就是要么给出不完整的一部分,要么就是没有标注说明之类的,鞋面我给大家贴出实用型的,包括如何配置DMA和ADC,如何采集数据,如何处理数据/系统时钟使用72MHZunsigned short AD_Value5=0;/定义成半字节数组void RCC_Config(void)ErrorStatus HSEStartUpStatus;/定义枚举型变量RCC_DeInit();RCC_HSEConfig(RCC_HSE_ON);HSEStartUpStatus = RCC_WaitForHSEStartUp();if(HSEStartUpStatus=SUCCESS)RCC_H
2、CLKConfig(RCC_SYSCLK_Div1);RCC_PCLK2Config(RCC_HCLK_Div1);RCC_PCLK1Config(RCC_HCLK_Div2);FLASH_SetLatency(FLASH_Latency_2);FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);RCC_PLLCmd(ENABLE);while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)=RESET);RCC_SY
3、SCLKConfig(RCC_SYSCLKSource_PLLCLK);while(RCC_GetSYSCLKSource()!=0x08);/-打开设备时钟-/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOF,ENABLE);/RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);/开串口1和ADC1的时钟void ADC_Start(void)DMA_Cmd(DMA1_Channel1, ENABLE); /启动DMA
4、通道ADC_SoftwareStartConvCmd(ADC1, ENABLE);/软件启动转换void DMA_ADC_Config(void)ADC_InitTypeDef ADC_InitStructure;DMA_InitTypeDef DMA_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; /
5、设置成模拟输入GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_0);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; /设置成模拟输入GPIO_Init(GPIOB, &GPIO_InitStructure);RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);/开ADC1的时钟RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE); /开DMA时钟RCC
6、_ADCCLKConfig(RCC_PCLK2_Div8);/配置ADC时钟,为PCLK2的8分频,即9MHzDMA_DeInit(DMA1_Channel1);/ADC挂接在DMA的通道1上DMA_InitStructure.DMA_PeripheralBaseAddr = ADC_DR_ADDRESS; /DMA外设ADC基地址DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&AD_Value;DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; /内存作为数据传输的目的地DMA_InitStructu
7、re.DMA_BufferSize = 5; /DMA通道的DMA缓存的大小 系统用5个通道DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; /外设地址寄存器不变 即地址ADC1-DR不变DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; /内存地址寄存器递增 即数组AD_Value地址增加DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; /数据宽度为16
8、位,这里尤其注意因为选择的是半字节的,所以定义数组的时候也要定义成半字节数组,否则采集数据出乱,很多人是贴出资料来了,但是根本没有把这些注意点写明DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; /数据宽度为16位DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; /工作在循环缓存模式DMA_InitStructure.DMA_Priority = DMA_Priority_High; /DMA通道 x拥有高优先级DMA_InitStructure.DMA_M2M
9、= DMA_M2M_Disable; /DMA通道x设置为非内存到内存传输DMA_Init(DMA1_Channel1, &DMA_InitStructure);/DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE);ADC_DeInit(ADC1);ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; /ADC工作模式:ADC1和ADC2工作在独立模式ADC_InitStructure.ADC_ScanConvMode =ENABLE; /模数转换工作在扫描模式ADC_InitStructure.ADC_Co
10、ntinuousConvMode = ENABLE;/连续转换/ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; /注意不要使用持续转换模式,否则只要触发一次后续的转换就会永不停歇(除非CONT清0),这样第一次以后的ADC,就不是由TIM1_CC1来触发了 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; /ADC数据右对齐ADC_InitStru
11、cture.ADC_NbrOfChannel = 5; /顺序进行规则转换的ADC通道的数目ADC_Init(ADC1, &ADC_InitStructure); /根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器/设置指定ADC的规则组通道,设置它们的转化顺序和采样时间ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_239Cycles5);ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 2, ADC_SampleTime_239Cycles5);A
12、DC_RegularChannelConfig(ADC1, ADC_Channel_6, 3, ADC_SampleTime_239Cycles5);ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 4, ADC_SampleTime_239Cycles5);ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 5, ADC_SampleTime_239Cycles5);ADC_ExternalTrigInjectedConvCmd(ADC1,DISABLE);ADC_DMACmd(ADC1, ENABLE); /
13、 开启ADC的DMA支持(要实现DMA功能,还需独立配置DMA通道等参数)ADC_Cmd(ADC1, ENABLE); /使能指定的ADC1ADC_ResetCalibration(ADC1);/复位校准寄存器while(ADC_GetResetCalibrationStatus(ADC1); /获取ADC1复位校准寄存器的状态,设置状态则等待ADC_StartCalibration(ADC1); /开始指定ADC1的校准状态while(ADC_GetCalibrationStatus(ADC1); /获取指定ADC1的校准程序,设置状态则等待ADC_Start();/数据采集处理void A
14、DC_DateProcess(void)unsigned char i,k,h;unsigned int Buf=0;/递推 先进先出原理ADCCollect.PVVoltageBuf9=get_ChannelVale(ADC_Channel_4)&0xfff;ADCCollect.BatteryVoltageBuf9=get_ChannelVale(ADC_Channel_5)&0xfff;ADCCollect.CirTem1Buf9=get_ChannelVale(ADC_Channel_6)&0xfff;ADCCollect.BatteryChargeCurrentBuf9=get_Ch
15、annelVale(ADC_Channel_7)&0xfff;ADCCollect.BatteryDisChargeCurrentBuf9=get_ChannelVale(ADC_Channel_8)&0xfff;for(i=0;i9;i+)ADCCollect.PVVoltageBufi=ADCCollect.PVVoltageBuf1+i;ADCCollect.BatteryVoltageBufi=ADCCollect.BatteryVoltageBuf1+i;ADCCollect.CirTem1Bufi=ADCCollect.CirTem1Buf1+i;ADCCollect.Batter
16、yChargeCurrentBufi=ADCCollect.BatteryChargeCurrentBuf1+i; ADCCollect.BatteryDisChargeCurrentBufi=ADCCollect.BatteryDisChargeCurrentBuf1+i;/排序for(k=0; k9; k+ )/for(h=0 ; h ADCCollect.PVVoltageBufh+1)Buf = ADCCollect.PVVoltageBufh+1;ADCCollect.PVVoltageBufh+1 = ADCCollect.PVVoltageBufh;ADCCollect.PVVo
17、ltageBufh = Buf;Buf=0;if(ADCCollect.BatteryVoltageBufh ADCCollect.BatteryVoltageBufh+1)Buf = ADCCollect.BatteryVoltageBufh+1;ADCCollect.BatteryVoltageBufh+1 = ADCCollect.BatteryVoltageBufh;ADCCollect.BatteryVoltageBufh = Buf;Buf=0;if(ADCCollect.CirTem1Bufh ADCCollect.CirTem1Bufh+1)Buf = ADCCollect.C
18、irTem1Bufh+1;ADCCollect.CirTem1Bufh+1 = ADCCollect.CirTem1Bufh;ADCCollect.CirTem1Bufh = Buf;Buf=0;if(ADCCollect.BatteryChargeCurrentBufh ADCCollect.BatteryChargeCurrentBufh+1)Buf = ADCCollect.BatteryChargeCurrentBufh+1;ADCCollect.BatteryChargeCurrentBufh+1 = ADCCollect.BatteryChargeCurrentBufh;ADCCo
19、llect.BatteryChargeCurrentBufh = Buf;ADCCollect.CirTem1=0;ADCCollect.BatteryChargeCurrent=0;ADCCollect.BatteryDisChargeCurrent=0;ADCCollect.BatteryVoltage=0;ADCCollect.PVVoltage=0;/去掉最大值和最小值 取平均值for(i=3;i7;i+)/ADCCollect.CirTem1+=ADCCollect.CirTem1Bufi;ADCCollect.BatteryChargeCurrent+=ADCCollect.Bat
20、teryChargeCurrentBufi;ADCCollect.BatteryDisChargeCurrent+=ADCCollect.BatteryDisChargeCurrentBufi;ADCCollect.BatteryVoltage+=ADCCollect.BatteryVoltageBufi;ADCCollect.PVVoltage+=ADCCollect.PVVoltageBufi;ADCCollect.CirTem1=ADCCollect.CirTem1/4;ADCCollect.BatteryChargeCurrent=ADCCollect.BatteryChargeCurrent/4;ADCCollect.BatteryDisChargeCurrent=ADCCollect.BatteryDisChargeCurrent/4;ADCCollect.BatteryVoltage=ADCCollect.BatteryVoltage/4;ADCCollect.PVVoltage=ADCCollect.PVVoltage/4;/充电电流ADCCollect.BatteryChargeCurrent=(ADCCollect.BatteryChargeCurrent*33)/4096;ADCCollect.BatteryC
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026云南昆明巫家坝建设发展有限责任公司校园招聘15人备考题库完整附答案详解
- 2026广东佛山高明技师学院、佛山市高明区职业技术学校招聘事业编制教师8人备考题库及参考答案详解【新】
- 2026北京市政路桥股份有限公司招聘26人备考题库【巩固】附答案详解
- 2026中共江西省委党校(江西行政学院)高层次人才招聘37人备考题库附答案详解(a卷)
- 2026湖北宜昌市“招才兴业”教育系统事业单位校园专项招聘7人备考题库(三峡大学站)(考点梳理)附答案详解
- 2026贵州省旅游产业发展集团有限公司招聘3人备考题库参考答案详解
- 2026黑龙江大庆市人民医院招聘助理护士岗位外聘人员备考题库及参考答案详解(模拟题)
- 2026河南安阳高新区就业见习单位及就业见习岗位招募备考题库【考点提分】附答案详解
- 2026上半年北京事业单位统考市统计局招聘1人备考题库附参考答案详解(突破训练)
- 2026清明上河园招聘备考题库及答案详解【夺冠系列】
- 电磁技术的应用
- 2025年计量专业案例分析(一级注册计量师)真题试卷及答案
- 广西钦州市2025-2026学年高二上学期1月月考语文试题(含答案)
- 物业前期秩序维护部培训
- 2025急性缺血性卒中血管内治疗并发症重症管理专家共识课件
- 2026年ipmpd级考试试题
- 2026年浙江机电职业技术学院单招职业技能考试备考试题带答案解析
- 义务教育道德与法治课程标准日常修订版(2022年版2025年修订)
- 2026年商丘学院单招(计算机)测试备考题库必考题
- 2025年卫生管理初级师考试真题及答案
- 企业信息系统维护手册与模板
评论
0/150
提交评论