OpenEdv-开源电子网

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

同时使用ADC1 ADC3

[复制链接]

40

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
402
金钱
402
注册时间
2014-8-7
在线时间
10 小时
发表于 2014-9-17 19:57:09 | 显示全部楼层 |阅读模式
5金钱
已经把ADC1的16个通道(7寸屏占了一个PB1)全用上了(扫描模式,连续转换)还是差一个,所以使用ADC3的通道4,但是一使用ADC3数据就全都不对了,不知道扫描原因?
[mw_shl_code=c,true]void ADCChannel_Init(void) { ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOF|RCC_APB2Periph_ADC1|RCC_APB2Periph_ADC3,ENABLE); //设置引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//模拟输入 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC,&GPIO_InitStructure);//PC0 PC1 PC2 PC3 PC4 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7; GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_Init(GPIOB,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_Init(GPIOF,&GPIO_InitStructure); //设置ADC1 ADC_DeInit(ADC1);//复位ADC1,ADC1的所有寄存器恢复缺省值 RCC_ADCCLKConfig(RCC_PCLK2_Div6);//设置六分频,ADC的最大频率不要超过14M,否则精度下降 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=15;//顺序进行规制转换的ADC通道的数目 ADC_Init(ADC1,&ADC_InitStructure); ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_239Cycles5);//ADC1,通道0,采样顺序为1,采样周期239.5 ADC_RegularChannelConfig(ADC1,ADC_Channel_1,2,ADC_SampleTime_239Cycles5);//ADC1,通道1,采样顺序为2,采样周期239.5 ADC_RegularChannelConfig(ADC1,ADC_Channel_2,3,ADC_SampleTime_239Cycles5);//ADC1,通道2,采样顺序为3,采样周期239.5 ADC_RegularChannelConfig(ADC1,ADC_Channel_3,4,ADC_SampleTime_239Cycles5);//ADC1,通道3,采样顺序为4,采样周期239.5 ADC_RegularChannelConfig(ADC1,ADC_Channel_4,5,ADC_SampleTime_239Cycles5);//ADC1,通道4,采样顺序为5,采样周期239.5 ADC_RegularChannelConfig(ADC1,ADC_Channel_5,6,ADC_SampleTime_239Cycles5);//ADC1,通道5,采样顺序为6,采样周期239.5 ADC_RegularChannelConfig(ADC1,ADC_Channel_6,7,ADC_SampleTime_239Cycles5);//ADC1,通道6,采样顺序为7,采样周期239.5 ADC_RegularChannelConfig(ADC1,ADC_Channel_7,8,ADC_SampleTime_239Cycles5);//ADC1,通道7,采样顺序为8,采样周期239.5 ADC_RegularChannelConfig(ADC1,ADC_Channel_8,9,ADC_SampleTime_239Cycles5);//ADC1,通道10,采样顺序为11,采样周期239.5 ADC_RegularChannelConfig(ADC1,ADC_Channel_10,10,ADC_SampleTime_239Cycles5);//ADC1,通道10,采样顺序为11,采样周期239.5 ADC_RegularChannelConfig(ADC1,ADC_Channel_11,11,ADC_SampleTime_239Cycles5);//ADC1,通道11,采样顺序为12,采样周期239.5 ADC_RegularChannelConfig(ADC1,ADC_Channel_12,12,ADC_SampleTime_239Cycles5);//ADC1,通道12,采样顺序为13,采样周期239.5 ADC_RegularChannelConfig(ADC1,ADC_Channel_13,13,ADC_SampleTime_239Cycles5);//ADC1,通道13,采样顺序为14,采样周期239.5 ADC_RegularChannelConfig(ADC1,ADC_Channel_14,14,ADC_SampleTime_239Cycles5);//ADC1,通道14,采样顺序为15,采样周期239.5 ADC_RegularChannelConfig(ADC1,ADC_Channel_15,15,ADC_SampleTime_239Cycles5);//ADC1,通道15,采样顺序为16,采样周期239.5 //ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE); ADC_Cmd(ADC1,ENABLE);//使能ADC ADC_ResetCalibration(ADC1);//开启复位校准 while(ADC_GetResetCalibrationStatus(ADC1));//等待复位校准结束 ADC_StartCalibration(ADC1);//开启ADC校准 while(ADC_GetCalibrationStatus(ADC1));//等待ADC校准结束 ADC_DeInit(ADC3);//复位ADC1,ADC1的所有寄存器恢复缺省值 ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//ADC独立模式 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通道的数目 ADC_Init(ADC1,&ADC_InitStructure); ADC_RegularChannelConfig(ADC3,ADC_Channel_4,1,ADC_SampleTime_239Cycles5);//ADC1,通道0,采样顺序为1,采样周期239.5 ADC_Cmd(ADC3,ENABLE);//使能ADC ADC_ResetCalibration(ADC3);//开启复位校准 while(ADC_GetResetCalibrationStatus(ADC3));//等待复位校准结束 ADC_StartCalibration(ADC3);//开启ADC校准 while(ADC_GetCalibrationStatus(ADC3));//等待ADC校准结束 } [/mw_shl_code]

