Добрый день! программирую АЦП. В конечном счете оно должно работать в трипл-моде, но как то с ходу не задалось. По пути упрощений я снизошел до самого элементарного (код и лог приведены ниже)- программный опрос 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_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; } }
Вот эта строчка вызывает подозрения... 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));
в библиотеке периферии для F2xx (по крайней мере в stm32f2xx_adc.c) таких функций нет. Попробую ручками, через регистры. хотя буквально на днях курил RM033 (раздел про ADC) не припомню, что бы калибрация мне встретилась(хотя мог и пролистать). По поводу
Цитата:
for (i=1; i<17; i++)
тут ничего страшного нет: тут основной смысл, вроде бы как имеет
Цитата:
ADC_InitStructure.ADC_NbrOfConversion = 1;
кроме того если я эти поля не заполню - там все равно будет что то лежать. Уж лучше знать, чем догадываться. В любом случае я и без цикла только для 1го измерения заполнял с тем же результатом.
FPGAlover, к сожаление нет у мну 205 . Могу посоветовать , если юзаешь Keil, потыкать прямиком в биты в отладчике . Весьма информативно. Глядишь и SPL лесом пойдет...
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-й канал, как не крути.
и как Вы понимаете физический смысл 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 ....
Ну да.... сампл тайм привязан к конкретному каналу АЦП а не номеру выборки в регулярной последовательности. был не прав. а на счет rank это действительно номер в опросе регулярной группы. Кстати, не сильно логично объединение этих 2х функционалов в одну функцию ...
Цитата:
Это вообще-то длина группы в преобразованиях и сама группа
длинна группы это L[3:0], а если точнее, то ADC_SQR1[23:20]
а то что rank это индекс выборки очень неплохо вытекает хотя бы из того же SPL
Упс , просмотрел- точки с запятой после цикла нет. Да и не суть, один хрен танцы с бубном . Посмотри как у ZIB конфигурируется , отличии от F205 минимальные должны быть .
Посмотри как у ZIB конфигурируется , отличии от F205 минимальные должны быть .
Видимо имеются . Это ж для 1й серии. Прям с ходу : делитель входной частоты для АЦП там на RCC сделан, тут же родной регистр. калибровка во 2й серии отсутствует как класс. можно и дальше рыть, но одно знаю точно: когда я подобное на первой серии делал у меня все взвелось с первого раза...
Похоже FPGAlover ты тут единственный специалист по STM32F2xx . У меня только STM32F1xx, STM32L1xx и STM32F303 есть. STM32F2xx - какое-то специфическое семейство...
Прям с ходу : делитель входной частоты для АЦП там на RCC сделан, тут же родной регистр. калибровка во 2й серии отсутствует как класс. можно и дальше рыть, но одно знаю точно: когда я подобное на первой серии делал у меня все взвелось с первого раза...
Это все мелочи и легко обходятся , ядро АЦП аналогичное. Вот только SPL тебе в этом нисколько не поможет , только чтение даташита . И как попугай повторюсь - Keil и потыкать биты ...
Вобщем расклад регистров после инициализации такой: 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
Опросил 16 канал (температурный сенсор) - работает как надо! проверял феном т.е. блок АЦП настроен правильно... но тогда в чем же дело??? GPIO неправильно настроен на нулевой канал??? проверял и 0й и 1й и 2й (все 3 разведены на плате)
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения