打印
[STM32F4]

多个IO口采ADC的问题

[复制链接]
2105|29
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
androidbus|  楼主 | 2017-6-26 21:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用STM32F4


我使用P3.0  (A12) 、 P3.2  (A14)、P3.3 (A15 )  三个IO口,分别采三个ADC,但是都是以第一个采到的ADC的值为准,不会变化

P3.0采2.0V的电压,P3.2采0.5V的电压 P3.3采1.0V的电压,最后得到的结果总是以P3.0的值为准

但是单次分别采各自的电压是正确的,就是3个IO口一起采的时候,会出现这种情况。

请问是通道没有转换所以一直以第一个通道来采电压吗?还是有其他可能

请教大家,谢谢!

下面是ADC的初始化和采ADC函数代码
void init_adc()
{
        //Initialize the ADC12B Module
        /*
         * Base address of ADC12B Module
         * Use internal ADC12B bit as sample/hold signal to start conversion
         * USE MODOSC 5MHZ Digital Oscillator as clock source
         * Use default clock divider/pre-divider of 1
         * Not use internal channel
         */
        ADC12_B_initParam initParam = {0};
        initParam.sampleHoldSignalSourceSelect = ADC12_B_SAMPLEHOLDSOURCE_SC;
        initParam.clockSourceSelect = ADC12_B_CLOCKSOURCE_ADC12OSC;
        initParam.clockSourceDivider = ADC12_B_CLOCKDIVIDER_1;
        initParam.clockSourcePredivider = ADC12_B_CLOCKPREDIVIDER__1;
        initParam.internalChannelMap = ADC12_B_NOINTCH;
        ADC12_B_init(ADC12_B_BASE, &initParam);

        //Enable the ADC12B module
        ADC12_B_enable(ADC12_B_BASE);

        /*
         * Base address of ADC12B Module
         * For memory buffers 0-7 sample/hold for 64 clock cycles
         * For memory buffers 8-15 sample/hold for 4 clock cycles (default)
         * Disable Multiple Sampling
         */
        ADC12_B_setupSamplingTimer(ADC12_B_BASE, ADC12_B_CYCLEHOLD_16_CYCLES,
        ADC12_B_CYCLEHOLD_4_CYCLES, ADC12_B_MULTIPLESAMPLESDISABLE);

        //Configure Memory Buffer
        /*
         * Base address of the ADC12B Module
         * Configure memory buffer 0
         * Map input A3 to memory buffer 0
         * Vref+ = AVcc
         * Vref- = AVss
         * Memory buffer 0 is not the end of a sequence
         */
        ADC12_B_configureMemoryParam configureMemoryParam = {0};
        configureMemoryParam.memoryBufferControlIndex = ADC12_B_MEMORY_0;
//        configureMemoryParam.inputSourceSelect = ADC12_B_INPUT_A3;
        configureMemoryParam.refVoltageSourceSelect =
        ADC12_B_VREFPOS_AVCC_VREFNEG_VSS;
        configureMemoryParam.endOfSequence = ADC12_B_NOTENDOFSEQUENCE;
        configureMemoryParam.windowComparatorSelect =
        ADC12_B_WINDOW_COMPARATOR_DISABLE;
        configureMemoryParam.differentialModeSelect =
        ADC12_B_DIFFERENTIAL_MODE_DISABLE;
        ADC12_B_configureMemory(ADC12_B_BASE, &configureMemoryParam);

        ADC12_B_clearInterrupt(ADC12_B_BASE, 0, ADC12_B_IFG0);
        //Enable memory buffer 0 interrupt
        ADC12_B_enableInterrupt(ADC12_B_BASE, ADC12_B_IE0, 0, 0);
}
沙发
litengg| | 2017-6-26 22:04 | 只看该作者
是配置通道时,寄存器的值没有改变吧

使用特权

评论回复
板凳
qiangweii| | 2017-6-26 22:07 | 只看该作者
先把寄存器值配置过来先,但是为什么就第一个通道的值能改变,其他通道的值都改变不了额

使用特权

评论回复
地板
shashaa| | 2017-6-26 22:13 | 只看该作者
配置各功能模块的时候,一般都要先关闭,配置完再打开

使用特权

评论回复
5
xia00| | 2017-6-26 22:16 | 只看该作者
把ADC的模块初始化了,然后功能封装成了一个函数,只要传IO口,通道值进去就可以实现功能

使用特权

评论回复
6
hfdy01| | 2017-6-26 22:21 | 只看该作者
初始化ADC的时候,是把ADC模块配置好。。

使用特权

评论回复
7
CallReceiver| | 2017-6-26 22:24 | 只看该作者
这个采用连续扫描的模式进行设计程序的。

使用特权

评论回复
8
boy1990| | 2017-6-26 22:30 | 只看该作者
这个程序的有点多的,需要找到关键点的才可以

使用特权

评论回复
9
sourceInsight| | 2017-6-26 22:33 | 只看该作者
这个采集模式的选择很重要的。

使用特权

评论回复
10
usysm| | 2017-6-26 22:41 | 只看该作者
是顺序转换吗?

使用特权

评论回复
11
typeof| | 2017-6-26 22:42 | 只看该作者
配置DMA读取试试。

使用特权

评论回复
12
yujielun| | 2017-6-26 22:42 | 只看该作者
采集的数据是一样的吗?

使用特权

评论回复
13
htmlme| | 2017-6-26 22:43 | 只看该作者
配置ADC多路顺序转换。

使用特权

评论回复
14
pklong| | 2017-6-26 22:43 | 只看该作者
采样周期不够长。

使用特权

评论回复
15
touser| | 2017-6-26 22:43 | 只看该作者
怎么配置的转换顺序?

使用特权

评论回复
16
myiclife| | 2017-6-26 22:44 | 只看该作者
以前用过ADC没哟问题的。

使用特权

评论回复
17
jkl21| | 2017-6-26 22:44 | 只看该作者
对应三个ADC的IO口

使用特权

评论回复
18
dspmana| | 2017-6-26 22:45 | 只看该作者
通道需要时间才能转换。

使用特权

评论回复
19
usysm| | 2017-6-26 22:45 | 只看该作者
读取的地址是否一致?

使用特权

评论回复
20
typeof| | 2017-6-26 22:45 | 只看该作者
多路ADC采样设置要复杂很多。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

181

主题

1597

帖子

3

粉丝