Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ADC в MSP430F1132
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
vvs
Вопрос от "чайника". Пытаюсь измерить VCC через внутренний MUX с опорой 1,5V, а потом в случае превышения VCC напряжения 3V, перейти на измерения с опорой 2,5V. Но измерения с опорой 1,5V дают завышенный результат, как будто нужно расчитывать значение не из VCC/2 , а (VCC - 1V)/2. При этом измерения через пины дают правильный результат. Руководствуюсь примерами типа fet120_adc_05.c от TI. В чем я не прав?
rezident
А у вас случайно напряжение питания не выше, чем 3В? Время выборки установили не меньше, чем в даташите указано?
vvs
Напряжение VCC меняется в диапазоне 2.0V - 3.4V. Нет стабильного питания.
AdcChannel = VCC_CHNL; // VCC_CHNL=11
ADC10CTL1 = AdcChannel<<12;
ADC10CTL0 = SREF_1 + ADC10SHT_2 + ADC10SR + REFON + ADC10ON + ADC10IE;
ADC10CTL0 |= ENC + ADC10SC;
Нужно измерять VCC и в зависимости от значения вкл/выкл зарядник. Все просто - казалось-БЫ.
rezident
Между включением АЦП и запуском преобразования необходима пауза не меньше 30мкс, чтобы ошибка преобразования не превышала 0,5 LSB. У вас же эта задержка вроде как отсутствует.
Кстати, зачем нужно опору 1,5В использовать, если напряжение до 3,4В бывает? Вам обязательно нужно измерять напряжение питания с точностью до единиц мВ?
ИМХО используйте опору 2,5В и не парьтесь!
P.S. кстати для уменьшения шума и повышения точности измерения на время преобразования рекомендуется ядро МК "усыплять" и выключать периферию, которая активно "ногодрыгает" (типа PWM).
vvs
Спасибо за советы. А насчет опоры, так при VCC=2V VREF=2,5V явно не "раскачается". Задача и стоит - по мере заряда на VCC переключиться с VREF=1,5V на VREF=2,5V. А когда включать CPUOFF=1 до запуска ADC или после? Спасибо.
msalov
Цитата(vvs @ Feb 1 2008, 14:33) *
А когда включать CPUOFF=1 до запуска ADC или после?
А как вы запустите АЦП при CPUOFF=1 ??
vvs
Спасибо.
ADC10CTL0 = SREF_1 + ADC10SHT_2 + ADC10SR + REFON + ADC10ON + ADC10IE;
for(ulong i = 0; i < N; i++);
ADC10CTL0 |= ENC + ADC10SC; // ADC10 enable set
__bis_SR_register(CPUOFF); //в LPM3 и ждем прерывания
Правильно ли понял?
rezident
Цитата(vvs @ Feb 1 2008, 18:51) *
Правильно ли понял?
Да, примерно так. Либо можно запускать преобразование от таймера, по прерыванию от АЦП считывать получившееся значение, а остальное время "спать".
vvs
А при выходе из обработчика по ADC надо ли ?
__bic_SR_register_on_exit(CPUOFF);
или что-то другое?
Спасибо.
rezident
Если все, что нужно посчитать в прерывании сделаете, то наверное нет. Если же что-то выполнять после вызова прерывания, то конечно же нужно ядро "будить".
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.