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

 
 
> Калибровка АЦП, stm32f103
777777
сообщение Dec 1 2011, 09:55
Сообщение #1


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

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



В процессе отладки программы вдруг стал зависать АЦП во время его инициализации. Оказалось, он не выходит из калибровки:

Код
    ADC1->CR2 |= ADC_CR2_RSTCAL;                        // reset calibration
    while(ADC1->CR2 & ADC_CR2_RSTCAL)                    // wait until reset finished
        {}

Выяснилось, что если перед ним поставить два или более NOP-ов, то он начинает работать. В даташите нашел следующий абзац:
Цитата
Before starting a calibration the ADC must have been in power-off state (ADON bit = ‘0’) for
at least two ADC clock cycles.

Как это понимать? Калибровка производится при включении питания, поэтому он находится в power-off state гораздо больше, чем два clock cycles.
Может наоборот, после включения ADON должно пройти не менее двух циклов? Тогда это объясняет помощь NOP-ов.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
sevastianovd
сообщение Dec 2 2011, 09:03
Сообщение #2


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

Группа: Свой
Сообщений: 78
Регистрация: 8-04-08
Из: Омск
Пользователь №: 36 562



покажите весь код, касаемый ADC. работал с ним на этом-же камне - без проблем.
Go to the top of the page
 
+Quote Post
777777
сообщение Dec 2 2011, 09:23
Сообщение #3


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

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(sevastianovd @ Dec 2 2011, 13:03) *
покажите весь код, касаемый ADC. работал с ним на этом-же камне - без проблем.


Я тоже в других проектах его использовал и ничего не требовалось. Может потому, что здесь АЦП запускается от таймера? Вот вся инициализация:

CODE
void ADC1Setup()
{
// TIM4
RCC->APB1ENR |= RCC_APB1ENR_TIM4EN; // TIM4 Periph clock enable

TIM4->PSC = 1; // Prescaler = 27.778 ns
TIM4->ARR = 297-1; // Auto reload value 297*27.778 = 8.25 us,
// 6 отсчетов на импульс длительностью 49.5 us
TIM4->CCR4 = 50; // контрольный выход на PB9
TIM4->CCMR1 = 0;
TIM4->CCMR2 = TIM_CCMR2_OC4M(6); // channel 4
TIM4->CCER = TIM_ER_CC4E; // set capture/compare enable register

// ADC1
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; // enable clock for ADC1

ADC1->CR1 = ADC_CR1_SCAN | ADC_CR1_EOCIE;
ADC1->CR2 = ADC_CR2_EXTSEL(5) | // Timer 4 CC4 event
ADC_CR2_EXTTRIG | // EXTTRIG
ADC_CR2_ADON;
ADC1->SMPR1 =ADC_SMPR1_SMP12(0); // set sample time (1,5 cycles)

ADC1->SQR3 = ADC_SQR3_SQ1(12);
ADC1->SQR2 = 0;
ADC1->SQR1 = ADC_SQR1_L(0);

__nop();
__nop();
__nop();
__nop();
__nop();
ADC1->CR2 |= ADC_CR2_RSTCAL; // reset calibration
while(ADC1->CR2 & ADC_CR2_RSTCAL) // wait until reset finished
{}
ADC1->CR2 |= ADC_CR2_CAL; // start calibraton
while(ADC1->CR2 & ADC_CR2_CAL) // wait until calibration finished
{}

NVIC->ISER[0] = (1 << (ADC1_2_IRQChannel & 0x1F)); // enable interrupt ADC1_2
TIM4->CR1 |= TIM_CR1_CEN;
}


Сообщение отредактировал IgorKossak - Dec 2 2011, 13:48
Причина редактирования: [codebox]
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 17:17
Рейтинг@Mail.ru


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