OpenEdv-开源电子网

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

双ADC规则同步模式的初始化问题

[复制链接]

3

主题

17

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2017-5-19
在线时间
4 小时
发表于 2017-5-21 15:20:01 | 显示全部楼层 |阅读模式
7金钱
    直奔主题吧,我使用的是STM32F103C8T6芯片,需要设计双ADC规则同步模式并且利用中断读取ADC的值,我的初始化代码如附件图片。据我所知,当两个ADC设置为规则同步模式时,ADC1采集的数据会传输给DR寄存器的低16位,而ADC2采集的数据会传输给DR寄存器的高16位。然后我现在遇见的问题是:ADC2(我设置的是通道1)可以正常采集到模拟信号,也就是DR寄存器的高16位有数据;ADC1(我设置的是通道2)却无法读取到该IO口的模拟信号(确定有信号输入)准确来说是一直维持在1.6V不随外界输入信号的变化而变化。对于这个问题我怀疑是我写的ADC的初始化程序存在一些问题,希望写过类似程序的大神能帮我看看是否存在问题,先行谢过了!!~~
PS:在线等。。。

图1

图1

图2

图2

图3

图3

最佳答案

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

我知道问题所在了, ADC_SoftwareStartConvCmd(ADC1, ENABLE); 这一句代码要写在这一句 ADC_ExternalTrigConvCmd(ADC2, ENABLE); 的后面。 虽然我还不知道为什么,但是问题已经解决了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

17

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2017-5-19
在线时间
4 小时
 楼主| 发表于 2017-5-21 15:20:02 | 显示全部楼层
我知道问题所在了,
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
这一句代码要写在这一句
ADC_ExternalTrigConvCmd(ADC2, ENABLE);
的后面。
虽然我还不知道为什么,但是问题已经解决了。
回复

使用道具 举报

3

主题

17

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2017-5-19
在线时间
4 小时
 楼主| 发表于 2017-5-21 15:23:46 | 显示全部楼层
再补充一下:ADC1和2都是单通道,对于GPIO口的初始化的代码很简单,我就没贴出来。
回复

使用道具 举报

3

主题

17

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2017-5-19
在线时间
4 小时
 楼主| 发表于 2017-5-21 15:27:08 | 显示全部楼层
中断服务函数如下:
void ADC1_2_IRQHandler(void)
{       
        if (ADC_GetITStatus(ADC1,ADC_IT_EOC)==SET)
        {
                if(i<512)
                        {
                 ADC_12_ConvertedValue[i]=(uint32_t) ADC1->DR;
           i++;
                        }
                        else
                        {                       
                        j=i%512;
                        ADC_12_ConvertedValue[j]=(uint32_t) ADC1->DR;
            i++;
                        }               
        }
        ADC_ClearITPendingBit(ADC1,ADC_IT_EOC);
}
回复

使用道具 举报

3

主题

17

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2017-5-19
在线时间
4 小时
 楼主| 发表于 2017-5-21 15:28:12 | 显示全部楼层
调试时DR寄存器的低16位的值一直不变,不随外界输入的变化而变化。
回复

使用道具 举报

3

主题

17

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2017-5-19
在线时间
4 小时
 楼主| 发表于 2017-5-21 15:36:22 | 显示全部楼层
对了,ADC_InitStructure.ADC_NbrOfChannel=NOFCHANEL;这条语句中NOFCHANEL宏定义为1了。
回复

使用道具 举报

10

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
514
金钱
514
注册时间
2017-5-21
在线时间
82 小时
发表于 2017-5-21 19:35:17 | 显示全部楼层
DownStars 发表于 2017-5-21 15:20
我知道问题所在了,
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
这一句代码要写在这一句

楼主我想问下ADC1是算一个通道,还是说ADC1下面有很多个通道?比如ADC1_Channel0、ADC1_Channel1、ADC1_Channel2、ADC1_Channel3、ADC1_Channel4
回复

使用道具 举报

3

主题

17

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2017-5-19
在线时间
4 小时
 楼主| 发表于 2017-5-28 14:13:51 | 显示全部楼层
Anyint 发表于 2017-5-21 19:35
楼主我想问下ADC1是算一个通道,还是说ADC1下面有很多个通道?比如ADC1_Channel0、ADC1_Channel1、ADC1_C ...

我设计的ADC1下面就只设计了一个通道,简单一些的。
回复

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2017-5-7
在线时间
9 小时
发表于 2017-6-11 18:26:21 | 显示全部楼层
楼主能不能给我看下你的adc数据采集处理程序? Get_Adc1·······
回复

使用道具 举报

3

主题

17

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2017-5-19
在线时间
4 小时
 楼主| 发表于 2017-7-2 17:16:44 | 显示全部楼层
青龙寺造纸机 发表于 2017-6-11 18:26
楼主能不能给我看下你的adc数据采集处理程序? Get_Adc1·······

这句我没有用函数,直接是把DR寄存器的值赋给了数组。ADC_12_ConvertedValue=(uint32_t) ADC1->DR;
回复

使用道具 举报

10

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
514
金钱
514
注册时间
2017-5-21
在线时间
82 小时
发表于 2017-7-17 22:51:07 | 显示全部楼层
DownStars 发表于 2017-5-28 14:13
我设计的ADC1下面就只设计了一个通道,简单一些的。

那楼主你有写过多通道同时读取的例子么?
回复

使用道具 举报

37

主题

142

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
278
金钱
278
注册时间
2016-9-13
在线时间
73 小时
发表于 2017-8-16 21:36:34 | 显示全部楼层
请问为什么adc2要用外部触发命令啊
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-15 04:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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