STM32f205: ADC меня игнорирует!

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Прорезались зубы
Сообщения: 210
Зарегистрирован: Пн окт 21, 2013 07:33:45

Сообщение FPGAlover »

Добрый день!
программирую АЦП. В конечном счете оно должно работать в трипл-моде, но как то с ходу не задалось.
По пути упрощений я снизошел до самого элементарного (код и лог приведены ниже)- программный опрос 1го преобразования без пдп и прерываний...
Однако ж, АЦП вроде как и работает, и выдает достаточно правдоподобные данные, но чихать оно хотело, на то что я подаю на вход...
Раз 5 перепроверял, а точно ли нога та: ТА!
Посмотрите пожалуйста опытным и незамыленным взглядом. Наверняка подвох на поверхности. (если чип, конечно, не подгорел :cry: )

собственно код:
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); // а надо ли тактировать аналоговый вход???
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = 0;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; // я так понимаю, это не имеет значения
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; // и соответственно это тоже
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz; // и это...
GPIO_Init(GPIOA, &GPIO_InitStruct);

//0 й канал АЦП висит на PA0
// (pin 14 для 64ножечного корпуса. в него и тыкаем тестовым сигналом)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);

ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_Resolution = 12;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfConversion = 1;
ADC_Init(ADC1, &ADC_InitStructure);
for (i=1; i<17; i++)
ADC_RegularChannelConfig(ADC1, ADC_Channel_0,i,ADC_SampleTime_3Cycles);//can be 3,15, 28, 56, 84, 112, 144, 480 cycles

ADC_Cmd(ADC1, ENABLE);
while (1)
{
if (i++ == 0x1000000)
{
if (ADCTestStatus()) {
ADC_SoftwareStartConv(ADC1);
j=0;//для посмотреть сколько времени висит в цикле
while (!(ADC1->SR & ADC_SR_EOC)) {
j++;
}
uint16_t data = ADC_GetConversionValue(ADC1);
//отсылаем лог по виртуальному ком порту
uint16tohex(j,&c1,&c2,&c3,&c4);
sendchar('j');sendchar('='); //к-во циклов на преобразование
sendchar(c1);sendchar(c2);
sendchar(c3);sendchar(c4);
sendchar(' ');
uint16tohex(data,&c1,&c2,&c3,&c4); //собственно данные с АЦП
sendchar('V');sendchar('=');
sendchar(c1);sendchar(c2);
sendchar(c3);sendchar(c4);
sendchar(10);
sendchar(13);
}
i = 0;
}
}
и лог:
j=0005 V=0039
j=0005 V=003A
j=0005 V=0039
j=0005 V=003A
j=0005 V=0039
j=0005 V=003A
j=0005 V=0039
j=0005 V=003B
j=0005 V=003C
j=0005 V=003B
j=0005 V=0039
Шоб я польку танцевал..
Реклама
Прорезались зубы
Сообщения: 210
Зарегистрирован: Пн окт 21, 2013 07:33:45

Сообщение FPGAlover »

перепрограммировал ногу на выход, ради эксперимента: результат тот же!
АЦП что то преобразует, а что - не понятно...
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
Шоб я польку танцевал..
Реклама
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1433
Зарегистрирован: Вс дек 02, 2012 03:13:48
Откуда: Калининград

Сообщение balmer »

Вот эта строчка вызывает подозрения...
for (i=1; i<17; i++)

вроде бы надо один канал указывать...

еще неплохо бы калибрацию провести.

Код: Выделить всё

ADC_ResetCalibration(ADC1);
while (ADC_GetResetCalibrationStatus(ADC1));
/* Start ADC1 calibration */
ADC_StartCalibration(ADC1);
/* Check the end of ADC1 calibration */
while (ADC_GetCalibrationStatus(ADC1));
Прорезались зубы
Сообщения: 210
Зарегистрирован: Пн окт 21, 2013 07:33:45

Сообщение FPGAlover »

balmer писал(а):еще неплохо бы калибрацию провести
в библиотеке периферии для F2xx (по крайней мере в stm32f2xx_adc.c) таких функций нет.
Попробую ручками, через регистры. хотя буквально на днях курил RM033 (раздел про ADC) не припомню, что бы калибрация мне встретилась(хотя мог и пролистать).
По поводу
for (i=1; i<17; i++)
тут ничего страшного нет:
тут основной смысл, вроде бы как имеет
ADC_InitStructure.ADC_NbrOfConversion = 1;
кроме того если я эти поля не заполню - там все равно будет что то лежать. Уж лучше знать, чем догадываться.
В любом случае я и без цикла только для 1го измерения заполнял с тем же результатом.
Шоб я польку танцевал..
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

Задолбало уже :
указывайте какой камень, STM32f205 - это ни о чем .
Может камень в 100pin или выше и Vref висят в воздухе ...
Реклама
Прорезались зубы
Сообщения: 210
Зарегистрирован: Пн окт 21, 2013 07:33:45

Сообщение FPGAlover »

Может камень в 100pin или выше и Vref висят в воздухе ...
прошу прощения, не на самом видном месте было :-)
(pin 14 для 64ножечного корпуса. в него и тыкаем тестовым сигналом)
камень STM32F205RBT6
Шоб я польку танцевал..
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

FPGAlover, к сожаление нет у мну 205 .
Могу посоветовать , если юзаешь Keil, потыкать прямиком в биты в отладчике .
Весьма информативно. Глядишь и SPL лесом пойдет... :)))
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

FPGAlover писал(а): По поводу
for (i=1; i<17; i++)
тут ничего страшного нет:

Страшного то ничего, но это танцы с бубном .
Как по твоему сколько каналов сконфигурирует и каких сия шняга ? :)))
ИЛи за что там i отвечает в конфиге ? :)))

Точней сколько раз будет вызвана

Код: Выделить всё

ADC_RegularChannelConfig(ADC1, ADC_Channel_0,i,ADC_SampleTime_3Cycles);
и с каким(и) i ?
Прорезались зубы
Сообщения: 210
Зарегистрирован: Пн окт 21, 2013 07:33:45

Сообщение FPGAlover »

dosikus, пользую IAR, однако SPL я проверил и убедился, что он тыкает нужные регистры в нужные точки. По началу я все делал ручками, потом пообъединял в функции и получил тот же SPL, вид с боку :-)
Ну что ж... попробую камень перепаять :(
dosikus писал(а):Как по твоему сколько каналов сконфигурирует и каких сия шняга ? :)))
что значит каналов? что по Вашему делает
dosikus писал(а):сия шняга
? и как Вы понимаете физический смысл Rank(параметр i в ADC_RegularChannelConfig), ADC_SampleTime?

функция вызовется 16 раз и соответственно заполнит 16 логических регистров по 5бит номером канала ADC_Channel_0 и 16 логических регистров по 3бит со временем выборки.
i тут по сути индекс логического регистра. Можно даже сказать элемента массива.
И все. Танцы с бубном тут не при чем. Я вполне отдаю себе отчет что это и для чего это надо.
даже при
FPGAlover писал(а):ADC_InitStructure.ADC_ScanConvMode = ENABLE;
будет всегда опрашиваться 0-й канал, как не крути.
Шоб я польку танцевал..
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

FPGAlover писал(а): и как Вы понимаете физический смысл Rank(параметр i в ADC_RegularChannelConfig), ADC_SampleTime?
Ну да, я тут неверно сформулировал, точней неполно .
Алаверды - а ты сам понимаешь сущность RANK ?
Это вообще-то длина группы в преобразованиях и сама группа . :)))
FPGAlover писал(а): функция вызовется 16 раз и соответственно заполнит 16 логических регистров по 5бит номером канала ADC_Channel_0 и 16 логических регистров по 3бит со временем выборки.
И все. Танцы с бубном тут не при чем. Я вполне отдаю себе отчет что это и для чего это надо.
даже при
FPGAlover писал(а):ADC_InitStructure.ADC_ScanConvMode = ENABLE;
будет всегда опрашиваться 0-й канал, как не крути.
А теперь без надумок :
функция вызовется 1 единственный раз с i==16 ....
Прорезались зубы
Сообщения: 210
Зарегистрирован: Пн окт 21, 2013 07:33:45

Сообщение FPGAlover »

Ну да.... сампл тайм привязан к конкретному каналу АЦП а не номеру выборки в регулярной последовательности. был не прав.
а на счет rank это действительно номер в опросе регулярной группы.
Кстати, не сильно логично объединение этих 2х функционалов в одну функцию ...
Это вообще-то длина группы в преобразованиях и сама группа
длинна группы это L[3:0], а если точнее, то ADC_SQR1[23:20]

а то что rank это индекс выборки очень неплохо вытекает хотя бы из того же SPL
if (Rank < 7)
{
tmpreg1 = ADCx->SQR3;
tmpreg2 = SQR3_SQ_SET << (5 * (Rank - 1));
tmpreg1 &= ~tmpreg2;
tmpreg2 = (uint32_t)ADC_Channel << (5 * (Rank - 1));
tmpreg1 |= tmpreg2;
ADCx->SQR3 = tmpreg1;
}
очевидно, что в зависимости от него номер канала кладется в нужную пятерку бит.

