Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Нелинейности внутреннего АЦП в STM32
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Страницы: 1, 2
zWitCh
И так работаю с контроллером STM32F103RET6 GH22S 9U (это полная маркировка, вдруг важно), работаю на частоте 72 МГц, и вот какая проблема, не зависимо от времени семплирования и настроек АЦП при подачи на вход плавно меняющейся функции (и сигнал с датчика температуры - терморезистора, так и просто источник опорного напряжения регулируемый пробовал) на выходи имеем нелинейности - ступеньки на определенных значениях, см. вложение.

И так поиск по интернету не дал ответа на вопрос что это и как исправлять (ну кроме смены процессора, просто неисправность камня я исключил так как попробовал на двух идентичных контроллерах), положение ступенек не зависит от напряжения, то есть при изменении опорного напряжения ступеньки остаются в тех же точках, хоть это уже другие напряжения, точки в которых есть ступеньки характерные, в них одновременно сменяется сразу много разрядов (отметил это на графике).

Нажмите для просмотра прикрепленного файла
MrYuran
Это называется "missing code", место сшивки кодов SAR ADC
Ничего с этим не сделаешь

Хотя, конечно, что-то великоваты провалы.
scifi
Может быть, не была проделана процедура автоматической калибровки?
ViKo
Цитата(MrYuran @ Feb 25 2014, 14:08) *
Это называется "missing code", место сшивки кодов SAR ADC
Ничего с этим не сделаешь

Это вряд ли.
Настораживает число 1023 в первой точке? А как числа считаются, со знаком, без знака?
Aner
Программная проблема, разбирайтесь с прерываниями и записью в регистры. "missing code" SAR ADC - это немного не то, тут нет этого.
MrYuran
Цитата(scifi @ Feb 25 2014, 15:18) *
Может быть, не была проделана процедура автоматической калибровки?

А чем она поможет?
Калибруется обычно ноль и полная шкала
scifi
Цитата(MrYuran @ Feb 25 2014, 15:34) *
А чем она поможет?

Вы, видимо не в курсе, что такое автоматическая калибровка АЦП в STM32F1xx.
MrYuran
Цитата(scifi @ Feb 25 2014, 15:56) *
Вы, видимо не в курсе, что такое автоматическая калибровка АЦП в STM32F1xx.

Нет, а что такое?
ViKo
Цитата
The ADC has an built-in self calibration mode. Calibration significantly reduces accuracy
errors due to internal capacitor bank variations. During calibration, an error-correction code
(digital word) is calculated for each capacitor, and during all subsequent conversions, the
error contribution of each capacitor is removed using this code.
Calibration is started by setting the CAL bit in the ADC_CR2 register. Once calibration is
over, the CAL bit is reset by hardware and normal conversion can be performed. It is
recommended to calibrate the ADC once at power-on. The calibration codes are stored in
the ADC_DR as soon as the calibration phase ends.
Note: 1 It is recommended to perform a calibration after each power-up.
2 Before starting a calibration the ADC must have been in power-off state (ADON bit = ‘0’) for
at least two ADC clock cycles.
zWitCh
Цитата(scifi @ Feb 25 2014, 15:56) *
Вы, видимо не в курсе, что такое автоматическая калибровка АЦП в STM32F1xx.

Процедура калибровки пройдена, на вход АЦП подаю напряжение с лабораторного источника, плавно его меняю, АЦП выдает совершенно точно оцифрованные значения, так что калибровка не только пройдена но и пройдена видимо успешно, что касается программной ошибки, то все замечательно работает пока на вход не подаше некое напряжение равное в цифровом выражении "1023" и вот тогда АЦП перестает чувствовать малые изменения входного сигнала постоянно выдавая "1023".

Цитата(Aner @ Feb 25 2014, 15:32) *
Программная проблема, разбирайтесь с прерываниями и записью в регистры. "missing code" SAR ADC - это немного не то, тут нет этого.

Прерывания отключены, запись в регистр пишу не я а АЦП, я из него просто читаю в бесконечном цикле, придумайте мне хотя бы синтетический пусть невероятный но все же пример при котором АЦП будет выдавать ступенчатую характеристику только для определенного диапазона (очень узкого) а в остальном диапазоне работать идеально? думаю при всей фантазии такой пример будет придумать сложно ;-)
scifi
Цитата(zWitCh @ Feb 25 2014, 18:30) *
просто читаю в бесконечном цикле

А может, лучше чуть пореже читать? Вдруг там что-то клинит от частого считывания?
Aner
Схему, прогу в студию. Телепатов пока нема. Может глюк связан с источником питания и наведенной гармоникой, если плохо отвязка сделана. Программно как сделано? Смотрите в дебаге или как? .. Проблема с циклом? ... читаю в бесконечном цикле -> и куда дале и как вывод данных делается?
zWitCh
Цитата(Aner @ Feb 25 2014, 18:59) *
Схему, прогу в студию. Телепатов пока нема. Может глюк связан с источником питания и наведенной гармоникой, если плохо отвязка сделана. Программно как сделано? Смотрите в дебаге или как? .. Проблема с циклом? ... читаю в бесконечном цикле -> и куда дале и как вывод данных делается?


И так на ножке PC5 через резистор в 10к подключен лабораторный источник более ничего нет в схеме, минимальная обвязка со всеми рекомендованными блокирующими конденсаторами, подаю напряжение от полвольта до 2 вольт плавно регулируя вход, параллельно на входе висит осциллограф и мультиметр, и на том и на том приборах напряжения меняются плавно, нет ни всплесков, ни помех (осциллограф с 100 Мгц полосой пропускания, смотрю на хорошей развертке). Смотрю в консоле по СОМ порту. Питание платы идет от стабилизированного источника (другого, лабораторника, земли СОЕДИНЕНЫ). Питание первое что проверил, там все чисто настолько на сколько дает мне понять мой осциллограф.

Код:
CODE
#include<stm32f10x_rcc.h>
#include<stm32f10x_gpio.h>
#include "stm32f10x.h"
#include "stm32f10x_usart.h"

void _debug_print_byte(char c){
while(!(USART1->SR & USART_SR_TC));
USART1->DR = c;
}

void _debug_print_str(char *s){
do{
_debug_print_byte(*s);
}while(*(++s));
}

void _debug_print_num(uint16_t var){
char c, s[6], *p_s = &s[0], *p2_s;
uint8_t i, j = 0;

do {
*p_s++ = var % 10 + '0';
j++;
} while ((var /= 10) > 0);
*p_s = '\0';

for (i = 0, p_s--, p2_s = &s[0]; i<j; i++, j--) {
c = *p2_s;
*p2_s++ = *p_s;
*p_s-- = c;
}
_debug_print_str(s);
}

int main(void)
{

uint32_t i;
GPIO_InitTypeDef PORT;

// Initialize USART1
USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef PORT;
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);

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);
ADC1->CR2 |= ADC_CR2_ADON;
ADC1->CR2 |= ADC_CR2_SWSTART;
while (!(ADC1->SR & ADC_SR_EOC));
while(1)
{
i = 0xffff;
while(i--);
ADC1->CR2 |= ADC_CR2_SWSTART;
while (!(ADC1->SR & ADC_SR_EOC));
_debug_print_num(ADC1->DR);
_debug_print_str("\r\n");

}
}


Кратенько суть того что делает программа вот:

CODE
int main(void)
{
uint32_t i;
GPIO_InitTypeDef PORT;

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);
ADC1->CR2 |= ADC_CR2_ADON;
ADC1->CR2 |= ADC_CR2_SWSTART;
while (!(ADC1->SR & ADC_SR_EOC));
while(1)
{
i = 0xffff;
while(i--);
ADC1->CR2 |= ADC_CR2_SWSTART;
while (!(ADC1->SR & ADC_SR_EOC));
_debug_print_num(ADC1->DR);
_debug_print_str("\r\n");

}
}