最佳答案

查看完整内容[请看2#楼]

回复【15楼】dongbaohui: ---------------------------------  回复【12楼】hustlairong: --------------------------------- 因为ADC1,ADC2,ADC3都有各自独立的ADCx_DR,不存在混淆的情况。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-9-17 19:57:10 | 显示全部楼层
回复【15楼】dongbaohui:
---------------------------------
 回复【12楼】hustlairong:
---------------------------------
因为ADC1,ADC2,ADC3都有各自独立的ADCx_DR,不存在混淆的情况。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

40

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
402
金钱
402
注册时间
2014-8-7
在线时间
10 小时
 楼主| 发表于 2014-9-18 08:48:51 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
正确的,一起就不对了。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-9-18 23:31:07 | 显示全部楼层
回复【3楼】hustlairong:
---------------------------------
 ADC_DeInit(ADC3);//复位ADC1,ADC1的所有寄存器恢复缺省值
这个语句,貌似连ADC1,ADC2,ADC3一起都复位了,你必须放到程序的最开始,然后在开始初始化ADC1,2,3,否则就有问题。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

40

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
402
金钱
402
注册时间
2014-8-7
在线时间
10 小时
 楼主| 发表于 2014-9-19 08:55:02 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
应该不是这个问题,我昨天设置ADC1和ADC3的代码分成了两个函数,并且开启了ADC3的中断,然后就可以用了。
回复

使用道具 举报

69

主题

475

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1334
金钱
1334
注册时间
2013-12-28
在线时间
197 小时
发表于 2014-9-19 09:49:03 | 显示全部楼层
ADC_DR这个寄存器需要注意,你这么多的通道肯定要开DMA吧 ,要不然怎么读取数据
回复

使用道具 举报

69

主题

475

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1334
金钱
1334
注册时间
2013-12-28
在线时间
197 小时
发表于 2014-9-19 10:18:01 | 显示全部楼层
我觉得你要是用两个ADC的话 那需要用到双ADC模式了  要不然这个ADC_DR寄存器不好处理
回复

使用道具 举报

40

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
402
金钱
402
注册时间
2014-8-7
在线时间
10 小时
 楼主| 发表于 2014-9-19 19:40:00 | 显示全部楼层
回复【6楼】jiaozhu:
---------------------------------
已经开了DMA了。
回复

使用道具 举报

40

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
402
金钱
402
注册时间
2014-8-7
在线时间
10 小时
 楼主| 发表于 2014-9-19 20:04:39 | 显示全部楼层
回复【7楼】jiaozhu:
---------------------------------
昨天测了挺久,一直都是对的。但是今天仔细看了文档,发现理论上有些问题,我的程序是这个逻辑:ADC1的15个通道的转换结果用DMA传送至ADC_Value,ADC3的转换结果用中断的方式读取,但是文档说所有的转换结果都存到ADC_DR,那会不会出现我用DMA传送ADC_DR中的ADC1的转换结果时,里面出现ADC3的转换结果,这样的话就全乱了。但是实际上却没有出现这个情况,什么原因?
回复

使用道具 举报

40

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
402
金钱
402
注册时间
2014-8-7
在线时间
10 小时
 楼主| 发表于 2014-9-19 20:05:09 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
昨天测了挺久,一直都是对的。但是今天仔细看了文档,发现理论上有些问题,我的程序是这个逻辑:ADC1的15个通道的转换结果用DMA传送至ADC_Value,ADC3的转换结果用中断的方式读取,但是文档说所有的转换结果都存到ADC_DR,那会不会出现我用DMA传送ADC_DR中的ADC1的转换结果时,里面出现ADC3的转换结果,这样的话就全乱了。但是实际上却没有出现这个情况,什么原因?
回复

使用道具 举报

40

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
402
金钱
402
注册时间
2014-8-7
在线时间
10 小时
 楼主| 发表于 2014-9-19 20:22:29 | 显示全部楼层
回复【7楼】jiaozhu:
---------------------------------
假如我先启动ADC3,再启动ADC1,那么ADC_DR中出现的数据应该依次为:ADC3转换结果、ADC1通道1砖混结构、ADC3转换结果、ADC1通道二转换结果。。。。。。。但是事实上没有出现这种现象。这是什么原因呢?
回复

使用道具 举报

40

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
402
金钱
402
注册时间
2014-8-7
在线时间
10 小时
 楼主| 发表于 2014-9-19 20:35:02 | 显示全部楼层
回复【7楼】jiaozhu:
---------------------------------
我有个猜想,DMA相当于搬运工,但是它不是把数据从DAC_DR搬到我定义的ADC_Value中,而是直接把数据从ADC输出口(就是说ADC_DR的数据也是从这来的)搬到ADC_Value,纯属猜测。。。。。求指导
回复

使用道具 举报

27

主题

259

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
387
金钱
387
注册时间
2014-8-19
在线时间
0 小时
发表于 2014-10-1 21:56:53 | 显示全部楼层
回复【12楼】hustlairong:
---------------------------------
解决了没?
回复

使用道具 举报

40

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
402
金钱
402
注册时间
2014-8-7
在线时间
10 小时
 楼主| 发表于 2014-10-2 00:34:08 | 显示全部楼层
回复【13楼】dongbaohui:
---------------------------------
解决啦,谢谢
回复

使用道具 举报

27

主题

259

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
387
金钱
387
注册时间
2014-8-19
在线时间
0 小时
发表于 2014-10-2 19:43:02 | 显示全部楼层
回复【14楼】hustlairong:
---------------------------------
啥原因啊?新代码能发上来吗?
回复

使用道具 举报

40

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
402
金钱
402
注册时间
2014-8-7
在线时间
10 小时
 楼主| 发表于 2014-10-3 09:58:35 | 显示全部楼层
回复【15楼】dongbaohui:
---------------------------------
就是原子哥说的,各自有ADC-DR
回复

使用道具 举报

27

主题

259

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
387
金钱
387
注册时间
2014-8-19
在线时间
0 小时
发表于 2014-10-3 21:12:37 | 显示全部楼层
回复【17楼】hustlairong:
---------------------------------
能完整的贴出来吗?我想在开发板上测试一下
回复

使用道具 举报

40

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
402
金钱
402
注册时间
2014-8-7
在线时间
10 小时
 楼主| 发表于 2014-10-3 23:18:15 | 显示全部楼层
回复【18楼】dongbaohui:
---------------------------------
我现在在家里,电脑在学校,没法贴,不好意思啊。
回复

使用道具 举报

27

主题

259

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
387
金钱
387
注册时间
2014-8-19
在线时间
0 小时
发表于 2014-10-5 21:17:48 | 显示全部楼层
回复【19楼】hustlairong:
---------------------------------
等你,请发我邮箱,多射
回复

使用道具 举报

40

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
402
金钱
402
注册时间
2014-8-7
在线时间
10 小时
 楼主| 发表于 2014-10-9 20:33:04 | 显示全部楼层
回复【20楼】dongbaohui:
---------------------------------
这是设置ADC
void ADCChannel_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_ADC1,ENABLE);

