Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

STM32 i ADC - problem z pin PA4

29 Kwi 2010 18:43 1963 5
  • Poziom 19  
    W STM32 wykorzystuje dwa piny ADC ADC_Channel_2 i ADC_Channel_4.
    Na ADC_Channel_2 jest prawidłowy pomiar, a ADC_Channel_4 dziwnie się zachowuje, niby jest skonfigurowany jako analog input, a zachowuje się jako pull-up, po podpięciu rezystora do masy 33k wskazuje napięcie 2,5V a przy 3k3 jest 0,8V.
    Oba piny są skonfigurowane tak samo, o czymś jeszcze zapomniałem, czy to jakiś bug ?


    Code:


      RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE);
      RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
      RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);



    void ADCInit(void)
    {
        DMA_InitTypeDef DMA_InitStruct;
        GPIO_InitTypeDef GPIO_InitStructure;

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_4;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        DMA_DeInit(DMA1_Channel1);
        DMA_InitStruct.DMA_PeripheralBaseAddr = ADC1_DR_Address;
        DMA_InitStruct.DMA_MemoryBaseAddr = (u32)&ADCVal;
        DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC;
        DMA_InitStruct.DMA_BufferSize = 2;
        DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
        DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;
        DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
        DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
        DMA_InitStruct.DMA_Mode = DMA_Mode_Circular;
        DMA_InitStruct.DMA_Priority = DMA_Priority_High;
        DMA_InitStruct.DMA_M2M = DMA_M2M_Disable;
        DMA_Init(DMA1_Channel1, &DMA_InitStruct);
        DMA_Cmd(DMA1_Channel1, ENABLE);

        ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;
        ADC_InitStruct.ADC_ScanConvMode = ENABLE;
        ADC_InitStruct.ADC_ContinuousConvMode = ENABLE;
        ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
        ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
        ADC_InitStruct.ADC_NbrOfChannel = 2;
        ADC_Init(ADC1, &ADC_InitStruct);

        ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_71Cycles5);
        ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 2, ADC_SampleTime_71Cycles5);

        ADC_DMACmd(ADC1, ENABLE);
        ADC_Cmd(ADC1, ENABLE);                        

        ADC_ResetCalibration(ADC1);

        while(ADC_GetResetCalibrationStatus(ADC1))
            ;

        ADC_SoftwareStartConvCmd(ADC1, ENABLE);
    }

  • Poziom 18  
    Nie korzystam z bibliotek i nie znam ich dobrze ale widzę, że resetujesz kalibrację przetwornika ale nie wykonujesz później kalibracji. Wątpię żeby to miało aż taki wpływ na wynik i w dodatku na 1 kanale a nie na obydwu, ale sprawdź.
    Czy podałeś odpowiednią wartość preskalera ADC w RCC_CFGR (maks. 14 MHz)?
  • Poziom 14  
    W miejscu odpowiedzialnym za konfiguracje zegara systemowego dodaj:
    RCC_ADCCLKConfig(RCC_PCLK2_Div8);
  • Poziom 19  
    poprawiona kalibracja ADC i konfiguracja zegara - pomiar bez zmian
  • Poziom 14  
    Spróbuj może zamiast PA4 przypisać inny kanał i sprawdź czy działa..? W jakim środowisku piszesz?
  • Poziom 10  
    trzeba zmienić DMA_PeripheralDataSize_HalfWord i DMA_MemoryDataSize_HalfWord na Word, zamiast HalfWord