Сразу отмечу что время семплирования не влияет, ставил разное, делал то же самое но через инжектированные каналы, эффект тот же...

Цитата(scifi @ Feb 25 2014, 18:40) *
А может, лучше чуть пореже читать? Вдруг там что-то клинит от частого считывания?

чуть выше код того как я делаю, тут мало того что не очень то и часто читается, но и читается только когда данные готовы, так что нет, дело не в чтении (да и чтение бы проявлялось не так, у меня сто процентная повторяемость на определенном значении (нескольких значениях) выдаваемых АЦП, при этом если подать опору другую и АЙП будет выдавать 1023 при другом входном напряжении, все равно ступенька именно в тех же точках оцифрованных, то есть это никак не связано с чтением или входом судя по всему...)
zWitCh
Цитата(ViKo @ Feb 25 2014, 23:43) *

судя по вашей ссылке и по характерности цифр (например 1023 это цифра в бинарном виде состоящая из однах едениц, и при увеличении ее на один придется перещелкнуть сразу все разряды) есть у меня подозрение на некую нестабильность внутреннюю, возможно далеко стоят блокирующие конденсаторы, не могу найти апнот по теме разводки питания цифрового и аналогового для STM32F10x, ссылкой не поделитесь?
scifi
Цитата(zWitCh @ Feb 26 2014, 11:27) *
не могу найти апнот по теме разводки питания цифрового и аналогового для STM32F10x, ссылкой не поделитесь?

AN2586
Но там практически только повторение сведений из даташита.
ViKo
Цитата(zWitCh @ Feb 26 2014, 10:27) *
ссылкой не поделитесь?

Ссылок не дам, а принципы везде одинаковые - как можно короче, шире (кроме инвертирующих входов усилителей).
zWitCh
продолжил свои изыскания, взял я совершенно другую плату (на STM32F103RBT6):
Нажмите для просмотра прикрепленного файла
проводами на один из входов подключил источник питания регулируемый, и начал плавно его регулировать попутно записывая все измерения (код программы тот же что и ранее), вот что вышло:
Нажмите для просмотра прикрепленного файла
Вроде все хорошо, помехи и выбросы есть и на осциллограмме, они связаны с тем что источник плохой и длинными проводами подключен, но если рассмотреть участок вблизи моей злополучной точке "1023" то мы увидим все ту же проблему:
Нажмите для просмотра прикрепленного файла

Тут хорошо видно что вблизи точки "1023" (значение выдаваемое АЦП) полностью отсутствуют значения в диапазоне от 1024 до 1048 и все они заменяются на мои 1023! Дальше я просто посмотрел а АЦП хоть когда либо выдает ли мне на выходе цифры в диапазоне 1024 - 1048, и выяснились что нет, на двух совершенно разных платах и немного разных процессорах...

Обнаружив такую особенность я достал старую добрую STM32-Discovery и запустил тот же код на ней, там все ок, таких особенностей работы АЦП не заметил...
ViKo
Цитата(zWitCh @ Feb 26 2014, 14:11) *
Вроде все хорошо, помехи и выбросы есть и на осциллограмме, они связаны с тем что источник плохой и длинными проводами подключен, но если рассмотреть участок вблизи моей злополучной точке "1023" то мы увидим все ту же проблему:
...
Обнаружив такую особенность я достал старую добрую STM32-Discovery и запустил тот же код на ней, там все ок, таких особенностей работы АЦП не заметил...

Так не в источнике питания ли дело? Что, если подать питание через дроссель, LC фильтр? Там помехи бегают...
zWitCh
Цитата(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).
ViKo
Цитата(zWitCh @ Feb 26 2014, 14:56) *
Интересные помехи которые распределены во всем диапазоне равномерно а в определенных точках отсутствуют и сигнал в них идеально гладкий, ну да ладно...

Ничего не ладно. Вы знаете, как помехи по питанию влияют на АЦП? Да он у вас там не может алгоритм последовательного приближения выполнить.
Tanya
Цитата(ViKo @ Feb 26 2014, 15:19) *
Так не в источнике питания ли дело? Что, если подать питание через дроссель, LC фильтр? Там помехи бегают...

