igor_pskov 0 25 мая, 2015 Опубликовано 25 мая, 2015 · Жалоба Первое. Согласно даташиту цикл измерения состоит из 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
igor_pskov 0 25 мая, 2015 Опубликовано 25 мая, 2015 · Жалоба Если делать запуск преобразований от внешнего тригера (таймер 1), то работает согласно даташиту. Ухх... У меня таймер 1 задействован. Черт. Как вывернуться... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
e-serg 0 10 июня, 2015 Опубликовано 10 июня, 2015 · Жалоба Первое... Как раз побаловался 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 тактов, В даташите не сказано про защитный интервал между каналами, может это оно и есть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться