Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ADC в STM32F0
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
toweroff
Добрый вечер

STM32F071

Никак не пойму, что там не так.

У меня питание - теоретически от 7 до 15в, от него идет DC-DC ST1S10 до 4в (для GSM модуля) и LDO для 3.3в
С входного напряжения идет делитель, максимум расчитан на 22в, при котором на выходе будет 1.5в
Это дело подается на R2R операционник (К=2) и с него - на вход ADC


Настройка вроде как верная, все работает, прерывание вызывается (в непрерывном режиме, флаг CONT установлен)
Значения DR в младших разрядах шевелятся немного, все вроде как внешне прекрасно.
Тут решил попробовать поменять входное напряжение - так DR даже не дернулся. Точнее, как болтался в своих значениях, так и продолжает. Качественных изменений - что при 7в, что при 15, - никаких

Короче говоря, ничего не понимаю sad.gif
Михась
канал не тот выбран?
smalcom
А на входе АЦП меняется напряжение? Какие значения в DR?
toweroff
Цитата(Михась @ Dec 7 2015, 18:00) *
канал не тот выбран?


нет, все верно

Цитата(smalcom @ Dec 7 2015, 18:01) *
А на входе АЦП меняется напряжение? Какие значения в DR?

да в том-то и дело, что скачет примерно 0x835 -- 0x849
toweroff
Еще раз проверил

При измеряемых 7в на входе ADC - 1в
При 15в - 2.5в соответственно

Инициализация:
Код
void ADC_Init (void)
{
    DEBUG("ADC GPIO init\n");
    RCC->AHBENR |= RCC_AHBENR_GPIOAEN;                /* enable periperal clock for GPIOA */
    GPIO_MODER_CLEAR(GPIOA,5);                        /* clerar PIN5 mode                    */
    GPIO_MODER_SET(GPIOA, 5, GPIO_MODER_ANALOG);    /* set PIN5 as analog input         */    

  /* Setup and initialize ADC converter                                       */

    RCC->APB2ENR |= RCC_APB2ENR_ADCEN;            /* enable periperal clock for ADC1          */
    
    DEBUG("ADC configure\n");
    ADC1->CFGR2 &= ~ADC_CFGR2_CKMODE;
    ADC1->CFGR2 = ADC_CFGR2_CKMODE_1;             /* ADC clock PCLK/4                            */
    
    ADC1->CFGR1 = 0;                            /* Clear register. 12bits bode as default    */

    ADC1->CFGR1 |= 5UL<<26;                        /* Set ADC input to input 5                 */
    ADC1->CFGR1 |= ADC_CFGR1_CONT;                /* Continues mode                             */
    
    ADC1->SMPR = 0x07;                            /* 239.5 ADC clock cycles                   */
    
    ADC1->CR |= ADC_CR_ADCAL;                    /* Enable calibration                */
    while (ADC1->CR & ADC_CR_ADCAL);
    ADC1->CR |= ADC_CR_ADEN;                    /* Enable ADC                        */
    
    while(!(ADC1->ISR & ADC_ISR_ADRDY));
    DEBUG("ADC init done\n");

    ADC1->IER |= ADC_IER_EOCIE;                    /* enable for EOC Interrupt         */
    NVIC_EnableIRQ(ADC1_COMP_IRQn);                /* enable ADC Interrupt             */

    ADC_StartCnv();
}


void ADC_StartCnv (void)
{
    ADC1->CR |= ADC_CR_ADSTART;            /* Start A/D conversion             */
}


void ADC1_COMP_IRQHandler(void) {

    if (ADC1->ISR & ADC_ISR_EOC) {            /* ADC1 EOC interrupt?                */
        AD_last = ADC1->DR;
        AD_done = 1;
        ADC1->ISR |= ADC_ISR_EOC;
    }
}


APH2 включена ранее 100%
adnega
Цитата(toweroff @ Dec 7 2015, 20:47) *
Инициализация:

У меня работает так:
CODE
void init_ADC(void)
{
WORD val;

ADC->CCR = (1 << 22) | (1 << 23);
ADC1->CFGR2 = (2 << 30UL);

// Калибровка АЦП
ADC1->CR = 0;
ADC1->CR = (1UL << 31UL) | (1 << 0UL);
while(ADC1->CR & (1UL << 31UL));

val = ADC1->DR;

ADC1->CR = (1 << 0UL);
while(!(ADC1->ISR & (1 << 0UL)));

ADC1->ISR = (1 << 0UL);

ADC1->CFGR1 = 0;
ADC1->SMPR = (7 << 0UL);

ADC1->CHSELR = (1 << 16UL);
ADC1->CR = (1 << 2UL);

}

Запуск:

ADC1->CHSELR = (1 << adc_channels[adc_channel]);
ADC1->CR = (1 << 2UL);
toweroff
А вот и ларчик открылся - канал-то не выбран sad.gif

ADC1->CHSELR = (1UL<<5);

проблему решил

Спасибо!!
smalcom
Цитата
Note: The channel selected by the AWDCH[4:0] bits must be also set into the CHSELR register
toweroff
да-да... все как обычно - смотрю в книгу, вижу - фигу
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.