да, и
функция вызовется 1 единственный раз с i==16 ....
вызвалась 16 раз с i=1..16, доказано отладчиком :-)
в общем, камень я перепаял... результат тот же :(
Последний раз редактировалось FPGAlover Пн дек 09, 2013 15:23:05, всего редактировалось 1 раз.
Шоб я польку танцевал..
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

FPGAlover писал(а):
в общем, камень я перепаял... результат тот же :(

Да попробуй в Keil .
И может здесь что поможет http://ziblog.ru/2011/01/15/stm32-chast ... -atsp.html
Пока могу только гадать, ибо как и писал в железе не проверить .
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

FPGAlover писал(а): вызвалась 16 раз с i=1..16, доказано отладчиком :-)
Упс , просмотрел- точки с запятой после цикла нет.
Да и не суть, один хрен танцы с бубном .
Посмотри как у ZIB конфигурируется , отличии от F205 минимальные должны быть .
Прорезались зубы
Сообщения: 210
Зарегистрирован: Пн окт 21, 2013 07:33:45

Сообщение FPGAlover »

dosikus писал(а):Посмотри как у ZIB конфигурируется , отличии от F205 минимальные должны быть .
Видимо имеются :-) . Это ж для 1й серии.
Прям с ходу :
делитель входной частоты для АЦП там на RCC сделан, тут же родной регистр.
калибровка во 2й серии отсутствует как класс.
можно и дальше рыть, но одно знаю точно: когда я подобное на первой серии делал у меня все взвелось с первого раза...
Шоб я польку танцевал..
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1433
Зарегистрирован: Вс дек 02, 2012 03:13:48
Откуда: Калининград

Сообщение balmer »

Похоже FPGAlover ты тут единственный специалист по STM32F2xx . У меня только STM32F1xx, STM32L1xx и STM32F303 есть.
STM32F2xx - какое-то специфическое семейство...
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

FPGAlover писал(а): Прям с ходу :
делитель входной частоты для АЦП там на RCC сделан, тут же родной регистр.
калибровка во 2й серии отсутствует как класс.
можно и дальше рыть, но одно знаю точно: когда я подобное на первой серии делал у меня все взвелось с первого раза...
Это все мелочи и легко обходятся , ядро АЦП аналогичное.
Вот только SPL тебе в этом нисколько не поможет , только чтение даташита .
И как попугай повторюсь - Keil и потыкать биты ...
Прорезались зубы
Сообщения: 210
Зарегистрирован: Пн окт 21, 2013 07:33:45

Сообщение FPGAlover »

Вот только SPL тебе в этом нисколько не поможет , только чтение даташита
согласен. его то я и курю в основном(RM0033), а потом SPL трассирую. пока расхождений не найдено... нужные биты идут в нужные места :-)
все это мелочи
дьявол в нюансах!
balmer писал(а):STM32F2xx - какое-то специфическое семейство
да, это я понял пока усб поднимал :-)
Последний раз редактировалось FPGAlover Пн дек 09, 2013 21:17:58, всего редактировалось 1 раз.
Шоб я польку танцевал..
Прорезались зубы
Сообщения: 210
Зарегистрирован: Пн окт 21, 2013 07:33:45

Сообщение FPGAlover »

Вобщем расклад регистров после инициализации такой:
Common Regs:
Common Regs:
CCR=00000000
CDR=00000000
CSR=00000000
ADC1 Regs:
CR1=0000000C
CR2=00000001
HTR=00000FFF
LTR=00000000
SMPR1=00000000
SMPR2=00000000
SQR1=00000000
SQR2=00000000
SQR3=00000000
SR=00000000
Но стоит хоть раз снять показания АЦП

Код: Выделить всё

       
        ADC_SoftwareStartConv(ADC1);  
        j=0;//для посмотреть сколько времени висит в цикле
        while (!(ADC1->SR & ADC_SR_EOC)) {
          j++;
        }
        uint16_t data = ADC_GetConversionValue(ADC1);
Как флаг STRT в регистре SR взводится и никуда не девается... Ручками то сбрасывается, но это ничего не дает
RM0033 писал(а):Bit 4
STRT:
Regular channel start flag
This bit is set by hardware when regular channel conversion starts. It is cleared by software.
0: No regular channel conversion started
1: Regular channel conversion has started
Будем курить дальше :-)
Шоб я польку танцевал..
Прорезались зубы
Сообщения: 210
Зарегистрирован: Пн окт 21, 2013 07:33:45

Сообщение FPGAlover »

АААААААА!!!!! я уже практически все биты во всех регистрах наизусть знаю!!!!
Должно быть что то очевидное упущено!!!!
Шоб я польку танцевал..
Прорезались зубы
Сообщения: 210
Зарегистрирован: Пн окт 21, 2013 07:33:45

Сообщение FPGAlover »

Опросил 16 канал (температурный сенсор) - работает как надо! проверял феном :-)
т.е. блок АЦП настроен правильно...
но тогда в чем же дело??? GPIO неправильно настроен на нулевой канал???
проверял и 0й и 1й и 2й (все 3 разведены на плате)
Шоб я польку танцевал..
Ответить

Вернуться в «ARM»