Страница 1 из 2
STM32f205: ADC меня игнорирует!
Добавлено: Пн дек 09, 2013 11:40:44
FPGAlover
Добрый день!
программирую АЦП. В конечном счете оно должно работать в трипл-моде, но как то с ходу не задалось.
По пути упрощений я снизошел до самого элементарного (код и лог приведены ниже)- программный опрос 1го преобразования без пдп и прерываний...
Однако ж, АЦП вроде как и работает, и выдает достаточно правдоподобные данные, но чихать оно хотело, на то что я подаю на вход...
Раз 5 перепроверял, а точно ли нога та: ТА!
Посмотрите пожалуйста опытным и незамыленным взглядом. Наверняка подвох на поверхности. (если чип, конечно, не подгорел

)
собственно код:
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
Re: STM32f205: ADC меня игнорирует!
Добавлено: Пн дек 09, 2013 11:55:13
FPGAlover
перепрограммировал ногу на выход, ради эксперимента: результат тот же!
АЦП что то преобразует, а что - не понятно...
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
Re: STM32f205: ADC меня игнорирует!
Добавлено: Пн дек 09, 2013 12:12:27
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));
Re: STM32f205: ADC меня игнорирует!
Добавлено: Пн дек 09, 2013 12:33:22
FPGAlover
balmer писал(а):еще неплохо бы калибрацию провести
в библиотеке периферии для F2xx (по крайней мере в stm32f2xx_adc.c) таких функций нет.
Попробую ручками, через регистры. хотя буквально на днях курил RM033 (раздел про ADC) не припомню, что бы калибрация мне встретилась(хотя мог и пролистать).
По поводу
for (i=1; i<17; i++)
тут ничего страшного нет:
тут основной смысл, вроде бы как имеет
ADC_InitStructure.ADC_NbrOfConversion = 1;
кроме того если я эти поля не заполню - там все равно будет что то лежать. Уж лучше знать, чем догадываться.
В любом случае я и без цикла только для 1го измерения заполнял с тем же результатом.
Re: STM32f205: ADC меня игнорирует!
Добавлено: Пн дек 09, 2013 12:57:44
dosikus
Задолбало уже :
указывайте какой камень, STM32f205 - это ни о чем .
Может камень в 100pin или выше и Vref висят в воздухе ...
Re: STM32f205: ADC меня игнорирует!
Добавлено: Пн дек 09, 2013 13:03:10
FPGAlover
Может камень в 100pin или выше и Vref висят в воздухе ...
прошу прощения, не на самом видном месте было
(pin 14 для 64ножечного корпуса. в него и тыкаем тестовым сигналом)
камень STM32F205RBT6
Re: STM32f205: ADC меня игнорирует!
Добавлено: Пн дек 09, 2013 13:20:39
dosikus
FPGAlover, к сожаление нет у мну 205 .
Могу посоветовать , если юзаешь Keil, потыкать прямиком в биты в отладчике .
Весьма информативно. Глядишь и SPL лесом пойдет...

Re: STM32f205: ADC меня игнорирует!
Добавлено: Пн дек 09, 2013 13:29:23
dosikus
FPGAlover писал(а):
По поводу
for (i=1; i<17; i++)
тут ничего страшного нет:
Страшного то ничего, но это танцы с бубном .
Как по твоему сколько каналов сконфигурирует и каких сия шняга ?
ИЛи за что там i отвечает в конфиге ?
Точней сколько раз будет вызвана
Код: Выделить всё
ADC_RegularChannelConfig(ADC1, ADC_Channel_0,i,ADC_SampleTime_3Cycles);
и с каким(и) i ?
Re: STM32f205: ADC меня игнорирует!
Добавлено: Пн дек 09, 2013 13:54:25
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-й канал, как не крути.
Re: STM32f205: ADC меня игнорирует!
Добавлено: Пн дек 09, 2013 14:03:27
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 ....
Re: STM32f205: ADC меня игнорирует!
Добавлено: Пн дек 09, 2013 15:12:54
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, доказано отладчиком

в общем, камень я перепаял... результат тот же

Re: STM32f205: ADC меня игнорирует!
Добавлено: Пн дек 09, 2013 15:21:10
dosikus
FPGAlover писал(а):
в общем, камень я перепаял... результат тот же

Да попробуй в Keil .
И может здесь что поможет
http://ziblog.ru/2011/01/15/stm32-chast ... -atsp.html
Пока могу только гадать, ибо как и писал в железе не проверить .
Re: STM32f205: ADC меня игнорирует!
Добавлено: Пн дек 09, 2013 15:24:19
dosikus
FPGAlover писал(а):
вызвалась 16 раз с i=1..16, доказано отладчиком
Упс , просмотрел- точки с запятой после цикла нет.
Да и не суть, один хрен танцы с бубном .
Посмотри как у ZIB конфигурируется , отличии от F205 минимальные должны быть .
Re: STM32f205: ADC меня игнорирует!
Добавлено: Пн дек 09, 2013 16:11:59
FPGAlover
dosikus писал(а):Посмотри как у ZIB конфигурируется , отличии от F205 минимальные должны быть .
Видимо имеются

. Это ж для 1й серии.
Прям с ходу :
делитель входной частоты для АЦП там на RCC сделан, тут же родной регистр.
калибровка во 2й серии отсутствует как класс.
можно и дальше рыть, но одно знаю точно: когда я подобное на первой серии делал у меня все взвелось с первого раза...
Re: STM32f205: ADC меня игнорирует!
Добавлено: Пн дек 09, 2013 16:18:49
balmer
Похоже FPGAlover ты тут единственный специалист по STM32F2xx . У меня только STM32F1xx, STM32L1xx и STM32F303 есть.
STM32F2xx - какое-то специфическое семейство...
Re: STM32f205: ADC меня игнорирует!
Добавлено: Пн дек 09, 2013 16:31:54
dosikus
FPGAlover писал(а):
Прям с ходу :
делитель входной частоты для АЦП там на RCC сделан, тут же родной регистр.
калибровка во 2й серии отсутствует как класс.
можно и дальше рыть, но одно знаю точно: когда я подобное на первой серии делал у меня все взвелось с первого раза...
Это все мелочи и легко обходятся , ядро АЦП аналогичное.
Вот только SPL тебе в этом нисколько не поможет , только чтение даташита .
И как попугай повторюсь - Keil и потыкать биты ...
Re: STM32f205: ADC меня игнорирует!
Добавлено: Пн дек 09, 2013 16:40:17
FPGAlover
Вот только SPL тебе в этом нисколько не поможет , только чтение даташита
согласен. его то я и курю в основном(RM0033), а потом SPL трассирую. пока расхождений не найдено... нужные биты идут в нужные места
все это мелочи
дьявол в нюансах!
balmer писал(а):STM32F2xx - какое-то специфическое семейство
да, это я понял пока усб поднимал

Re: STM32f205: ADC меня игнорирует!
Добавлено: Пн дек 09, 2013 18:10:59
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
Будем курить дальше

Re: STM32f205: ADC меня игнорирует!
Добавлено: Пн дек 09, 2013 22:18:27
FPGAlover
АААААААА!!!!! я уже практически все биты во всех регистрах наизусть знаю!!!!
Должно быть что то очевидное упущено!!!!
Re: STM32f205: ADC меня игнорирует!
Добавлено: Вт дек 10, 2013 10:50:49
FPGAlover
Опросил 16 канал (температурный сенсор) - работает как надо! проверял феном

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