OlegALL 0 23 августа, 2015 Опубликовано 23 августа, 2015 (изменено) · Жалоба Привет Процессор: MSP430F4152 АЦП: 10 разрядный Делаю измерение температур по двум каналам АЦП. АЦП работает в непрерывном режиме. Проблема: АЦП сильно шумит, т.е. значение регистра ADC10MEM "гуляет" примерно от 260 до 270 единиц. Т.е. "гуляют" 4 младших разряда. Это нормально или плохо? Соответсвенно измеренная температура гуляет на +- 1 градус Что делать, где ошибка? Схему не могу выложить, мне запрещено. Но схема измерения как тут: http://avr-start.ru/?p=590 Даташит: https://yadi.sk/i/nGysJKVFibvYc Код: #include "adc.h" float32_t dataArray[32] = {0}; uint16_t ADC10CTL1_mask; void initADC(void) { ADC10AE0 |= 0x03; // P7.4, P7.5 ADC option select //ADC10CTL0 = ADC10ON + ADC10SHT_0 + MSC + REF2_5V + REFON; // Turn on ADC10, set sampling time ADC10CTL0 = ADC10ON + MSC; // Turn on ADC10, set sampling time ADC10CTL1 |= CONSEQ1; ADC10CTL0 |= ENC; // Enable conversions ADC10CTL0 |= ADC10SC; // Start convn - software trigger } void stopADC(void) { ADC10CTL0 = 0; // Start convn - software trigger } float32_t getTemperatureFromChannel(uint8_t channelNum) { initADC(); P2DIR = 0x03; // "1" на выход для датчиков P2OUT = 0x03; __delay_cycles(1000); ADC10CTL1 &= 0xFFF; // очистим биты 12..15 ADC10CTL1 |= channelNum << 12; // установим биты 12..15 float32_t data = ADC10MEM*0.1318-10.6422; dataArray[channelNum] = data; P2OUT = 0; stopADC(); return data; } MSP430_________.pdf Изменено 23 августа, 2015 пользователем OlegALL Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 38 23 августа, 2015 Опубликовано 23 августа, 2015 · Жалоба "…Проблема: АЦП сильно шумит…" Действительно ли шумит АЦП (и как шумит) можно проверить по каналам 10 и 11 (встроенные делитель питания и термодатчик). "…"гуляют" 4 младших разряда. Это нормально или плохо?… Соответсвенно измеренная температура гуляет на +- 1 градус" Это разве плохо? Вы сами то на что рассчитывали? "Что делать, где ошибка?" Плакать :) (шутка) "АЦП работает в непрерывном режиме." Это называется непрерывным режимом: в getTemperatureFromChannel инитится-запускается-останавливается АЦП? Готовность данных как определяется? Найдите книжицу: Бэйкер Б. "Что нужно знать цифровому инженеру об аналоговой электронике" М.Додэка-XXI, 2010. Просветление гарантировано: и как "земли-питание" разводить и как работу АЦП оценивать. Вообще, пока на www.ti.com есть доступ поищите там её (да! это не мужик :) ) статьи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasa_c 0 27 августа, 2015 Опубликовано 27 августа, 2015 (изменено) · Жалоба Вам на САХАРЕ ответили правильно, смотрите топологию; проверьте осциллографом шум по питанию; проверьте шум вывода REF; посмотрите, что Вы подаёте на вход АЦП с аналоговой схемы, то же осциллографом. Выходное сопротивление Вашей схемы полностью успевает зарядить конденсатор схемы выборки внутри контроллера? Попробуйте увеличить время выборки. Изменено 27 августа, 2015 пользователем sasa_c Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Myron 0 27 августа, 2015 Опубликовано 27 августа, 2015 · Жалоба Вам на САХАРЕ ответили правильно, смотрите топологию; проверьте осциллографом шум по питанию; проверьте шум вывода REF; посмотрите, что Вы подаёте на вход АЦП с аналоговой схемы, то же осциллографом. Выходное сопротивление Вашей схемы полностью успевает зарядить конденсатор схемы выборки внутри контроллера? Попробуйте увеличить время выборки. Первый простой эксперимент - отключить сигнал от АЦП входа и подключить батарейку на 1.6 (NiKa) обязательно зашунтировав батарейку емкостью керамикой 1-10 мкФ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться