DAHAIGE-355079 发表于 2015-9-28 16:50:58

STM8S105 ADC使用求助

基于 STM8MC-KIT v1.0 库;
问题:使用ADC1通道3,5,测试发现通道5使用正常,通道3随通道5电压改变,示波器测量通道3的电压为固定300mV值;为什么通道3会随通道5改变呢?通道3非悬空状态,实际上是经过电阻分压测量输出电源电压用的。上代码
初始化:
void Init_ADC( void )
{
        u8 value;
        u16 ADC_TDR_tmp;

        //ADC_Sync_State = ADC_USER_SYNC_INIT;
        ADC_Sync_State = ADC_CURRENT_INIT;
        ADC_State = ADC_SYNC;

        ADC1->CSR = 0;
       
        //select 4MHz clock based on 16MHz fMaster (div4), single mode
        //       6MHz clock based on 24MHz fMaster (div4)
        ADC1->CR1 = BIT5|BIT6;

        //select internal trigger TIM1 TRGO
        ADC1->CR2 = 0;

        //select phase input
//        ADC1->CSR = PHASE_C_BEMF_ADC_CHAN;
        ADC1->CSR = ADC_USER_ASYNC_CHANNEL;

        ADC_TDR_tmp = 0;
//        ADC_TDR_tmp |= (u16)(1) << PHASE_A_BEMF_ADC_CHAN;
//        ADC_TDR_tmp |= (u16)(1) << PHASE_B_BEMF_ADC_CHAN;
//        ADC_TDR_tmp |= (u16)(1) << PHASE_C_BEMF_ADC_CHAN;

        ADC_TDR_tmp |= (u16)(1) << ADC_CURRENT_CHANNEL;
//        ADC_TDR_tmp |= (u16)(1) << ADC_USER_SYNC_CHANNEL;

        ADC_TDR_tmp |= (u16)(1) << ADC_BUS_CHANNEL;
//        ADC_TDR_tmp |= (u16)(1) << ADC_NEUTRAL_POINT_CHANNEL;
//        ADC_TDR_tmp |= (u16)(1) << ADC_TEMP_CHANNEL;
        ADC_TDR_tmp |= (u16)(1) << ADC_USER_ASYNC_CHANNEL;

        ToCMPxH( ADC1->TDRH, ADC_TDR_tmp);
        ToCMPxL( ADC1->TDRL, ADC_TDR_tmp);
       
        //enable trigger
        ADC1->CR2 |= BIT6;

        //enable ADC
        ADC1->CR1 |= BIT0;
        //allow ADC to stabilize
        value=30;
        while(value--);                  
        //clear interrupt flag
        ADC1->CSR &= (u8)(~BIT7);
        ADC1->CSR |= BIT5;
}

中断:
#ifdef HALL
        @near @interrupt @svlreg void ADC2_IRQHandler (void)
        {
                u16 data;
               
                data = ADC1->DRH;
                data <<= 2;
                data |= (ADC1->DRL & 0x03);

                //clear interrupt flag
                ADC1->CSR &= (u8)(~BIT7);
                //ADC_Async_State = ADC_USER_ASYNC_SAMPLE;

                // Manage async sampling
                switch (ADC_Async_State)
                {
                        default:
                        case ADC_BUS_SAMPLE:
                                ADC_Buffer[ ADC_BUS_INDEX ] = data;
                                //ADC_Async_State = ADC_TEMP_INIT;
                                ADC_Async_State = ADC_USER_ASYNC_INIT;

                        break;

                        case ADC_TEMP_SAMPLE:
                                ADC_Buffer[ ADC_TEMP_INDEX ] = data;
                                ADC_Async_State = ADC_NEUTRAL_POINT_INIT;
                        break;

                        case ADC_NEUTRAL_POINT_SAMPLE:
                                ADC_Buffer[ ADC_NEUTRAL_POINT_INDEX ] = data;
                                ADC_Async_State = ADC_USER_ASYNC_INIT;
                        break;

                        case ADC_USER_ASYNC_SAMPLE:
                                ADC_Buffer[ ADC_USER_ASYNC_INDEX ] = data;
                                ADC_Async_State = ADC_BUS_INIT;
                        break;
                }

                // Set the Async sampling channel
                switch (ADC_Async_State)
                {
                        default:
                        case ADC_BUS_INIT:
                                ADC1->CSR = (ADC_BUS_CHANNEL|BIT5);
                                ADC_Async_State = ADC_BUS_SAMPLE;

                        break;
                       
                        case ADC_TEMP_INIT:
                                ADC1->CSR = (ADC_TEMP_CHANNEL|BIT5);
                                ADC_Async_State = ADC_TEMP_SAMPLE;
                        break;

                        case ADC_NEUTRAL_POINT_INIT:
                                ADC1->CSR = (ADC_NEUTRAL_POINT_CHANNEL|BIT5);
                                ADC_Async_State = ADC_NEUTRAL_POINT_SAMPLE;
                        break;
                       
                        case ADC_USER_ASYNC_INIT:
                                ADC1->CSR = (ADC_USER_ASYNC_CHANNEL|BIT5);
                                ADC_Async_State = ADC_USER_ASYNC_SAMPLE;
                        break;
                }

                // Configure syncronous sampling
                #ifdef DEV_CUT_1
                        // Enable ext. trigger
                        ADC1->CR2 |= BIT6;
                        //turn on ADC fix bug on cut1 device
                        ADC1->CR1 |= BIT0;
                #else
                        // Enable ext. trigger
                        ADC1->CR2 |= BIT6;
                #endif               
        }
#endif

你好我好大家好! 发表于 2015-9-28 16:57:17

表示关注一下这个问题

DAHAIGE-355079 发表于 2015-9-28 17:13:57

你好我好大家好! 发表于 2015-9-28 16:57
表示关注一下这个问题

:handshake谢谢

DAHAIGE-355079 发表于 2015-9-28 18:16:47

顶起,高手们进来看看

ughbss 发表于 2015-9-28 19:30:34

这个问题我没遇到过,我遇到过ADC切换通道后不准。解决办法是切换通道后ADC采样2次,只取后一次的值,就准了。虽然跟你的问题不太一样
页: [1]
查看完整版本: STM8S105 ADC使用求助