//设置引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//模拟输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);//PC0 C1 C2 PC3 C4

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_Init(GPIOA,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_Init(GPIOB,&GPIO_InitStructure);


//设置ADC1
ADC_DeInit(ADC1);//复位ADC1,ADC1的所有寄存器恢复缺省值
RCC_ADCCLKConfig(RCC_PCLK2_Div6);//设置六分频
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=15;//顺序进行规制转换的ADC通道的数目
ADC_Init(ADC1,&ADC_InitStructure);
ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_239Cycles5);//ADC1,通道0,采样顺序为1,采样周期239.5
ADC_RegularChannelConfig(ADC1,ADC_Channel_1,2,ADC_SampleTime_239Cycles5);//ADC1,通道1,采样顺序为2,采样周期239.5
ADC_RegularChannelConfig(ADC1,ADC_Channel_2,3,ADC_SampleTime_239Cycles5);//ADC1,通道2,采样顺序为3,采样周期239.5
ADC_RegularChannelConfig(ADC1,ADC_Channel_3,4,ADC_SampleTime_239Cycles5);//ADC1,通道3,采样顺序为4,采样周期239.5
ADC_RegularChannelConfig(ADC1,ADC_Channel_4,5,ADC_SampleTime_239Cycles5);//ADC1,通道4,采样顺序为5,采样周期239.5
ADC_RegularChannelConfig(ADC1,ADC_Channel_5,6,ADC_SampleTime_239Cycles5);//ADC1,通道5,采样顺序为6,采样周期239.5
ADC_RegularChannelConfig(ADC1,ADC_Channel_6,7,ADC_SampleTime_239Cycles5);//ADC1,通道6,采样顺序为7,采样周期239.5
ADC_RegularChannelConfig(ADC1,ADC_Channel_7,8,ADC_SampleTime_239Cycles5);//ADC1,通道7,采样顺序为8,采样周期239.5
ADC_RegularChannelConfig(ADC1,ADC_Channel_8,9,ADC_SampleTime_239Cycles5);//ADC1,通道10,采样顺序为11,采样周期239.5
ADC_RegularChannelConfig(ADC1,ADC_Channel_10,10,ADC_SampleTime_239Cycles5);//ADC1,通道10,采样顺序为11,采样周期239.5
ADC_RegularChannelConfig(ADC1,ADC_Channel_11,11,ADC_SampleTime_239Cycles5);//ADC1,通道11,采样顺序为12,采样周期239.5
ADC_RegularChannelConfig(ADC1,ADC_Channel_12,12,ADC_SampleTime_239Cycles5);//ADC1,通道12,采样顺序为13,采样周期239.5
ADC_RegularChannelConfig(ADC1,ADC_Channel_13,13,ADC_SampleTime_239Cycles5);//ADC1,通道13,采样顺序为14,采样周期239.5
ADC_RegularChannelConfig(ADC1,ADC_Channel_14,14,ADC_SampleTime_239Cycles5);//ADC1,通道14,采样顺序为15,采样周期239.5
ADC_RegularChannelConfig(ADC1,ADC_Channel_15,15,ADC_SampleTime_239Cycles5);//ADC1,通道15,采样顺序为16,采样周期239.5
//ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);

