OpenEdv-开源电子网

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

ADC-DMA问题

[复制链接]

29

主题

92

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
228
金钱
228
注册时间
2013-5-4
在线时间
0 小时
发表于 2014-3-6 20:57:08 | 显示全部楼层 |阅读模式
u16 a[20];
void atest(void)
{
 u16 adcx0,i,n;
 u16 max=a[0];
 float temp;
 MYDMA_Enable(DMA1_Channel1);
 ADC1->CR2|=1<<22;
 while(!(DMA1->ISR&1<<1)); 
 DMA1->IFCR|=1<<1; 
for(i=0;i<20;i++)
 {
   a=ADC_Buf[0];
 }
for(n=0;n<20;n++)
   {
    if(a>max)
     max=a;
   }  
 temp=(float)max*(3.3/4096);
 max=temp;
 LCD_ShowNum(60,85,max,2,16);
 LCD_ShowString(76,85,lcddev.width,16,16,".");
 temp-=max;
 temp*=100;
 LCD_ShowNum(84,85,temp,2,16);
 LED0=!LED0;
 delay_ms(250);  
}
原子哥,我想通过AD采集单路正弦信号的最大值,(因为我后续要扩展多路,所以想用DMA传输,DMA传输已经弄好了,)想着把DMA传输的数据放到一个数组里,然后求最大值,可是我试了试显示的好像还是瞬时值,程序见上,帮我看看什么原因吧
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-3-6 21:24:22 | 显示全部楼层
回复【楼主位】lixulongren:
---------------------------------
代码是没问题,只是你这20个值,确定采集了一个正弦波周期么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

29

主题

92

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
228
金钱
228
注册时间
2013-5-4
在线时间
0 小时
 楼主| 发表于 2014-3-7 09:51:03 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
回复【2楼】正点原子:
--------------------------------
采集了四个正弦波周期的
回复 支持 反对

使用道具 举报

29

主题

92

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
228
金钱
228
注册时间
2013-5-4
在线时间
0 小时
 楼主| 发表于 2014-3-7 10:55:47 | 显示全部楼层
回复【3楼】lixulongren:
---------------------------------
我想既然AD转换一次 DMA传输一次,那看看程序好像DMA传输完成之后加一个for循环语句没有什么意义啊,是不是啊?
回复 支持 反对

使用道具 举报

29

主题

92

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
228
金钱
228
注册时间
2013-5-4
在线时间
0 小时
 楼主| 发表于 2014-3-7 14:11:46 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
还有一点就是,我就是为了求多路信号中每一路的最大值,有必要用DMA吗
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-3-7 16:03:20 | 显示全部楼层
回复【5楼】lixulongren:
---------------------------------
你一说,还真有问题:
for(i=0;i<20;i++)
 {
   a=ADC_Buf[0];
 }
这个a都是ADC_Buf[0]的值啊。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

29

主题

92

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
228
金钱
228
注册时间
2013-5-4
在线时间
0 小时
 楼主| 发表于 2014-3-10 13:34:19 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
不懂原子哥的意思,我确实用a存放ADC_Buf[0]的值,然后对a数组里边的值进行大小比较,这不就找到a最大值了吗?然后b存放ADC_Buf[1]的值,然后对b数组里边的值进行大小比较,这不就找到b最大值了吗?我程序好像就是这个意思啊,可是结果不对的,还有一点就是为了求多路信号中每一路的最大值,有必要用DMA吗
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-3-10 13:54:11 | 显示全部楼层
回复【7楼】lixulongren:
---------------------------------
你再好好考虑下吧,复习下c语言,或者分析下逻辑。
你最开始的时候就错了,也就是我5楼的代码。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13083
金钱
13083
注册时间
2012-11-26
在线时间
3809 小时
发表于 2014-3-10 15:45:31 | 显示全部楼层
回复【7楼】lixulongren:

回复【6楼】正点原子:
---------------------------------
不懂原子哥的意思,我确实用a存放ADC_Buf[0]的值,然后对a数组里边的值进行大小比较,这不就找到a最大值了吗?然后b存放ADC_Buf[1]的值,然后对b数组里边的值进行大小比较,这不就找到b最大值了吗?我程序好像就是这个意思啊,可是结果不对的,还有一点就是为了求多路信号中每一路的最大值,有必要用DMA吗

---------------------------------
一直抓的同一个值   再平均  依然是那个值啊
学无止境
回复 支持 反对

使用道具 举报

29

主题

92

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
228
金钱
228
注册时间
2013-5-4
在线时间
0 小时
 楼主| 发表于 2014-3-10 18:55:11 | 显示全部楼层
我调出来了,两路没有用DMA,程序见下。不知道对于多于两路不用DMA行不行,望原子哥给点建议啊
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h" 
#include "key.h"
#include "exti.h"
#include "wdg.h"
#include "timer.h"
#include "lcd.h"    
#include "rtc.h"
#include "wkup.h"
#include "adc.h"
//Mini STM32开发板范例代码13
//ADC 实验
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
#define N 100
int main(void)
{
u16 i,j;
u16 value_buf[N];
u16 value_buf1[N];
  u16 max1=value_buf[0];
  u16 max2=value_buf1[0];
float temp;
  Stm32_Clock_Init(9);//系统时钟设置
delay_init(72); //延时初始化
uart_init(72,9600); //串口1初始化   
LED_Init();
LCD_Init();  
Adc_Init();
POINT_COLOR=RED;//设置字体为红色 
LCD_ShowString(60,50,"Mini STM32");
LCD_ShowString(60,70,"ADC TEST");
LCD_ShowString(60,90,"ATOM@ALIENTEK");
LCD_ShowString(60,110,"2010/12/30");
//显示提示信息
POINT_COLOR=BLUE;//设置字体为蓝色
LCD_ShowString(60,130,"ADC_CH0_VAL:");       
LCD_ShowString(60,150,"ADC_CH0_VOL:0.000V");
LCD_ShowString(60,170,"ADC_CH0_VAL:");       
LCD_ShowString(60,190,"ADC_CH0_VOL:0.000V");
while(1)

//通道1取最大值
for(i=0;i<N;i++)
{
value_buf=Get_Adc(ADC_CH1);
}
for (j=0;j<N;j++)  
    {
     if(value_buf[j]>max1)
        max1=value_buf[j];
  } 
LCD_ShowNum(156,130,max1,4,16);//显示ADC的值
temp=(float)max1*(3.3/4096);
max1=temp;
LCD_ShowNum(156,150,max1,1,16);//显示电压值
temp-=max1;
temp*=1000;
LCD_ShowNum(172,150,temp,3,16);
 
//通道0最大值  
for(i=0;i<N;i++)
{
value_buf1=Get_Adc(ADC_CH0);
}
for (j=0;j<N;j++)  
    {
     if(value_buf1[j]>max2)
        max2=value_buf1[j];     
 }
LCD_ShowNum(156,170,max2,4,16);//显示ADC的值
temp=(float)max2*(3.3/4096);
max2=temp;
LCD_ShowNum(156,190,max2,1,16);//显示电压值
temp-=max2;
temp*=1000;
LCD_ShowNum(172,190,temp,3,16);  
LED0=!LED0;
delay_ms(250); 
}
}
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-3-11 23:46:48 | 显示全部楼层
回复【10楼】lixulongren:
---------------------------------
当然可以啊。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-13 23:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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