OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4025|回复: 1

求助程序哪里出了问题

[复制链接]

4

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2014-11-30
在线时间
3 小时
发表于 2014-12-23 16:55:56 | 显示全部楼层 |阅读模式
5金钱
PA1--PA5分别接了一个光电对管,光电对管是好的。
但是采集回来并经过计算的数据LED_[5]的元素都是240左右,找不出是什么原因。
用到了ADC5个通道,DMA传输数据。
这是我用一个十通道程序修改的,不知道哪里设置错了。

[mw_shl_code=c,true]u16 AD_collect[9][4]={0}; //最后一行是平均值,滤波用,求AD平均值,采集到的信号较稳定,可以用可以不用 u16 ADC_RCVTab[16];  //DAM内存基地址 void Adc_Init(void) { DMA_InitTypeDef DMA_InitStructure; ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); // 使能 DMA ! RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1, ENABLE ); //使能ADC1通道时钟 RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1| GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚 GPIO_Init(GPIOA, &GPIO_InitStructure); /*DMA1 channel1 configuration ----------------------------------------------*/ DMA_DeInit(DMA1_Channel1); //将DMA的通道1寄存器重设为缺省值 DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR; //定义DMA外设基地址为ADC1 DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC_RCVTab; //定义DMA内存基地址 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //外设作为数据传输的来源 DMA_InitStructure.DMA_BufferSize = 10; //定义指定DMA通道的DMA缓存的大小 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址寄存器不变 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址寄存器递增 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //数据宽度为16位 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //数据宽度为16位 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //工作在循环缓存模式 DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMA通道1拥有高优先级 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA通道1没有设置为内存到内存传输 DMA_Init(DMA1_Channel1, &DMA_InitStructure); /* Enable DMA1 channel1 */ DMA_Cmd(DMA1_Channel1, ENABLE); ADC_DeInit(ADC1); //复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在独立模式 ADC_InitStructure.ADC_ScanConvMode = ENABLE; //模数转换工作在扫描模式 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //模数转换工作在连续转换模式 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换由软件而不是外部触发启动 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐 ADC_InitStructure.ADC_NbrOfChannel = 5; //顺序进行规则转换的ADC通道的数目 ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器 /* ADC1 regular channel_5,configuration */ ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 3, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 4, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 5, ADC_SampleTime_55Cycles5); /* Enable ADC1 DMA */ ADC_DMACmd(ADC1, ENABLE); ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1 ADC_ResetCalibration(ADC1); //使能复位校准 while(ADC_GetResetCalibrationStatus(ADC1));      //等待复位校准结束 ADC_StartCalibration(ADC1); //开启AD校准 while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束 ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能 } void AD_check(void) //滤波时用,出来的AD值比较稳定,不会出现突变,随便试试时可以不用,通常在小车黑线时会用到滤波 { u8 kk; for(kk=0;kk<5;kk++) //取八次滤波 AD_collect[0][kk]=ADC_RCVTab[kk]; for(kk=0;kk<5;kk++) //取八次滤波 AD_collect[1][kk]=ADC_RCVTab[kk]; for(kk=0;kk<5;kk++) //取八次滤波 AD_collect[2][kk]=ADC_RCVTab[kk]; for(kk=0;kk<5;kk++) //取八次滤波 AD_collect[3][kk]=ADC_RCVTab[kk]; for(kk=0;kk<4;kk++) //取八次滤波 AD_collect[4][kk]=ADC_RCVTab[kk]; for(kk=0;kk<5;kk++) //取八次滤波 AD_collect[5][kk]=ADC_RCVTab[kk]; for(kk=0;kk<5;kk++) //取八次滤波 AD_collect[6][kk]=ADC_RCVTab[kk]; for(kk=0;kk<5;kk++) //取八次滤波 AD_collect[7][kk]=ADC_RCVTab[kk]; for(kk=0;kk<5;kk++) AD_collect[8][kk]=(AD_collect[0][kk]+AD_collect[1][kk]+AD_collect[2][kk]+AD_collect[3][kk]+AD_collect[4][kk]+AD_collect[5][kk]+AD_collect[6][kk]+AD_collect[7][kk])/8;  [/mw_shl_code] [mw_shl_code=c,true] for(kk=0;kk<5;kk++) { LED_[kk]=AD_collect[8][kk]; } } int GetLed(int k) { return LED_[k]; //不管光电管对着哪里都是240左右波动 }[/mw_shl_code]


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-12-23 23:24:43 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-27 14:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表