Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/16: Рейтинг темы: голосов - 16, средняя оценка - 4.63
Ptozmoyd
0 / 0 / 0
Регистрация: 31.01.2013
Сообщений: 70
1

STM32F1 АЦП. Проблема с регистром данных

22.02.2016, 21:24. Просмотров 2969. Ответов 2
Метки нет (Все метки)

Доброго времени суток!
Пытаюсь запустить АЦП1 в режиме непрерывном режиме с регулярными каналами: по переполнению таймера возникает прерывание, в обработчике запускаем преобразования, устанавливая бит SWSTART. В обработчике прерывания по завершению выборки АЦП данные из регистра DR сохраняются в массиве (счетчик элемента массива инкрементируется, при достижении 4-х обнуляется, а бит SWSTART сбрасывается до следующего переполнения таймера). Последовательность каналов следующая: 0, 1, 3, 4, 5. На канал 0 подается напряжение с блока питанию, остальные "висят в воздухе". Для проверки работоспособности АЦП полученные данные отправляются по UART на ПК. Проблема в том, что выборки со всех каналов одинаковые и соответствуют каналу 0. Создается впечатление, что регистр данных DR не перезаписывается.
Привожу функции инициализации и обработки прерывания АЦП:

Инициализация
Код
    RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;
GPIOA->CRL ^= GPIO_CRL_CNF0_0 | GPIO_CRL_CNF1_0 | GPIO_CRL_CNF3_0 | GPIO_CRL_CNF4_0 | GPIO_CRL_CNF5_0;
ADC1->SMPR2 |= ADC_SMPR2_SMP0 | ADC_SMPR2_SMP1 | ADC_SMPR2_SMP3 | ADC_SMPR2_SMP4 | ADC_SMPR2_SMP5;
ADC1->SQR1 |= ADC_SQR1_L_2 | ADC_SQR1_L_0; // 5 каналов
ADC1->SQR3 = 0;
ADC1->SQR3 |= ADC_SQR3_SQ2_0 | ADC_SQR3_SQ3_1 | ADC_SQR3_SQ3_0 | ADC_SQR3_SQ4_2 | ADC_SQR3_SQ5_2 | ADC_SQR3_SQ5_0;  // последовательность каналов 0,1,3,4,5
ADC1->CR1 |= ADC_CR1_EOCIE;
ADC1->CR2 |= ADC_CR2_CONT | ADC_CR2_EXTTRIG | ADC_CR2_EXTSEL | ADC_CR2_ADON;

ADC1->CR2 |= ADC_CR2_RSTCAL;
while ((ADC1->CR2 & ADC_CR2_RSTCAL) == ADC_CR2_RSTCAL)
{

}
ADC1->CR2 |= ADC_CR2_CAL;
while ((ADC1->CR2 & ADC_CR2_RSTCAL) == ADC_CR2_CAL)
{

}
Обработчик прерываний
Код
    if (!(ADC_COUNTER == 4)) ADC_COUNTER++;
else
{
ADC_COUNTER = 0;
ADC1->CR2 &= ADC_CR2_SWSTART;
}
ADC_ARRAY[ADC_COUNTER] = ADC1->DR;
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.02.2016, 21:24
Ответы с готовыми решениями:

Проблема с АЦП PIC16F887
Возникла необходимость АЦП. Решил воспользоваться стандартной функцией unsykned Adc_Read(unsykned...

Проблема с АЦП и CMSIS RTX
Пишу программу с АЦП. В мейне простой кусок кода while(1) { i = 10000000; /* AD_value =...

Проблема с точностью измерений АЦП STM32F415RGT6
Здравствуйте, уважаемые форумчане! Проблема с АЦП заключается в следующем: при измерении 220 в,...

STM32L-DISCOVERY - проблема с АЦП - ADONS не ставится
Добрый день! В двух словах, проблема такая. когда зашивается на STM32T-Dyscovery вот этот...

Проблема с регистром
Здравствуйте. Имеется текстовый столбец где значения хранятся большими буквами или маленькими...

2
u37
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,113
22.02.2016, 22:12 2
У STM32F1 ADC не буфферезированный, т.е. уровень предыдущего канала матрицируется на последующий. Если после реального канала следуют не подключенные, то потенциал частично перелезает на них. Для выхода из проблемы, или подключите на место пустующих каналов имеющиеся (ch16-18, включив их в в ADC_CCR), либо подключите пустующие к реальным цепям (низкоомным).
0
Ptozmoyd
0 / 0 / 0
Регистрация: 31.01.2013
Сообщений: 70
22.02.2016, 22:49 3
Не совсем понял, что имеется в виду под "пустующими каналами" - каналы 1, 3, 4, 5, на которые не подается напряжение, или каналы 2, 6...17, которые не включены в последовательность опроса регулярных каналов. Еще я сделал такое наблюдение: когда в последовательности опроса был только канал 0, все работало исправно, а когда добавил остальные каналы, канал 0 стал "запоминать" то напряжение, которое было на соответствующем выводе после перезагрузки МК, остальные каналы выводят то же самое, и все вместе они не реагируют на изменение сигнала.

В итоге проблему не решил, но задействовал 1 регулярный канал и 4 инжектированных, благо для проекта этого достаточно.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.02.2016, 22:49

Вывод символов с нижним регистром и верхним регистром
Стоит задача, водится строка, при выводе должно быть две строки, одна выводит символы только...

проблема с АЦП в ATmega168V
Имеется мк atmega168V в DIP корпусе с 28-ножками Необходимо получить напряжение с контакта...

Проблема с АЦП на ATMEGA48PA
Ребят, проблема такая: использую АЦП на борту ATMEGA48PA. Все делал по даташитам и рекомендациям...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru