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

stm8s003f3. Не понимаю работу АЦП.

Первое. Согласно даташиту цикл измерения состоит из 14 тактов, по моим подсчетам получается 15 тактов.

Второе. Если я правильно понимаю возможен режим работы АЦП когда оно складывает результаты измерения в буфер в непрерывном режиме (AN2658 Figure 5 (Multiple channel Continuous and Scan conversion (buffered)). В этом режиме тоже есть загадочное, но беда в том, что не получается его запустить. Биты ADC1_CR1_CONT, ADC1_CR2_SCAN, ADC1_CR3_DBUF устанавливаю. Прерывания возникают после каждого измерения, т.е. похоже режим скан не работает. Без бита ADC1_CR2_SCAN прерывания, как и поположено, возникают после заполения буфера.

 

Иницилизация:

CLK->PCKENR2 |= 0x08;
ADC1->CR1 = (uint8_t)(ADC1_PRESSEL_FCPU_D12 | ADC1_CR1_CONT); // 126мкс (252 такта)
ADC1->CR2 = (uint8_t)(ADC1_CR2_ALIGN | ADC1_CR2_SCAN);
ADC1->CR3 = (uint8_t)(ADC1_CR3_DBUF); // DBUF
ADC1->CSR = (uint8_t)(ADC1_CSR_EOCIE | 0x05);
ADC1->TDRH = 0;
ADC1->TDRL = 0x28;
ADC1->HTRH = 0x02; // 539 0x21B (3.3A)
ADC1->HTRL = 0x1B;
ADC1->LTRH = 0;
ADC1->LTRL = 0;
ADC1->AWCRH = 0;
ADC1->AWCRL = 0x08;
ADC1->CR1 |= ADC1_CR1_ADON;
enableInterrupts();
ADC1->CR1 |= ADC1_CR1_ADON;

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


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

Если делать запуск преобразований от внешнего тригера (таймер 1), то работает согласно даташиту. Ухх... У меня таймер 1 задействован. Черт. Как вывернуться...

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


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

Первое...

Как раз побаловался STM8S903, вот что вышло:

inline void ADC_Init() {
   /***************************************************/
   ADC1->CR1 = 0;
   ADC1->CSR = 0
               | 1 * (3 << 0)          /**CH [3:0] **/
               | 1 * ADC1_CSR_EOCIE
               | 0 * ADC1_CSR_AWDIE;

   ADC1->CR1 = 0
               | 1 * ADC1_CR1_ADON
               | 0 * ADC1_CR1_CONT
               | 1 * (7 << 4);         /** SPSEL[6:4] **/

   ADC1->CR2 = 0
               | 1 * ADC1_CR2_SCAN
               | 1 * ADC1_CR2_ALIGN    /** 0: Left alignment, 1: Right alignment **/
               | 0 * (0)               /** EXTSEL[5:4] 00: Internal TIM1 TRGO, 01: External interrupt on ADC_ETR **/
               | 1 * ADC1_CR2_EXTTRIG;

   ADC1->CR3 = 0
               | 0 * ADC1_CR3_OVR
               | 0 * ADC1_CR3_DBUF;

   ADC1->CR1 = 0
               | 1 * ADC1_CR1_ADON
               | 0 * ADC1_CR1_CONT
               | 1 * (7 << 4);         /** SPSEL[6:4] **/
}

extern volatile uint8_t rc[2];
INTERRUPT_HANDLER(ADC1_IRQHandler, 22) {
   uint8_t reg = ADC1->CSR;
   ADC1->CSR = 0
               | 1 * (3 << 0)          /**CH [3:0] **/
               | 1 * ADC1_CSR_EOCIE
               | 0 * ADC1_CSR_AWDIE;

   rc[0] = ADC1->DB0RL >> 2;
   rc[0] |= ADC1->DB0RH << 6;
   rc[1] = ADC1->DB1RL >> 2;
   rc[1] |= ADC1->DB1RH << 6;
}

в регистре ADC1->CR1 пишу константу

В прерывании для сброса флага загружаю константу, иначе проблемы

сейчас проверил установил CONT и выключил EXTTRIG -> работает.

8000000 / 18 / 14 / 4 = 7936,5

тактовая HSI/2, частота прерываний ~7,39kHz похоже тоже 15 тактов,

В даташите не сказано про защитный интервал между каналами, может это оно и есть?

 

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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