|
Нелинейности внутреннего АЦП в STM32, STM32F103RET6 GH22S 9U |
|
|
|
Feb 25 2014, 09:09
|
Участник

Группа: Участник
Сообщений: 19
Регистрация: 18-08-06
Пользователь №: 19 654

|
И так работаю с контроллером STM32F103RET6 GH22S 9U (это полная маркировка, вдруг важно), работаю на частоте 72 МГц, и вот какая проблема, не зависимо от времени семплирования и настроек АЦП при подачи на вход плавно меняющейся функции (и сигнал с датчика температуры - терморезистора, так и просто источник опорного напряжения регулируемый пробовал) на выходи имеем нелинейности - ступеньки на определенных значениях, см. вложение. И так поиск по интернету не дал ответа на вопрос что это и как исправлять (ну кроме смены процессора, просто неисправность камня я исключил так как попробовал на двух идентичных контроллерах), положение ступенек не зависит от напряжения, то есть при изменении опорного напряжения ступеньки остаются в тех же точках, хоть это уже другие напряжения, точки в которых есть ступеньки характерные, в них одновременно сменяется сразу много разрядов (отметил это на графике).
Сообщение отредактировал zWitCh - Feb 25 2014, 09:10
|
|
|
|
|
 |
Ответов
|
Feb 26 2014, 11:11
|
Участник

Группа: Участник
Сообщений: 19
Регистрация: 18-08-06
Пользователь №: 19 654

|
продолжил свои изыскания, взял я совершенно другую плату (на STM32F103RBT6):
проводами на один из входов подключил источник питания регулируемый, и начал плавно его регулировать попутно записывая все измерения (код программы тот же что и ранее), вот что вышло:
Вроде все хорошо, помехи и выбросы есть и на осциллограмме, они связаны с тем что источник плохой и длинными проводами подключен, но если рассмотреть участок вблизи моей злополучной точке "1023" то мы увидим все ту же проблему:
Тут хорошо видно что вблизи точки "1023" (значение выдаваемое АЦП) полностью отсутствуют значения в диапазоне от 1024 до 1048 и все они заменяются на мои 1023! Дальше я просто посмотрел а АЦП хоть когда либо выдает ли мне на выходе цифры в диапазоне 1024 - 1048, и выяснились что нет, на двух совершенно разных платах и немного разных процессорах... Обнаружив такую особенность я достал старую добрую STM32-Discovery и запустил тот же код на ней, там все ок, таких особенностей работы АЦП не заметил...
|
|
|
|
|
Feb 26 2014, 11:56
|
Участник

Группа: Участник
Сообщений: 19
Регистрация: 18-08-06
Пользователь №: 19 654