Источник бы везде. Он ведь не знает про цифры внутри...
А вот если построить график напряжение - код-напряжение(как будто подсоединен виртуальный ЦАП), то что будет?
Будут ли две прямые со сдвигом - до и после магического числа? Если так, то калибровка внутри сбита - этот разряд значительно больше нормального и компаратор уже не добавляет несколько младших.
ViKo
Цитата(Tanya @ Feb 26 2014, 15:04) *
Источник бы везде. Он ведь не знает про цифры внутри...

На Дискавери нет источника. Она от USB питается. И провалов в кодах с АЦП, по уверению автора, на ней нет.
scifi
Цитата(ViKo @ Feb 26 2014, 16:00) *
Ничего не ладно. Вы знаете, как помехи по питанию влияют на АЦП? Да он у вас там не может алгоритм последовательного приближения выполнить.

+1. Кстати, в том же AN2586 сказано, что для фильтрации можно добавить ferrite bead перед Vdda и резистор перед Vref.
zWitCh
Цитата(ViKo @ Feb 26 2014, 16:10) *
На Дискавери нет источника. Она от USB питается. И провалов в кодах с АЦП, по уверению автора, на ней нет.

на дискавери есть источник: L1117 Series но это не суть, моя плата по схемотехники запитана аналогичным с дискавери образом, через линейный преобразователь, Помехи идет в лилии сигнальной, уровень этих помех мал что видно на графике, да и исходно я обнаружил данный феномен на плате где сигнал не так зашумлен, мы сейчас обсуждаем на сколько чистый я сигнал оцифровываю, но я сейчас в рамках проверки АЦП оцифровываю шум, шум этот малой амплитуды (меньше чем питание АЦП), так что не очень понял причем тут помехи по питанию, в начале топика я уже писал, что питание проверил первым, в нем нет выбросов и провалов.

Цитата(scifi @ Feb 26 2014, 16:28) *
+1. Кстати, в том же AN2586 сказано, что для фильтрации можно добавить ferrite bead перед Vdda и резистор перед Vref.

Господа, пожалуйста будте внимательнее, у меня все блокирующие конденсаторы и дросели у VADD стоят, в цепи питания НЕТ ПОМЕХ! Зашумел помехой я сигнал который оцифровываю специально для эксперимента, что бы поиметь на выходе с АЦП более менее нормальное распределение!
Tanya
Цитата(ViKo @ Feb 26 2014, 16:10) *
На Дискавери нет источника. Она от USB питается. И провалов в кодах с АЦП, по уверению автора, на ней нет.

А разве автор не руками выставляет измеряемое?
ViKo
Цитата(zWitCh @ Feb 26 2014, 15:35) *
...так что не очень понял причем тут помехи по питанию, в начале топика я уже писал, что питание проверил первым, в нем нет выбросов и провалов.
...
Господа, пожалуйста будте внимательнее, у меня все блокирующие конденсаторы и дросели у VADD стоят, в цепи питания НЕТ ПОМЕХ! Зашумел помехой я сигнал который оцифровываю специально для эксперимента, что бы поиметь на выходе с АЦП более менее нормальное распределение!


А это не вы писали: "Вроде все хорошо, помехи и выбросы есть и на осциллограмме, они связаны с тем что источник плохой и длинными проводами подключен"?

Чудеса... laughing.gif
zWitCh
Цитата(Tanya @ Feb 26 2014, 16:04) *
Источник бы везде. Он ведь не знает про цифры внутри...
А вот если построить график напряжение - код-напряжение(как будто подсоединен виртуальный ЦАП), то что будет?
Будут ли две прямые со сдвигом - до и после магического числа? Если так, то калибровка внутри сбита - этот разряд значительно больше нормального и компаратор уже не добавляет несколько младших.

вот тут была картинка в самом начале:
Нажмите для просмотра прикрепленного файла
там наглядно показано что выдает (оцифровывает АЦП), на входе напряжение при этом меняется линейно (проверено осциллографом на хорошей развертке)
ViKo
Цитата(Tanya @ Feb 26 2014, 15:35) *
А разве автор не руками выставляет измеряемое?

А что? sm.gif
Tanya
Цитата(zWitCh @ Feb 26 2014, 16:35) *
Господа, пожалуйста будте внимательнее, у меня все блокирующие конденсаторы и дросели у VADD стоят, в цепи питания НЕТ ПОМЕХ!

А вход опорного напряжения имеет адекватный конденсатор? А на входе?
zWitCh
Цитата(ViKo @ Feb 26 2014, 16:36) *
А это не вы писали: "Вроде все хорошо, помехи и выбросы есть и на осциллограмме, они связаны с тем что источник плохой и длинными проводами подключен"?

Чудеса... laughing.gif

источник СИГНАЛА который я подаю на вход ЦАП, и да это я написал, слово источник не всегда источник питания тем более когда оговорено иное...
ViKo
Цитата(zWitCh @ Feb 26 2014, 15:37) *
(проверено осциллографом на хорошей развертке)

ШУМИТ... или источник питания, или опорного напряжения (если оно есть), или измеряемый сигнал. На таких частотах, или импульсы короткие, так, что вы их не видите своим осциллографом.

Цитата(zWitCh @ Feb 26 2014, 15:39) *
источник СИГНАЛА который я подаю на вход ЦАП, и да это я написал, слово источник не всегда источник питания тем более когда оговорено иное...

ах, если СИГНАЛА, тогда его и фильтруйте!

Сами путаете:
"проводами на один из входов подключил источник питания регулируемый, и начал плавно его регулировать попутно записывая все измерения"
Tanya
Цитата(zWitCh @ Feb 26 2014, 16:37) *
вот тут была картинка в самом начале:

Нет, я не то хотела. Подгонку линейной функцией до и после. И вот эти числа. На глаз не видно по Вашим картинкам.
zWitCh
Цитата(Tanya @ Feb 26 2014, 16:39) *
А вход опорного напряжения имеет адекватный конденсатор? А на входе?

вход Vref отсутствует в моем корпусе, на входе Vdda стоит 10u и 0.1u плюс дроссль
Tanya
Цитата(zWitCh @ Feb 26 2014, 16:42) *
вход Vref отсутствует в моем корпусе, на входе Vdda стоит 10u и 0.1u плюс дроссль

А можете тактовую частоту уменьшить? И добавить сверху конденсатор... 10н?
zWitCh
Цитата(Tanya @ Feb 26 2014, 16:41) *
Нет, я не то хотела. Подгонку линейной функцией до и после. И вот эти числа. На глаз не видно по Вашим картинкам.

ну я уже новые данные поимел я подовая на вход ШУМ имею кучу значений разных с АЦП, так вот среди этих значений отсутствуют определенные значения всегда, в частности там нет цифр в промежутке 1024-1048, что мне кажется просто невероятным что бы в течении получаса сыпался условно случайный сигнал и в нем ниразу не встретилось напряжение эквивалентное значению с 1024 по 1048 но при этом все другие встречаются великое множество раз...

Цитата(ViKo @ Feb 26 2014, 16:41) *
ШУМИТ... или источник питания, или опорного напряжения (если оно есть), или измеряемый сигнал. На таких частотах, или импульсы короткие, так, что вы их не видите своим осциллографом.


ах, если СИГНАЛА, тогда его и фильтруйте!

Сами путаете:
"проводами на один из входов подключил источник питания регулируемый, и начал плавно его регулировать попутно записывая все измерения"

источник питания подключен на вход АЦП, отдельный источник питания в качестве сигнала, который я оцифровываю, даже не понимаю как еще это можно объяснить что бы стало понятно, батарейку я если подключу на вход АЦП это же не как не будет значить что мой ацп питается от батарейки, я беру ее напряжение как сигнал... фу... все не по теме...

