OpenEdv-开源电子网

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

AD-DMA采集两路电压,急急急

[复制链接]

3

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2013-10-16
在线时间
0 小时
发表于 2013-11-2 21:46:15 | 显示全部楼层 |阅读模式
用AD+DMA采集三路电压出问题了,我就改为简单的采集两路,但是串口上输出的数据一直有问题,搞了几天了,求指教


问题描述如下:


(1)当通道10接地,通道11接vcc时:通道10采的数为很大的一个值,通道11采的为0;我让通道10采集电压端悬空,通道11接vcc,两个采的值还跟刚刚的一 样;让通道11悬空,通道10接地,那么通道10采集的就正常了,但是通道11的始终为0;
(2)当通道11接地,通道10接vcc时,两个通道采集的电压为正常的,我让通道10那端悬空,通道11接地后,通道10采的将是一个随机数,通道11采的始终为0(这个没问题);我让通道10接vcc,通道11那端悬空,通道10采集的没问题,但是通道11始终为0; 

总结:通道11一直都是有问题的,采的值永远为0,而且只要通道11接vcc会对通道10产生影响,其他情况是没问题的。很费解,程序有问题??
程序代码如下:

void adc1_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure; 

/* Enable ADC1 and GPIOC clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC, ENABLE);  
/*configue ADC clock*/
RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //分频因子6时钟为72M/6=12MHz
/* Configure PC.01 (ADC Channel10),PC.02 (ADC Channel11) as analog input -------------------------*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOC, &GPIO_InitStructure);

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //设置ADC工作在独立模式
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_InitStructure.ADC_NbrOfChannel = 2;  //规则序列的长度,ADC通道的数目1(范围为1~16)
ADC_Init(ADC1, &ADC_InitStructure);

/* ADC1 regular channel 10-13 configuration 通道10先转换后到通道11再到通道13*/ 
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_239Cycles5 ); //配置采样时间为239.5周期
ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_239Cycles5 ); //配置采样时间为239.5周期
// ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 3, ADC_SampleTime_239Cycles5 ); //配置采样时间为239.5周期  


ADC_DMACmd(ADC1, ENABLE); //使能ADC1的DMA传输 ,原本ADC上没有的,注意添加

/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);
/* Enable ADC1 reset calibaration register */   
ADC_ResetCalibration(ADC1); //重置指定的ADC的校准寄存器
/* Check the end of ADC1 reset calibration register */
while(ADC_GetResetCalibrationStatus(ADC1));   //获取ADC重置校准寄存器的状态
/* Start ADC1 calibaration */
ADC_StartCalibration(ADC1); //开始指定ADC的校准状态
/* Check the end of ADC1 calibration */
while(ADC_GetCalibrationStatus(ADC1)); //等待校准AD结束
/* Start ADC1 Software Conversion */ 
// ADC_SoftwareStartConvCmd(ADC1, ENABLE); //软件启动转换
}