|
Цитата(ViKo @ Feb 26 2014, 15:19)  Так не в источнике питания ли дело? Что, если подать питание через дроссель, LC фильтр? Там помехи бегают... Интересные помехи которые распределены во всем диапазоне равномерно а в определенных точках отсутствуют и сигнал в них идеально гладкий, ну да ладно, пошел дальше в изысканиях, немного переписал код, теперь я просто считаю сколько раз я с выхода АЦП имею определенное значение, а на вход подал просто шум, ниже код и результат. Код uint16_t arr[4096], indx;
int main(void) {
uint32_t i; GPIO_InitTypeDef PORT;
// Initialize USART1 (для рабочей платы) /* USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); AFIO->MAPR |= AFIO_MAPR_USART1_REMAP; PORT.GPIO_Pin = GPIO_Pin_6; PORT.GPIO_Speed = GPIO_Speed_2MHz; PORT.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOB, &PORT); //*/
// Initialize USART1 (для стартика MINI_STM32_V3) USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); PORT.GPIO_Pin = GPIO_Pin_9; PORT.GPIO_Speed = GPIO_Speed_2MHz; PORT.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &PORT);
USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2ENR_ADC1EN, ENABLE); ADC1->CR2 |= ADC_CR2_CAL; while (!(ADC1->CR2 & ADC_CR2_CAL)) ADC1->CR1 |= ADC_CR1_SCAN; ADC1->CR2 |= ADC_CR2_EXTSEL; ADC1->CR2 |= ADC_CR2_EXTTRIG; ADC1->SQR3 |= (ADC_SQR3_SQ1_3|ADC_SQR3_SQ1_2|ADC_SQR3_SQ1_1|ADC_SQR3_SQ1_0); // вход AN15 ADC1->CR2 |= ADC_CR2_ADON; ADC1->CR2 |= ADC_CR2_SWSTART; while (!(ADC1->SR & ADC_SR_EOC)); _debug_print_str("\r\n *** TEST *** \r\n");
while(1) { ADC1->CR2 |= ADC_CR2_SWSTART; while (!(ADC1->SR & ADC_SR_EOC));
indx = ADC1->DR; if(arr[indx] < 0x1FFF) arr[indx]++; if(arr[4090] > 100) break; }
i = 4096; while(i--){ _debug_print_num(i); _debug_print_str(";"); _debug_print_num(arr[i]); _debug_print_str(";\r\n");
} while(1); } И вот что мы имеем на выходе:
Тут отчетливо видно что есть значения которые АЦП на выходе не выдает никогда, я лично очень сомневаюсь что тот сигнал что я подавал на вход (шум), действительно имеет такие дырки (я его формировал крутя потенциометр в зад - перед раз 20, в конце выкрутил в крайнее положение и мой код отследил приход значений соответствующих крайнему положению и выдал результат в UART).
|
|
|
|
Сообщений в этой теме
zWitCh Нелинейности внутреннего АЦП в STM32 Feb 25 2014, 09:09 MrYuran Это называется "missing code", место сши... Feb 25 2014, 11:08 ViKo Цитата(MrYuran @ Feb 25 2014, 14:08) Это ... Feb 25 2014, 11:26 scifi Может быть, не была проделана процедура автоматиче... Feb 25 2014, 11:18 MrYuran Цитата(scifi @ Feb 25 2014, 15:18) Может ... Feb 25 2014, 11:34  scifi Цитата(MrYuran @ Feb 25 2014, 15:34) А че... Feb 25 2014, 11:56   MrYuran Цитата(scifi @ Feb 25 2014, 15:56) Вы, ви... Feb 25 2014, 12:11   zWitCh Цитата(scifi @ Feb 25 2014, 15:56) Вы, ви... Feb 25 2014, 14:30    scifi Цитата(zWitCh @ Feb 25 2014, 18:30) прост... Feb 25 2014, 14:40 Aner Программная проблема, разбирайтесь с прерываниями ... Feb 25 2014, 11:32 ViKo ЦитатаThe ADC has an built-in self calibration mod... Feb 25 2014, 12:48 Aner Схему, прогу в студию. Телепатов пока нема. Может ... Feb 25 2014, 14:59 zWitCh Цитата(Aner @ Feb 25 2014, 18:59) Схему, ... Feb 25 2014, 15:41  Леонид Иванович Цитата(zWitCh @ Feb 25 2014, 19:41) И так... Mar 1 2014, 19:42   adnega Цитата(Леонид Иванович @ Mar 1 2014, 23:4... Mar 1 2014, 20:02 ViKo http://electronix.ru/forum/index.php?showt...088... Feb 25 2014, 19:43 zWitCh Цитата(ViKo @ Feb 25 2014, 23:43) http://... Feb 26 2014, 07:27  scifi Цитата(zWitCh @ Feb 26 2014, 11:27) не мо... Feb 26 2014, 09:23  ViKo Цитата(zWitCh @ Feb 26 2014, 10:27) ссылк... Feb 26 2014, 09:27   ViKo Цитата(zWitCh @ Feb 26 2014, 14:56) Интер... Feb 26 2014, 12:00    scifi Цитата(ViKo @ Feb 26 2014, 16:00) Ничего ... Feb 26 2014, 12:28  Tanya Цитата(ViKo @ Feb 26 2014, 15:19) Так не ... Feb 26 2014, 12:04   ViKo Цитата(Tanya @ Feb 26 2014, 15:04) Источн... Feb 26 2014, 12:10    zWitCh Цитата(ViKo @ Feb 26 2014, 16:10) На Диск... Feb 26 2014, 12:35     ViKo Цитата(zWitCh @ Feb 26 2014, 15:35) ...та... Feb 26 2014, 12:36      zWitCh Цитата(ViKo @ Feb 26 2014, 16:36) А это н... Feb 26 2014, 12:39     Tanya Цитата(zWitCh @ Feb 26 2014, 16:35) Госпо... Feb 26 2014, 12:39      zWitCh Цитата(Tanya @ Feb 26 2014, 16:39) А вход... Feb 26 2014, 12:42       Tanya Цитата(zWitCh @ Feb 26 2014, 16:42) вход ... Feb 26 2014, 12:45    Tanya Цитата(ViKo @ Feb 26 2014, 16:10) На Диск... Feb 26 2014, 12:35     ViKo Цитата(Tanya @ Feb 26 2014, 15:35) А разв... Feb 26 2014, 12:38   zWitCh Цитата(Tanya @ Feb 26 2014, 16:04) Источн... Feb 26 2014, 12:37    ViKo Цитата(zWitCh @ Feb 26 2014, 15:37) (пров... Feb 26 2014, 12:41    Tanya Цитата(zWitCh @ Feb 26 2014, 16:37) вот т... Feb 26 2014, 12:41     zWitCh Цитата(Tanya @ Feb 26 2014, 16:41) Нет, я... Feb 26 2014, 12:56      Tanya Цитата(zWitCh @ Feb 26 2014, 16:56) кажет... Feb 26 2014, 13:10      ViKo Цитата(zWitCh @ Feb 26 2014, 15:56) Зачем... Feb 26 2014, 13:11       Tanya Цитата(ViKo @ Feb 26 2014, 17:11) Еще раз... Feb 26 2014, 13:36        zWitCh Цитата(Tanya @ Feb 26 2014, 17:36) Какая-... Feb 26 2014, 13:43         ViKo Цитата(zWitCh @ Feb 26 2014, 16:43) так в... Feb 26 2014, 13:45         Tanya Цитата(zWitCh @ Feb 26 2014, 17:43) да вс... Feb 26 2014, 13:56          zWitCh Цитата(Tanya @ Feb 26 2014, 17:56) Так мо... Feb 26 2014, 14:16           Tanya Цитата(zWitCh @ Feb 26 2014, 18:16) - 24 ... Feb 26 2014, 14:39 zWitCh Занизил частоту ADCCLK поделил на 16, все стало ок... Feb 26 2014, 14:40 scifi Цитата(zWitCh @ Feb 26 2014, 18:40) Заниз... Feb 26 2014, 14:45  zWitCh Цитата(scifi @ Feb 26 2014, 18:45) Семён ... Feb 26 2014, 15:10 ViKo Найдите у STMicroelectronics AN3137, там показано ... Mar 2 2014, 18:59 Леонид Иванович Документ AN3137 во многом повторяет AN2834. Там со... Mar 2 2014, 21:22  ViKo Цитата(Леонид Иванович @ Mar 3 2014, 00:2... Mar 3 2014, 11:50   Леонид Иванович Цитата(ViKo @ Mar 3 2014, 14:50) Этот сов... Mar 3 2014, 12:34 ViKo Входной ток у АЦП - это ток заряда внутреннего кон... Mar 3 2014, 13:06 Леонид Иванович Цитата(ViKo @ Mar 3 2014, 16:06) Если бы ... Mar 3 2014, 14:25  ViKo Цитата(Леонид Иванович @ Mar 3 2014, 17:2... Mar 3 2014, 17:46   Леонид Иванович Цитата(ViKo @ Mar 3 2014, 20:46) Чем боль... Mar 3 2014, 21:54 ViKo Если от Cext не зависит, то почему вы назвали сове... Mar 4 2014, 08:03 Леонид Иванович Цитата(ViKo @ Mar 4 2014, 11:03) Если от ... Mar 4 2014, 09:02 ViKo Если не трудно, покажите, что будет при Cext = 200... Mar 4 2014, 09:50 Леонид Иванович Без проблем. Видно, что время переходного процесса... Mar 4 2014, 10:02 ViKo Вы правы. Попробую сам в LTspice. Mar 4 2014, 10:53 Леонид Иванович Вообще, выводы находятся в соответствии с рекоменд... Mar 4 2014, 11:25 ViKo Возник один вопрос, вспомнил про эту тему.
Зачем в... Mar 28 2014, 08:31 Леонид Иванович Увеличение времени выборки ts может потребоваться ... Mar 28 2014, 16:15
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|