[STM32F4] 多个IO口采ADC的问题

[复制链接]
2693|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 | 显示全部楼层
配置各功能模块的时候,一般都要先关闭,配置完再打开
xia00 发表于 2017-6-26 22:16 | 显示全部楼层
把ADC的模块初始化了,然后功能封装成了一个函数,只要传IO口,通道值进去就可以实现功能
hfdy01 发表于 2017-6-26 22:21 | 显示全部楼层
初始化ADC的时候,是把ADC模块配置好。。
CallReceiver 发表于 2017-6-26 22:24 | 显示全部楼层
这个采用连续扫描的模式进行设计程序的。
boy1990 发表于 2017-6-26 22:30 | 显示全部楼层
这个程序的有点多的,需要找到关键点的才可以
sourceInsight 发表于 2017-6-26 22:33 | 显示全部楼层
这个采集模式的选择很重要的。
usysm 发表于 2017-6-26 22:41 | 显示全部楼层
是顺序转换吗?
typeof 发表于 2017-6-26 22:42 | 显示全部楼层
配置DMA读取试试。
yujielun 发表于 2017-6-26 22:42 | 显示全部楼层
采集的数据是一样的吗?
htmlme 发表于 2017-6-26 22:43 | 显示全部楼层
配置ADC多路顺序转换。
pklong 发表于 2017-6-26 22:43 | 显示全部楼层
采样周期不够长。
touser 发表于 2017-6-26 22:43 | 显示全部楼层
怎么配置的转换顺序?
myiclife 发表于 2017-6-26 22:44 | 显示全部楼层
以前用过ADC没哟问题的。
jkl21 发表于 2017-6-26 22:44 | 显示全部楼层
对应三个ADC的IO口
dspmana 发表于 2017-6-26 22:45 | 显示全部楼层
通道需要时间才能转换。
usysm 发表于 2017-6-26 22:45 | 显示全部楼层
读取的地址是否一致?
typeof 发表于 2017-6-26 22:45 | 显示全部楼层
多路ADC采样设置要复杂很多。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

181

主题

1597

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部