ADC_Cmd(ADC1,ENABLE);//使能ADC
ADC_ResetCalibration(ADC1);//开启复位校准
while(ADC_GetResetCalibrationStatus(ADC1));//等待复位校准结束
ADC_StartCalibration(ADC1);//开启ADC校准
while(ADC_GetCalibrationStatus(ADC1));//等待ADC校准结束
}

 
void ADCChannel3_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF|RCC_APB2Periph_ADC3,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//模拟输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOF,&GPIO_InitStructure);

ADC_DeInit(ADC3);//复位ADC1,ADC1的所有寄存器恢复缺省值
RCC_ADCCLKConfig(RCC_PCLK2_Div6);//设置六分频
ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//ADC独立模式
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通道的数目
ADC_Init(ADC3,&ADC_InitStructure);
ADC_RegularChannelConfig(ADC3,ADC_Channel_4,1,ADC_SampleTime_239Cycles5);//ADC1,通道0,采样顺序为1,采样周期239.5

NVIC_InitStructure.NVIC_IRQChannel= ADC3_IRQn;                                                               //ADC1,ADC2全局中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//先占优先级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;   //从优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
ADC_ITConfig(ADC3,ADC_IT_EOC,ENABLE);

ADC_Cmd(ADC3,ENABLE);//使能ADC
ADC_ResetCalibration(ADC3);//开启复位校准
while(ADC_GetResetCalibrationStatus(ADC3));//等待复位校准结束
ADC_StartCalibration(ADC3);//开启ADC校准
while(ADC_GetCalibrationStatus(ADC3));//等待ADC校准结束  
}

