Zender12 Опубликовано 3 мая, 2014 Поделиться Опубликовано 3 мая, 2014 (изменено) Здравствуйте, подскажите пожалуйста где ошибка. Была написана простая программа для STM32F4DISCOVERY использующая АЦП для измерений, был подключён потенциометр на 10kOm средней точкой к выводу PA1 . #include <stm32f4xx.h> #include <stm32f4xx_rcc.h> #include <stm32f4xx_gpio.h> #include <stm32f4xx_adc.h> int ReadADC1() { ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_3Cycles); ADC_SoftwareStartConv(ADC1); while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); return ADC_GetConversionValue(ADC1); } void main(void) { // RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); GPIO_InitTypeDef GPIO_STR; ADC_InitTypeDef ADC_STR; ADC_CommonInitTypeDef ADC_CSTR; GPIO_STR.GPIO_Mode=GPIO_Mode_AN; GPIO_STR.GPIO_Pin=GPIO_Pin_1; GPIO_Init(GPIOA,&GPIO_STR); ADC_DeInit(); ADC_CSTR.ADC_Mode=ADC_Mode_Independent; ADC_CSTR.ADC_Prescaler=ADC_Prescaler_Div2; ADC_CommonInit(&ADC_CSTR); ADC_STR.ADC_ContinuousConvMode=DISABLE; ADC_STR.ADC_DataAlign=ADC_DataAlign_Right; ADC_STR.ADC_ExternalTrigConv=ADC_ExternalTrigConvEdge_None; //ADC_STR.ADC_NbrOfConversion=ADC_N ADC_STR.ADC_Resolution=ADC_Resolution_12b; ADC_STR.ADC_ScanConvMode=DISABLE; ADC_Init(ADC1,&ADC_STR); ADC_Cmd(ADC1,ENABLE); int adc_temp=0,sum=0; while(1) { for (time = 0; time <= 1000; time++) { delay(300); adc_temp=ReadADC1(); sum+=adc_temp; } sum/=1000; } } . Сначала всё замечательно работало но спустя какое-то время без каких-либо изменений в коде и схеме перестала работать. Как выяснилось позже происходит зацикливание на одной из строк кода while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); . В одно включение программа работает без сбоев, ведутся нормальные замеры, в следующий же раз происходит зацикливание, даже без изменения кода. Даже при удалении участка кода где происходит зацикливание (что насколько я понимаю в корне не верно) приходят неверные данные. Прошу подскажите всё-ли верно в инициализации и использовании АЦП и что может приводить к таким проблемам? Изменено 3 мая, 2014 пользователем Zender12 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Вуйко Опубликовано 4 мая, 2014 Поделиться Опубликовано 4 мая, 2014 1. Неверные замеры могут происходить из-за небольшого входного сопротивления АЦП. Насколько я помню, оно приблизительно равно 20-30 кОм. Поставьте между входом АЦП и источником сигнала буфер. 2. Если программа зависает на проверке статуса флага попробуйте написать эту часть кода с помощью прерываний. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
Гость Zender12 Опубликовано 15 мая, 2014 Поделиться Опубликовано 15 мая, 2014 Можете разьяснить как именно использовать прерывания. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
Oxford Опубликовано 10 июля, 2014 Поделиться Опубликовано 10 июля, 2014 На других каналах тоже виснит? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Zender12 Опубликовано 11 июля, 2014 Автор Поделиться Опубликовано 11 июля, 2014 На других каналах тоже виснит? Да. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Oxford Опубликовано 11 июля, 2014 Поделиться Опубликовано 11 июля, 2014 (изменено) После включения ADC, добавьте ADC_Cmd(ADC1,ENABLE); ADC_EOCOnEachRegularChannelCmd(ADC1, ENABLE); Изменено 11 июля, 2014 пользователем Oxford 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Oxford Опубликовано 12 июля, 2014 Поделиться Опубликовано 12 июля, 2014 Помогло? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Zender12 Опубликовано 1 сентября, 2014 Автор Поделиться Опубликовано 1 сентября, 2014 Помогло? К сожалению нет 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Женя Опубликовано 15 сентября, 2014 Поделиться Опубликовано 15 сентября, 2014 На сколько я понял CooCox использует старые библиотеки std peripheral, при прогоне это го же кода в EM Blocks все отлично работает. Всем СПС. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.