void DMA_Configuration(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{  
    DMA_InitTypeDef DMA_InitStructure;

  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //使能DMA时钟
    DMA_DeInit(DMA_CHx);   //将DMA的通道1寄存器重设为缺省值

DMA_InitStructure.DMA_PeripheralBaseAddr = cpar;  //DMA外设基地址
DMA_InitStructure.DMA_MemoryBaseAddr = cmar;  //DMA内存基地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  //数据传输方向,从外设发送到内存  DMA_CCRX位4
DMA_InitStructure.DMA_BufferSize = cndtr;  //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通道 x拥有中优先级 
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  //DMA通道x没有设置为内存到内存传输
DMA_Init(DMA_CHx, &DMA_InitStructure);  //根据DMA_InitStruct中指定的参数初始化DMA的通道USART1_Tx_DMA_Channel所标识的寄存器  



#include "sys_config.h"  
#include "stm32f10x.h"
#include "usart.h"
#include "adc.h"
#include "delay.h"
#include "dma.h"   
#define  Channel_Number 2 // 通道数的宏定义
u32  AD_Digital_Value[Channel_Number]; //AD采样值
//unsigned int AD_Digital_Value[Channel_Number]; //AD采样值
float AD_Analog_Value[Channel_Number]; //AD模拟电压值


/*******************************************************************************
  * @函数名称 main
  * @函数说明   主函数 
  * @输入参数   无
  * @输出参数   无
  * @返回参数   无
  *****************************************************************************/
int main(void)
{
    RCC_Configuration(); //时钟配置
// NVIC_Configuration(); //中断配置,其实没用到中断
GPIO_Configuration(); //配置F.7口
USART1_Configuration(); //USART1初始化 
// printf("\r\n three channels of votage: \r\n") ;
// GPIO_SetBits(GPIOF, GPIO_Pin_7);
DMA_Configuration(DMA1_Channel1,(u32)&ADC1->DR,(u32)AD_Digital_Value,Channel_Number );//DMA1通道1;外设为ADC1;
adc1_Configuration();    //ADC初始化
// DMA_Cmd(DMA1_Channel1, DISABLE);
DMA_Cmd(DMA1_Channel1, ENABLE);//启动DMA通道,应该先启动DMA,再启动AD
ADC_SoftwareStartConvCmd(ADC1, ENABLE);//软件启动AD转换
while (1)
{
   u8 i;
   /*控制led灯的亮灭*/
GPIO_ResetBits(GPIOF, GPIO_Pin_7);
delay_ms(1000) ;
GPIO_SetBits(GPIOF, GPIO_Pin_7);
delay_ms(1000) ;
//    while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//等待传输完成否则第一位数据容易丢失 
        for( i=0;i<Channel_Number;i++)
{
//AD_Digital_Value=Get_Adc_Average(ADC_Channel_1,10); //获取AD转换值,10个求一个平均值,更加精确
AD_Analog_Value=(float)AD_Digital_Value*(3.3/4096);
}
printf("\r\n channel_10_digital:%d  channel_10_annalog:%f \r\n",AD_Digital_Value[0],AD_Analog_Value[0]);
printf("\r\n channel_11_digital:%d  channel_11_analog:%f \r\n",AD_Digital_Value[1],AD_Analog_Value[1]);
// printf("\r\n channel_12_digital:%d  channel_12_analog:%f \r\n",AD_Digital_Value[0],AD_Analog_Value[0]);
}
}



有人遇到过这样的问题吗???













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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-11-2 22:34:10 | 显示全部楼层
回复 支持 反对

使用道具 举报

3

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2013-10-16
在线时间
0 小时
 楼主| 发表于 2013-11-3 15:11:46 | 显示全部楼层
回复【2楼】正点原子:
--------------------------------
原子哥,给支支招啊,不知道如何去搞了,采一路电压是没问题的,但是两路就出问题了
回复 支持 反对

使用道具 举报

3

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2013-10-16
在线时间
0 小时
 楼主| 发表于 2013-11-3 17:02:27 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
感谢原子哥帮顶,两路问题成功解决,回头我再试试多路
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-11-3 19:39:22 | 显示全部楼层
回复【4楼】tangzhao_01:
---------------------------------
恭喜。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

8

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2013-10-29
在线时间
6 小时
发表于 2013-11-16 09:07:37 | 显示全部楼层
回复【楼主位】tangzhao_01:
---------------------------------
楼主,请问是什么原因呢,我也正在学习ADC,可以的话能否分享下源码喽
回复 支持 反对

使用道具 举报

9

主题

156

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2013-9-24
在线时间
0 小时
发表于 2013-11-16 10:13:56 | 显示全部楼层
回复【6楼】gzw19900817:
---------------------------------
一看就是复用时钟没开 ⊙﹏⊙b
人需要沐浴阳光,也必将经历风雨
回复 支持 反对

使用道具 举报

16

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
144
金钱
144
注册时间
2013-11-13
在线时间
0 小时
发表于 2013-11-19 21:15:58 | 显示全部楼层
回复【4楼】tangzhao_01:
---------------------------------
请问最后是怎么解决的?学习下!
回复 支持 反对

使用道具 举报

3

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2013-10-16
在线时间
0 小时
 楼主| 发表于 2013-11-23 10:46:39 | 显示全部楼层
回复【8楼】黑小子mxx:
---------------------------------
一个变量定义的类型问题,呵呵、、、、搞了好几天
回复 支持 反对

使用道具 举报

3

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2013-10-16
在线时间
0 小时
 楼主| 发表于 2013-11-23 10:48:52 | 显示全部楼层
回复【6楼】gzw19900817:
---------------------------------
http://www.openedv.com/posts/list/0/23026.htm?privmsg=1#135268
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-8 16:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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