Зачем мне фильтровать сигнал, меня не смущают момехи, напротив меня смущает то что АЦП не при каких входных напряжениях не выдает на выходе скажем "1030" или "1035" и еще пару десятков значений, как это связано с питанием которое мало того что независимое так еще и чистое, ок, допустим помехи, что это за такие синхронные помехи которые сбивают именно АЦП и именно тогда когда он хзочет выдать любую цифру в промежутке от 1024 до 1048 но при этом НИКОГДА не сбивают его в других случаях и в других значениях его передаточная функция гладкая...
Tanya
Цитата(zWitCh @ Feb 26 2014, 16:56) *
кажется просто невероятным что бы в течении получаса сыпался условно случайный сигнал и в нем ниразу не встретилось напряжение эквивалентное значению с 1024 по 1048 но при этом все другие встречаются великое множество раз...

Так конденсаторный АЦП внутри? Вот эти конденсаторы летают там, заряжаются, разряжаются. Один и них самый большой. На половине шкалы. После него внешний может не успеть зарядиться.
ViKo
Цитата(zWitCh @ Feb 26 2014, 15:56) *
Зачем мне фильтровать сигнал, меня не смущают момехи, напротив меня смущает то что АЦП не при каких входных напряжениях не выдает на выходе скажем "1030" или "1035" и еще пару десятков значений, как это связано с питанием которое мало того что независимое так еще и чистое, ок, допустим помехи, что это за такие синхронные помехи которые сбивают именно АЦП и именно тогда когда он хзочет выдать любую цифру в промежутке от 1024 до 1048 но при этом НИКОГДА не сбивают его в других случаях и в других значениях его передаточная функция гладкая...

Еще раз внушаю - импульсные помехи лезут в АЦП, неважно, каким путем, и сбивают механизм последовательного приближения. Если должен быть код 1026, а старший разряд не установился, потому что помеха в момент его определения сбила его в 0, то больше 1023 уже не набрать.
Tanya
Цитата(ViKo @ Feb 26 2014, 17:11) *
Еще раз внушаю - импульсные помехи лезут в АЦП, неважно, каким путем, и сбивают механизм последовательного приближения. Если должен быть код 1026, а старший разряд не установился, потому что помеха в момент его определения сбила его в 0, то больше 1023 уже не набрать.

Какая-то у Вас очень проницательная (избирательная) помеха.
zWitCh
Цитата(Tanya @ Feb 26 2014, 17:36) *
Какая-то у Вас очень проницательная (избирательная) помеха.

да вот и я о том же, вобщем пока мы тут общались на вход АЦП гнал я псевдослучайный сигнал (пилу с генератора), затем вывел всё что оцифровывал мне мой АЦП, так вот в его результатах напрочь отсутствует целая груда значений, то есть при любом входе он никогда не выдает определенные цифры на выходе...
Нажмите для просмотра прикрепленного файла
На данной диаграмме хорошо видно что определенные значения я на выходе у АЦП не получаю никогда, хотя на входе была достаточно гладкая функция без разрывов...

Цитата(ViKo @ Feb 26 2014, 17:11) *
Еще раз внушаю - импульсные помехи лезут в АЦП, неважно, каким путем, и сбивают механизм последовательного приближения. Если должен быть код 1026, а старший разряд не установился, потому что помеха в момент его определения сбила его в 0, то больше 1023 уже не набрать.

да все верно, только вот что это за помеха то такая которая сбивает только когда у меня ацп хочет выдать 1024 - 1049 (и еще пары диапазонов которые всегда одни и теже и мало вообще от чего зависят, просто есть) но никогда не сбивает при других выходных значениях, при этом источник питания и источник сигнала независимы и питание чистое...
ViKo
Цитата(zWitCh @ Feb 26 2014, 16:43) *
так вот в его результатах напрочь отсутствует целая груда значений,

Цитата
Какая-то у Вас очень проницательная (избирательная) помеха.

