whale 6 6 февраля, 2021 Опубликовано 6 февраля, 2021 · Жалоба Все что можно по теме перечитал, ацп на вход не реагирует, как можно починить ? Однократное преобразоваине одного канала. На выходе все время нули. Порт в аналог моде (по сбросу). void ADC_Init(void) { // Включаем тактирование ADC RCC->APBENR2 |=RCC_APBENR2_ADCEN; // вкл тактирование ADC RCC->CCIPR |=(0x01<<RCC_CCIPR_ADCSEL_Pos); // источник тактирования ADC PLLPCLK 64мгц ADC->CCR=0; ADC1->CR=0; ADC1->CFGR1=0; ADC1->CHSELR=0; // делитель ADC на 2 -> 32 мгц /14 тактов общ / 1.5 такта выборка ADC->CCR |=(0x01<<ADC_CCR_PRESC_Pos); //01=32мгц ADC1->CFGR2 |=(0x02<<ADC_CFGR2_CKMODE_Pos); //PCLK/4 // 00: ADCCLK (Asynchronous clock mode), generated at product level (refer to RCC section) // 01: PCLK/2 (Synchronous clock mode) // 10: PCLK/4 (Synchronous clock mode) // время выборки по сбросу 1.5 такта на всех каналах / рег ADC_SMPR ADC1->CHSELR |= ADC_CHSELR_CHSEL8; // выбор канала ADC8 (PB0) в последовательности //ADC1->CFGR1 // CHSELRMOD = 0 in ADC_CFGR1 по сбросу - отдельные каналы // DISCEN = 0 - непр режим выкл // CONT =0 - одиноч преобр // EXTEN = 00 - запуск от ADSTART // ALIGN = 0 - выравнивание вправо // RES = 0 -разреш 12 бит // калибровка ADC->CCR |= ADC_CCR_VREFEN; // вкл внутренний ИОН для калибровки ADC1->CR |= ADC_CR_ADCAL; // вкл калибровку while((ADC1->ISR & ADC_ISR_EOCAL)); //пока ADCAL=1 ждем // управление ADC1->CR |= ADC_CR_ADEN; // включить adc while((ADC1->ISR & ADC_ISR_ADRDY)!= ADC_ISR_ADRDY); //пока ADRDY=0 ждем готовности ацп //ADC1->CR |= ADC_CR_ADSTART; // запуск выборки //ADC->DR // регистр данных V = Vin*4095/3.3 } // запуск ADC1->CR |= ADC_CR_ADSTART; // запуск //чтение ADC_ch = ADC1->DR; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 87 6 февраля, 2021 Опубликовано 6 февраля, 2021 · Жалоба Что за контроллер? Отладчиком пошагово проходили программу? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrBearManul 0 6 февраля, 2021 Опубликовано 6 февраля, 2021 · Жалоба 1 час назад, whale сказал: // запуск ADC1->CR |= ADC_CR_ADSTART; // запуск //чтение ADC_ch = ADC1->DR; Это вообще как? Запуск и сразу чтение. Для преобразования АЦП требуется N-тактов, см. документацию. И вы обязаны их выждать. Либо поллингом опрашивая флаг, либо настроив прерывание. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
whale 6 6 февраля, 2021 Опубликовано 6 февраля, 2021 (изменено) · Жалоба Just now, MrBearManul said: Это вообще как? Запуск и сразу чтение. Для преобразования АЦП требуется N-тактов, см. документацию. И вы обязаны их выждать. Либо поллингом опрашивая флаг, либо настроив прерывание. Коннечно, это просто привел как читается в проге. По прерываниям таймера читается с заведомо большим периодом чем оцифровка. Just now, HardEgor said: Что за контроллер? Отладчиком пошагово проходили программу? STM32G070KB пошагово тут сложно, во всяком случае затыка нигде нет. Изменено 6 февраля, 2021 пользователем whale Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrBearManul 0 6 февраля, 2021 Опубликовано 6 февраля, 2021 · Жалоба 1 минуту назад, whale сказал: Коннечно, это просто привел как читается в проге. Ну и где же вы ждёте завершения преобразования? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
whale 6 6 февраля, 2021 Опубликовано 6 февраля, 2021 (изменено) · Жалоба Тут просто не указано, обычное прерывание таймера Зашли в прерывание, прочитали , запустили и ждем следующее прерывание. Изменено 6 февраля, 2021 пользователем whale Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrBearManul 0 6 февраля, 2021 Опубликовано 6 февраля, 2021 · Жалоба 1 час назад, whale сказал: Все что можно по теме перечитал Не похоже на правду. Иначе бы нашли что-то о флагах завершения преобразования и опрашивали бы их после запуска. 1 минуту назад, whale сказал: Тут просто не указано, обыное прерывание таймера Какой таймер? Вы же об АЦП спрашиваете. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
whale 6 6 февраля, 2021 Опубликовано 6 февраля, 2021 (изменено) · Жалоба Just now, MrBearManul said: Не похоже на правду. Иначе бы нашли что-то о флагах завершения преобразования и опрашивали бы их после запуска. Зачем их опрашивать если по времение там все завершается 100% Можно их вставить то толку не будет Изменено 6 февраля, 2021 пользователем whale Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrBearManul 0 6 февраля, 2021 Опубликовано 6 февраля, 2021 · Жалоба 2 минуты назад, whale сказал: Зачем их опрашивать если по времение там все завершается 100% У вас в программе запуск преобразования происходит здесь ADC1->CR |= ADC_CR_ADSTART; // запуск А чтение здесь 1 час назад, whale сказал: //чтение ADC_ch = ADC1->DR; Причём строки эти написаны одна за другой. С чего вы решили, что времени на завершение хватит? У вас на всё тратится 15.5 тактов, и это будет 15.5/32x10^6=484 нс. Один такт МК составляет 17 нс (у вас частота 64 МГц). Значит, за время преобразования АЦП гурбо выполнится 28 однотактовых команд. На самом деле меньше, т.к. там будет команды, занимающие несколько тактов. Но всё же, как вы гарантируете, что АЦП 100% завершит преобразование за время, пока процессор не вычитает регистр данных? Или вы программу в первом посте привели не соответствующую действительности. Видимо, в реальности у вас всё по-другому сделано. 7 минут назад, whale сказал: Можно их вставить то толку не будет Пипец. Вы пришли спросить совета, вам ответили. Будьте добры, выполните то, что советуют. А затем перечитайте документацию, разберитесь как работает АЦП. И ещё, вы не забыли соответствующие GPIO настроить на аналоговые функции? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
whale 6 6 февраля, 2021 Опубликовано 6 февраля, 2021 (изменено) · Жалоба Just now, MrBearManul said: У вас в программе запуск преобразования происходит здесь void TIM3_IRQHandler(void) { TIM3->SR = ~TIM_SR_UIF; // сбрасываем прерывание - Флаг надо сбрасывать самому! //----------------------------- while((ADC1->ISR & ADC_ISR_ADRDY)!= ADC_ISR_ADRDY); ADC_ch = ADC1->DR; ADC1->CR |= ADC_CR_ADSTART; // запуск } Вот так реализован опрос Мож я где то тактирование не разрешил или еще что то недописал в инициализации ? PLLPCLK разрешил, тактирование ADC разрешил, способ выбрал, вроде все на месте глаз уже дергаться стал с этим stm ) Вход PB0 то бишь ADC8 Остается разве все какие есть флаги почитать мож прояснят Изменено 6 февраля, 2021 пользователем whale Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrBearManul 0 6 февраля, 2021 Опубликовано 6 февраля, 2021 · Жалоба 6 минут назад, whale сказал: Вот так реализован опрос Зачем приводите нерабочий код в стартовом сообщении и сбиваете отвечающих вам с толку? Почему про таймер ничего не сказали? Вернее сказали, но после того, как я вам задал вопросы. Что вы ещё скрываете? Или снова будете в глупую угадайку играть, как тут? 03.02.2021 в 23:31, whale сказал: Вот один догадался, значит самый умный ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
whale 6 6 февраля, 2021 Опубликовано 6 февраля, 2021 · Жалоба Что нужно еще рассказать ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrBearManul 0 6 февраля, 2021 Опубликовано 6 февраля, 2021 · Жалоба 8 минут назад, whale сказал: Мож я где то тактирование не разрешил или еще что то недописал в инициализации ? Прерывание точно вызывается? Как проверили? Вот вы утверждаете, что опрос флагов не нужен, т.е. период вызова прерываний заведомо больше, чем время преобразования АЦП, но зачем же вы его опрашиваете??? 10 минут назад, whale сказал: while((ADC1->ISR & ADC_ISR_ADRDY)!= ADC_ISR_ADRDY); Только что, whale сказал: Что нужно еще рассказать ? Обычно, всё, что поможет ответить на ваш вопрос: 1. Модель МК. 2. Версия компилятора, среда отладки. 3. Если приводите код, то приводите тот, что вы используете, а не черновики. 4. Логично было догадаться, что про таймер нужно было сказать в первом сообщении и там же привести код обработчика. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
whale 6 6 февраля, 2021 Опубликовано 6 февраля, 2021 (изменено) · Жалоба Абсолютно, осцилографом да и без превывания прога бы висела. Если вместо ADC1->DR; вставить число, выводит это число. Опрос специально для вас прописал в прогу ноль результата.. Изменено 6 февраля, 2021 пользователем whale Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrBearManul 0 6 февраля, 2021 Опубликовано 6 февраля, 2021 · Жалоба 15 минут назад, MrBearManul сказал: И ещё, вы не забыли соответствующие GPIO настроить на аналоговые функции? 1 минуту назад, whale сказал: и без превывания прога бы висела С чего бы это? 1 минуту назад, whale сказал: Опрос специально для вас прописал в прогу ноль результата.. Мне это не нужно. А про опрос я вам говорил относительно исходного кода в стартовом сообщении. Вы, по-моему, плохо понимаете о чём идёт речь. Ещё раз: GPIO настроили на аналоговую функцию? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться