OpenEdv-开源电子网

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

DMA方式的ADC疑问,望大家帮助....

[复制链接]

29

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
189
金钱
189
注册时间
2013-8-4
在线时间
0 小时
发表于 2013-8-22 20:58:22 | 显示全部楼层 |阅读模式

按照原子哥的ADC例程,做了DMA方式的实验,设置了“u16 rambuffer[100]”,思想是当传输结束后求这100个平均值,然后算出来电压,但是调试了很长时间,
遇到了很多问题解决不了。按说,杜邦线一端不接电压端TFT会显示0,但是TFT端显示的不是0,好像是一个随机数,而且一直在变。接了GND,3.3V和其他IO口时,
变为随着灯的翻转在两个值之间变动,,两个值之间幅度很大。
主函数:
dma_init((u32)&ADC1->DR,(u32)rambuffer);      
 while(1)
 {
    while(!DMA_GetFlagStatus(DMA1_FLAG_TC1));
     for(i=0;i<100;i++)
              sumval+=rambuffer;
     adcx=sumval/100;
     DMA_ClearFlag(DMA1_FLAG_TC1);
  LCD_ShowNum(156,130,adcx,6,16);//显示ADC的值
  temp=(float)adcx*(3.3/4096);
  adcx=temp;
  LCD_ShowNum(156,150,adcx,1,16);//显示电压值
  temp-=adcx;
  temp*=1000;
  LCD_ShowNum(172,150,temp,3,16);
  LED0=!LED0;
  delay_ms(250);
 }
//DMA初始化函数
void dma_init(u32 raddr,u32 buffer)
{
 DMA_InitTypeDef DMA_InitStructure;
 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
 DMA_DeInit(DMA1_Channel1);
 DMA_InitStructure.DMA_PeripheralBaseAddr=raddr;
 DMA_InitStructure.DMA_MemoryBaseAddr=buffer;
 DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;
 DMA_InitStructure.DMA_BufferSize=100;
 DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
 DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;
 DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;
 DMA_InitStructure.DMA_MemoryDataSize=DMA_PeripheralDataSize_HalfWord;
 DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;
 DMA_InitStructure.DMA_Priority=DMA_Priority_Medium;
 DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;
 DMA_Init(DMA1_Channel1,&DMA_InitStructure);
 ADC_DMACmd(ADC1,ENABLE);
 DMA_Cmd(DMA1_Channel1,ENABLE); 
}
//ADC初始化函数
void  Adc_Init(void)
{  
 ADC_InitTypeDef ADC_InitStructure;
 GPIO_InitTypeDef GPIO_InitStructure;
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1 , ENABLE );   //使能ADC1通道时钟
 
 RCC_ADCCLKConfig(RCC_PCLK2_Div6);  
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; 
 GPIO_Init(GPIOA, &GPIO_InitStructure); 

 ADC_DeInit(ADC1); 

 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
 ADC_InitStructure.ADC_ScanConvMode = DISABLE; 
 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; 
 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; 
 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; 
 ADC_InitStructure.ADC_NbrOfChannel = 1; 
 ADC_Init(ADC1, &ADC_InitStructure); 
 

 ADC_Cmd(ADC1, ENABLE);  
 ADC_ResetCalibration(ADC1); 
 while(ADC_GetResetCalibrationStatus(ADC1)); 
 ADC_StartCalibration(ADC1); 
 while(ADC_GetCalibrationStatus(ADC1)); 
 ADC_SoftwareStartConvCmd(ADC1, ENABLE); 

}  

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2013-8-22 22:55:07 | 显示全部楼层
参考别人代码吧,论坛好多网友发过ADC DMA代码 的了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2013-12-16
在线时间
0 小时
发表于 2014-3-19 17:21:47 | 显示全部楼层
回复【楼主位】蜗牛小安:
---------------------------我也遇到类似问题,楼主怎么解决的
回复 支持 反对

使用道具 举报

29

主题

311

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1530
金钱
1530
注册时间
2012-9-4
在线时间
262 小时
发表于 2014-3-25 11:06:58 | 显示全部楼层
“杜邦线一端不接电压端TFT会显示0“,当你不接的时候肯定会出现乱码啊,你上拉个电阻应该就好了。。。。或下拉。。。。
STM32---STM32---STM32---STM32---STM32---STM32---STM32---STM32---STM32
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-13 06:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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