void ADC3_IRQHandler(void)
{
if(ADC_GetITStatus(ADC3, ADC_IT_EOC))
{
ADC1_Value[15] = ADC_GetConversionValue(ADC3);
ADC_ClearITPendingBit(ADC3, ADC_IT_EOC); 
}
}
这是设置DMA:
void MyDMA2_Init(void)
{
DMA_InitTypeDef DMA_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);

DMA_DeInit(DMA1_Channel1);

DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)&ADC1->DR;//外设基地址
DMA_InitStructure.DMA_MemoryBaseAddr=(u32)ADC1_Value;//内存基地址
DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;//外设通过DMA向内存存入数据
DMA_InitStructure.DMA_BufferSize=15;//一次DMA传输数据大小(DMA通道缓存)
DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//外设地址不自增
DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;//内存地址自增
DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;//外设数据位宽16位(AD转换数据为16位)
DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;//内存数据位宽16位
DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;//循环DMA模式(适合ADC扫描类)
DMA_InitStructure.DMA_Priority=DMA_Priority_High;//DMA通道优先级高
DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;
DMA_Init(DMA1_Channel1,&DMA_InitStructure);//初始化DMA1_Channel1

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel=DMA1_Channel1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE);//DMA传输完成中断

DMA_Cmd(DMA1_Channel1,ENABLE); 

}
回复

使用道具 举报

27

主题

259

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
387
金钱
387
注册时间
2014-8-19
在线时间
0 小时
发表于 2014-10-10 17:10:09 | 显示全部楼层
回复【17楼】hustlairong:
---------------------------------
怎还是听不懂啊,原子回答的是你第二个问题,一楼的问题在哪儿?是三楼说的吗?
回复

使用道具 举报

40

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
402
金钱
402
注册时间
2014-8-7
在线时间
10 小时
 楼主| 发表于 2014-10-10 17:21:35 | 显示全部楼层
回复【22楼】dongbaohui:
---------------------------------
我也搞不清楚你想知道什么了。。。。。
回复

使用道具 举报

27

主题

259

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
387
金钱
387
注册时间
2014-8-19
在线时间
0 小时
发表于 2014-10-10 17:22:31 | 显示全部楼层
回复【23楼】hustlairong:
---------------------------------
所以使用ADC3的通道4,但是一使用ADC3数据就全都不对了,不知道扫描原因?
回复

使用道具 举报

27

主题

259

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
387
金钱
387
注册时间
2014-8-19
在线时间
0 小时
发表于 2014-10-10 18:08:49 | 显示全部楼层
回复【23楼】hustlairong:
---------------------------------
就是你一楼问的啊
回复

使用道具 举报

40

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
402
金钱
402
注册时间
2014-8-7
在线时间
10 小时
 楼主| 发表于 2014-10-10 19:24:56 | 显示全部楼层
回复【25楼】dongbaohui:
---------------------------------
哦,我在三楼说了啊,原因我也不知道,但是按照我改之后处理就okl,就是我发给你看的那样设置的。
回复

使用道具 举报

32

主题

286

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1366
金钱
1366
注册时间
2014-3-27
在线时间
358 小时
发表于 2015-11-24 15:58:54 | 显示全部楼层
不错,学习。
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2016-3-21
在线时间
6 小时
发表于 2016-9-21 10:48:44 | 显示全部楼层
就是分开来使用咯
回复

使用道具 举报

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
133
金钱
133
注册时间
2019-3-10
在线时间
33 小时
发表于 2019-3-26 15:13:18 | 显示全部楼层
正点原子 发表于 2014-9-17 19:57
回复【15楼】dongbaohui:
---------------------------------
 回复【12楼】hustlairong:
----------- ...

ADC1 ADC2 ADC3只有一个数据寄存器吧 ADC->DR 共用这一个  
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-24 03:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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