реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> ADC в STM32F0, напряжение меняется, результат - нет
toweroff
сообщение Dec 7 2015, 14:08
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Добрый вечер

STM32F071

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

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


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

Короче говоря, ничего не понимаю sad.gif
Go to the top of the page
 
+Quote Post
Михась
сообщение Dec 7 2015, 15:00
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 161
Регистрация: 29-09-10
Пользователь №: 59 816



канал не тот выбран?
Go to the top of the page
 
+Quote Post
smalcom
сообщение Dec 7 2015, 15:01
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



А на входе АЦП меняется напряжение? Какие значения в DR?
Go to the top of the page
 
+Quote Post
toweroff
сообщение Dec 7 2015, 15:21
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(Михась @ Dec 7 2015, 18:00) *
канал не тот выбран?


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

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

да в том-то и дело, что скачет примерно 0x835 -- 0x849
Go to the top of the page
 
+Quote Post
toweroff
сообщение Dec 7 2015, 17:47
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Еще раз проверил

При измеряемых 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%
Go to the top of the page
 
+Quote Post
adnega
сообщение Dec 7 2015, 19:04
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(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);
Go to the top of the page
 
+Quote Post
toweroff
сообщение Dec 7 2015, 19:12
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



А вот и ларчик открылся - канал-то не выбран sad.gif

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

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

Спасибо!!
Go to the top of the page
 
+Quote Post
smalcom
сообщение Dec 7 2015, 19:21
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



Цитата
Note: The channel selected by the AWDCH[4:0] bits must be also set into the CHSELR register
Go to the top of the page
 
+Quote Post
toweroff
сообщение Dec 7 2015, 19:44
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



да-да... все как обычно - смотрю в книгу, вижу - фигу
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 20:03
Рейтинг@Mail.ru


Страница сгенерированна за 0.01436 секунд с 7
ELECTRONIX ©2004-2016