Перейти к содержанию
    

Все что можно по теме перечитал, ацп на вход не реагирует, как можно починить ?

Однократное преобразоваине одного канала.

На выходе все время нули.

Порт в аналог моде (по сбросу).

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;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, whale сказал:

// запуск ADC1->CR |= ADC_CR_ADSTART; // запуск //чтение ADC_ch = ADC1->DR;

Это вообще как? Запуск и сразу чтение. Для преобразования АЦП требуется N-тактов, см. документацию. И вы обязаны их выждать. Либо поллингом опрашивая флаг, либо настроив прерывание.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Just now, MrBearManul said:

Это вообще как? Запуск и сразу чтение. Для преобразования АЦП требуется N-тактов, см. документацию. И вы обязаны их выждать. Либо поллингом опрашивая флаг, либо настроив прерывание.

Коннечно, это просто привел как читается в проге.

По прерываниям таймера читается с заведомо большим периодом чем оцифровка.

Just now, HardEgor said:

Что за контроллер?

Отладчиком пошагово проходили программу?

STM32G070KB

пошагово тут сложно, во всяком случае затыка нигде нет.

Изменено пользователем whale

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, whale сказал:

Коннечно, это просто привел как читается в проге.

Ну и где же вы ждёте завершения преобразования?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тут просто не указано, обычное прерывание таймера

Зашли в прерывание, прочитали , запустили и ждем следующее прерывание.

Изменено пользователем whale

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, whale сказал:

Все что можно по теме перечитал

Не похоже на правду. Иначе бы нашли что-то о флагах завершения преобразования и опрашивали бы их после запуска.

1 минуту назад, whale сказал:

Тут просто не указано, обыное прерывание таймера

Какой таймер? Вы же об АЦП спрашиваете.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Just now, MrBearManul said:

Не похоже на правду. Иначе бы нашли что-то о флагах завершения преобразования и опрашивали бы их после запуска.

Зачем их опрашивать если по времение там все завершается 100%

Можно их вставить то толку не будет 

Изменено пользователем whale

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 настроить на аналоговые функции?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Остается разве все какие есть флаги почитать мож прояснят

Изменено пользователем whale

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 минут назад, whale сказал:

Вот так реализован опрос

Зачем приводите нерабочий код в стартовом сообщении и сбиваете отвечающих вам с толку? Почему про таймер ничего не сказали? Вернее сказали, но после того, как я вам задал вопросы. Что вы ещё скрываете? Или снова будете в глупую угадайку играть, как тут?

03.02.2021 в 23:31, whale сказал:

Вот один догадался, значит самый умный ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 минут назад, whale сказал:

Мож я где то тактирование не разрешил или еще что то недописал в инициализации ?

Прерывание точно вызывается? Как проверили?

 

Вот вы утверждаете, что опрос флагов не нужен, т.е. период вызова прерываний заведомо больше, чем время преобразования АЦП, но зачем же вы его опрашиваете???

10 минут назад, whale сказал:

while((ADC1->ISR & ADC_ISR_ADRDY)!= ADC_ISR_ADRDY);

 

Только что, whale сказал:

Что нужно еще рассказать ?

Обычно, всё, что поможет ответить на ваш вопрос:

1. Модель МК.

2. Версия компилятора, среда отладки.

3. Если приводите код, то приводите тот, что вы используете, а не черновики.

4. Логично было догадаться, что про таймер нужно было сказать в первом сообщении и там же привести код обработчика.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Абсолютно, осцилографом да и  без превывания прога бы висела.

Если вместо 

ADC1->DR;

вставить число, выводит это число.

Опрос специально для вас прописал в прогу ноль результата..

Изменено пользователем whale

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 минут назад, MrBearManul сказал:

И ещё, вы не забыли соответствующие GPIO настроить на аналоговые функции?

 

1 минуту назад, whale сказал:

и  без превывания прога бы висела

С чего бы это?

1 минуту назад, whale сказал:

Опрос специально для вас прописал в прогу ноль результата..

Мне это не нужно. А про опрос я вам говорил относительно исходного кода в стартовом сообщении. Вы, по-моему, плохо понимаете о чём идёт речь.

Ещё раз: GPIO настроили на аналоговую функцию?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...