打印

多个IO口采ADC的问题

[复制链接]
1068|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
火山LF|  楼主 | 2016-9-13 16:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ADC, IO, ADC1, TE, se
请教各位: 使用MSP430FR5969


我使用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);
}
uint16_t ADC12_B_Sampling(uint16_t GpioPort, uint16_t GpioPin, uint16_t InputSource)
{

        int16_t i16Adcdata[16];
        int16_t i16swap = 0;
        int16_t i16_temp = 0, i16_temp1 = 0;

        GPIO_setAsPeripheralModuleFunctionOutputPin(GpioPort, GpioPin,
        GPIO_TERNARY_MODULE_FUNCTION);

        HWREG16(ADC12_B_BASE + OFS_ADC12MCTL0 + ADC12_B_MEMORY_0) = InputSource; //Set Input Source

//        __bic_SR_register(GIE);
        _disable_interrupts();

        for (i = 0; i < 16; i++)
        {
                // 开始采样和转化,在memory buffer 0 ,单通道单次转化
                ADC12_B_startConversion(ADC12_B_BASE, ADC12_B_MEMORY_0,
                ADC12_B_SINGLECHANNEL);

                while (!(HWREG8(ADC12_B_BASE + OFS_ADC12IFGR0) & ADC12IFG0));
                ADC_Get_Value = ADC12_B_getResults(ADC12_B_BASE, ADC12_B_MEMORY_0);
                HWREG16(ADC12_B_BASE + (OFS_ADC12MEM0 + ADC12_B_MEMORY_0)) = 0;
                i16Adcdata[i] = ADC_Get_Value;

                __no_operation();
                __delay_cycles(5000);
        }
        //        __bis_SR_register(GIE);
        _enable_interrupts();

        for (i16_temp = 0; i16_temp < 16; i16_temp++)
        {
                for (i16_temp1 = i16_temp + 1; i16_temp1 < 16; i16_temp1++)
                {
                        if (i16Adcdata[i16_temp] < i16Adcdata[i16_temp1])
                        {
                                i16swap = i16Adcdata[i16_temp];
                                i16Adcdata[i16_temp] = i16Adcdata[i16_temp1];
                                i16Adcdata[i16_temp1] = i16swap;
                        }
                }
        }

        for (i16_temp = 5; i16_temp < 12; i16_temp++)
                i16Adcdata[4] += i16Adcdata[i16_temp];
        i16Adcdata[4] += 8;
        i16Adcdata[4] = i16Adcdata[4] >> 3;
        ADV_Get_Aver_Value = i16Adcdata[4];


//        DEBUG_PRINT(MSG_ALWAYS, "ADV_Get_Aver_Value=====%d\r\n", ADV_Get_Aver_Value);

        return ADV_Get_Aver_Value;

}


相关帖子

沙发
火山LF|  楼主 | 2016-9-13 18:05 | 只看该作者
找到问题点了,配置通道时,寄存器的值没有改变,我尝试直接配置寄存器的值也不行,先把寄存器值配置过来先,但是为什么就第一个通道的值能改变,其他通道的值都改变不了额

使用特权

评论回复
板凳
火山LF|  楼主 | 2016-9-13 20:54 | 只看该作者
解决问题了!不能直接改通道的,一定要把ADC关闭再打开,再赋值。。。。。。。。单步调试的时候就看着那个寄存器的值不会变。。。。。

使用特权

评论回复
评分
参与人数 1威望 +10 收起 理由
dirtwillfly + 10 很给力!
地板
dirtwillfly| | 2016-9-13 21:05 | 只看该作者
火山LF 发表于 2016-9-13 20:54
解决问题了!不能直接改通道的,一定要把ADC关闭再打开,再赋值。。。。。。。。单步调试的时候就看着那个 ...

配置各功能模块的时候,一般都要先关闭,配置完再打开。

使用特权

评论回复
5
火山LF|  楼主 | 2016-9-14 08:12 | 只看该作者
dirtwillfly 发表于 2016-9-13 21:05
配置各功能模块的时候,一般都要先关闭,配置完再打开。

我把ADC的模块初始化了,然后功能封装成了一个函数,只要传IO口,通道值进去就可以实现功能
初始化ADC的时候,是把ADC模块配置好,群主大大的意思是,430的配置功能模块的时候,都需要先关闭配置完之后再打开吗? 群主大大的这个经验是针对430的呢?还是说其他单片机也适用?

使用特权

评论回复
6
angerbird| | 2016-9-16 12:00 | 只看该作者
这个采用连续扫描的模式进行设计程序的。

使用特权

评论回复
7
comeon201208| | 2016-9-16 13:49 | 只看该作者
这个程序的有点多的,需要找到关键点的才可以。

使用特权

评论回复
8
firstblood| | 2016-9-16 16:12 | 只看该作者
这个采集模式的选择很重要的。

使用特权

评论回复
9
soodesyt| | 2016-9-16 17:12 | 只看该作者
怎么配置的?

使用特权

评论回复
10
soodesyt| | 2016-9-16 17:13 | 只看该作者
多个IO采样,需要分时吗?

使用特权

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

本版积分规则

88

主题

816

帖子

16

粉丝