OpenEdv-开源电子网

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

ADC+DMA多通道采集电压问题

[复制链接]

19

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2012-9-7
在线时间
0 小时
发表于 2012-10-12 15:16:49 | 显示全部楼层 |阅读模式
#include"stm32f10x.h"
#include"adc.h"
#define BUF_SIZE 4
extern u16 ADC_Value[BUF_SIZE];

void ADC_Configuration(void)
{
ADC_InitTypeDef ADC_InitStructure; 
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1,ENABLE );  //使能ADC1通道时钟
 
RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //72M/6=12,ADC最大时间不能超过14M
//PA0/1/2/3 作为模拟通道输入引脚                         
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);  //将外设 ADC1 的全部寄存器重设为缺省值
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=4; //总的采集通道数量
ADC_Init(ADC1,&ADC_InitStructure);

ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_1,2,ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_2,3,ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_3,4,ADC_SampleTime_239Cycles5);

ADC_DMACmd(ADC1,ENABLE);//使能ADC1的DMA
ADC_Cmd(ADC1,ENABLE);
ADC_ResetCalibration(ADC1); //ADC1复位校准
while(ADC_GetResetCalibrationStatus(ADC1)); //检测ADC1的复位校准是否结束

ADC_StartCalibration(ADC1);//启动ADC1校准
while(ADC_GetCalibrationStatus(ADC1));//等待ADC1校准结束
}

void DMA_Configuration()
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//使能DMA传输
DMA_DeInit(DMA1_Channel1);//ADC1对应DMA1的第一通道
DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)&ADC1->DR;//自己定义外设地址
DMA_InitStructure.DMA_MemoryBaseAddr=(u32)ADC_Value;//目的地址
DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;//单向传输,DST双向传输
DMA_InitStructure.DMA_BufferSize=BUF_SIZE;
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_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;//连续不断的循环模式
DMA_InitStructure.DMA_Priority=DMA_Priority_High;//优先级高
DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;//禁止内存到内存模式
DMA_Init(DMA1_Channel1,&DMA_InitStructure);

DMA_Cmd(DMA1_Channel1,ENABLE);//打开DMA
ADC_SoftwareStartConvCmd(ADC1,ENABLE);//软件启动ADC1转换,必须在配置好DMA以后
}


最后一通道的电压值怎么不变呢?


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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-10-12 22:33:01 | 显示全部楼层
看代码貌似没问题哦,最后一个通道值为多少?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

19

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2012-9-7
在线时间
0 小时
 楼主| 发表于 2012-10-13 08:04:20 | 显示全部楼层
原子哥错了,最后一通道没有接入待测电压,接入第四通道后是对的!呵呵
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-20 04:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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