laughing.gif
Tanya
Цитата(zWitCh @ Feb 26 2014, 17:43) *
да все верно, только вот что это за помеха то такая которая сбивает только когда у меня ацп хочет выдать 1024 - 1049 (и еще пары диапазонов которые всегда одни и теже и мало вообще от чего зависят, просто есть) но никогда не сбивает при других выходных значениях, при этом источник питания и источник сигнала независимы и питание чистое...

Так можете тактовую частоту понизить на порядок?
Я даже догадываюсь, где еще сбоит.
zWitCh
Цитата(Tanya @ Feb 26 2014, 17:56) *
Так можете тактовую частоту понизить на порядок?
Я даже догадываюсь, где еще сбоит.

и так, теперь я вместо 72 МГц по дефолту, ставлю принудительно частоту как на Дискавери - 24 МГц и о чудо, помехи уже ничего не сбивают ни по питанию не по сигнальной шине, АЦП магическим образом обретает гладкую характеристику...

данные с АЦП при частоте 72 Мгц на ядре, хорошо видно дырки, определенные значения не выдаются АЦПхой не при каких входных воздействиях:
Нажмите для просмотра прикрепленного файла

Данные с АЦП на частоте 24 Мгц, характеристика гладкая, нет дырок, всем входным воздействиям есть выходной аналог:
Нажмите для просмотра прикрепленного файла


Что выходит что АЦП не успевал работать, или вернее не успевал заряжать свои внутренние конденсаторы и из-за этого сбоил если надо было сменить сразу много разрядов? Как бороться кроме понижения частоты, может таки оптимизировать разводку?
Tanya
Цитата(zWitCh @ Feb 26 2014, 18:16) *
- 24 МГц и о чудо, помехи уже ничего не сбивают ни по питанию не по сигнальной шине, АЦП магическим образом обретает гладкую характеристику...

Я же Вам сразу предлагала...
Цитата(zWitCh @ Feb 26 2014, 18:16) *
Как бороться кроме понижения частоты, может таки оптимизировать разводку?

Правильная разводка и правильные конденсаторы снаружи. А буфер для входного сигнала у Вас есть? Дроссель может даже вредить.
zWitCh
Занизил частоту ADCCLK поделил на 16, все стало ок... Век живи век учись ;-)

Код
    SystemInit();
    RCC_ADCCLKConfig(RCC_PCLK2_Div8);
    SystemCoreClockUpdate();


PS да буфер есть, достаточно конденсатор на 10мкФ, в боевой схеме мэрию медленно меняющееся напряжение (напряжение на большом ионисторе, так что эти мои 10vrA там просто что бы компенсировать подводящие провода).
scifi
Цитата(zWitCh @ Feb 26 2014, 18:40) *
Занизил частоту ADCCLK поделил на 16, все стало ок... Век живи век учись ;-)

Семён Семёныч! :-) Видимо, было превышение ADC clock 14 MHz max...
zWitCh
Цитата(scifi @ Feb 26 2014, 18:45) *
Семён Семёныч! :-) Видимо, было превышение ADC clock 14 MHz max...

очевидно именно это и произошло по собственному моему недосмотру и забывчивости, зато вот как интересно это проявилось :-)
Леонид Иванович
Цитата(zWitCh @ Feb 25 2014, 19:41) *
И так на ножке PC5 через резистор в 10к подключен лабораторный источник


Большие резисторы на входе АЦП нужно использовать с осторожностью, особенно в сочетании с конденсаторами. Про это много написано в AN2834, свои соображения по этому поводу высказал тут: http://leoniv.livejournal.com/194681.html
adnega
Цитата(Леонид Иванович @ Mar 1 2014, 23:42) *
Большие резисторы на входе АЦП нужно использовать с осторожностью, особенно в сочетании с конденсаторами. Про это много написано в AN2834, свои соображения по этому поводу высказал тут: http://leoniv.livejournal.com/194681.html

Полностью согласен. Это очень важная особенность, не учитавая которую, АЦП начинает измерять фазы Луны.
ViKo
Найдите у STMicroelectronics AN3137, там показано устройство АЦП. И, вообще, поиском слова ADC советую пройтись по их сайту. Например, AN1636 интересный документ. AN2719.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.