Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблемы с АЦП
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
Niketa
Предисловие
В универе года 2 назад изучал азы программирования микроконтроллеров. Мигали лампочками,через пень колоду передавали данный по уарт.
А сейчас вот на руки получил MSP430 платку с G2553 на борту.
Возникла Надобность разобраться с АЦП. И тут я посыпался...

Код
#include <msp430.h>
#define dv  0.0032258

float volts=0.0;

void main(void) {
    WDTCTL = WDTPW + WDTHOLD; // останавливаем сторожевой таймер
    P1DIR = 0x40; //1.6 LED

    ADC10CTL1 = INCH_0        // A0 input to ADC
            + SHS_0            // use ADC10SC bit to trigger sampling
            + ADC10DIV_3    // clock divider = 4
            + ADC10SSEL_3    // clock source = SMCLK
            + CONSEQ_0;        // single channel, single conversion

    ADC10CTL0 = SREF_1        // reference voltages are Vss and Vcc
            + ADC10SHT_3    // 64 ADC10 clocks for sample and hold time (slowest)
            + REFON            // reference generator on
            + ADC10ON;        // turn on ADC10
            //+ ENC;            // enable (but not yet start) conversions

    ADC10AE0 = BIT0;      // Разрешаем вход АЦП на порту P1.0
    
    while (1){
        ADC10CTL0 |= ADC10SC + ENC; // включаем считвание с ацп

        while (ADC10CTL1 & ADC10BUSY); // ждем пока все считает

        volts=ADC10MEM*dv;  // конвертируем результат в напряжение и сохраняем

        if (volts > 0.30) // Если напряжение больше чем 0.3 В
            P1OUT |= BIT6; // Загорается LED
        else
            P1OUT &= ~BIT6; // Если нет - то отключается LED
    }
}


Не могу понять где ошибка.
К плате ничего не подключено кроме питания,а
-диод горит
-в отладчике в регистре ADC10MEM значение все время прыгает (пример 0x02C3 или 0х02BC или 0х02D8 или 0х02FE)

Очень прошу помочь с проблемой.
Штудировал примеры,даташит и т.п. Ответа не нашел на свою проблему.

Так.Я помоему начал понимать в чем может быть косяк

Изменил опорное напряжение и картина стала куда лучше. Но я до сих пор не могу понять что написано в мануале.Что за опорное напряжение и что это вообще написано.

http://clip2net.com/s/6J8Lzz
Mihey_K
На вход АЦП что подаете?


SREFx:
000 - в качестве опорного используется VCC относительно VSS
001 - внутреннее опорное 1.5 В (бит REF2_5V = 0) / 2.5 В (REF2_5V = 1) относительно VSS
010 - внешнее опорное, подаваемое на вход VREF+ относительно VSS
011 - внешнее опорное, подаваемое через встроенный буфер на входе VREF+ относительно VSS
100 - в качестве опорного используется VCC относительно VREF-, только для устройств с портом VREF-
110 - внешнее опорное, подаваемое на вход VREF+ относительно VREF-, только для устройств с портом VREF-
111 - внешнее опорное, подаваемое через встроенный буфер на входе VREF+ относительно VREF-, только для устройств с портом VREF-

Исходя их кода, Вы используете встроенное опорное, по умолчанию в 1.5 В (бит REF2_5V = 0), а dv у Вас рассчитан для 3.3 В
Niketa
Исправил код так чтоб было Vcc к Vss - это же получается 3.3 к 0 да ?

Код
ADC10CTL0 |=   SREF_0        // reference voltages are Vss and Vcc
            + ADC10SHT_3    // 64 ADC10 clocks for sample and hold time (slowest)
            + ADC10ON;


Дело в том что я вообще ничего на ножку не подаю,ничего к ней не подсоединено. И я расчитывал что АЦП считает 0 , рас уж ничего не подсоединено.
Может я конечно не понимаю как там все реализовано в плане железа...
Сейчас попробую хотя бы батарейку 1.5 Вольт подключить,чтоб на входе обеспечить 1.5 вольта.

Vcc же это 3.3 волта ? А Vss = 0 ?
Mihey_K
Цитата
Дело в том что я вообще ничего на ножку не подаю,ничего к ней не подсоединено.
Вот в этом и проблема, такой висящей ногой и вход пожечь недолго. А что там АЦП считает, кто его знает. Кто его знает, что там ложится в УВХ. Но 0 там никогда не будет. Подтяните к земле и никогда не оставляйте входы АЦП в воздухе, и выключится Ваш диод.
Теперь опорное равно питанию. Да Vss = 0. VCC не обязательно 3.3 В, измерьте или посмотрите по схеме.
Niketa
я все понял. благодарю,но возможно я его уже таким вот безрасудством испортил ...
поэксперементирую еще...

если я к тому входу ацп подключу плюс от батарейки 1.5 вольт ,а минус батарейки к земле - то по сути ацп должен выдать в ADC10MEM отсчет соответствющий 1.5 волтам при опорном напряжении равным Vcc. Так ?

Mihey_K
Именно так. А вместо этого порта можно другой взять для проверки.
Niketa
Прошу прощения еще раз,но все таки что то я сломал или неправильно понял

Вот код
Код
#include <msp430.h>
#define dv  0.003479

float volts=0.0;

void main(void) {
    WDTCTL = WDTPW + WDTHOLD; // останавливаем сторожевой таймер
    P1DIR = 0x40; //1.6 LED

    ADC10CTL1 |= CONSEQ_0;        // single channel, single conversion
    ADC10CTL1 |= INCH_5        // A5 input to ADC
                + SHS_0            // use ADC10SC bit to trigger sampling
                + ADC10DIV_3    // clock divider = 4
                + ADC10SSEL_3;    // clock source = SMCLK


    ADC10CTL0 |= SREF_0        // reference voltages are Vss and Vcc
                + ADC10SHT_3    // 64 ADC10 clocks for sample and hold time (slowest)
                + ADC10ON;

    ADC10AE0 = BIT5;      // Разрешаем вход АЦП на порту P1.0

    while (1){
        ADC10CTL0 |= ADC10SC + ENC; // включаем считвание с ацп

        while (ADC10CTL1 & ADC10BUSY); // ждем пока все считает

        volts=ADC10MEM*dv;  // конвертируем результат в напряжение и сохраняем

        if (volts > 1.0) // Если напряжение больше чем
            P1OUT |= BIT6; // Загорается LED
        else
            P1OUT &= ~BIT6; // Если нет - то отключается LED

        ADC10CTL0 &= ~ (ADC10SC + ENC);
    }
}


Опорное напряжение Vcc и 0. Vcc я померил мультиметром - 3.5 вольт.

Взял батарейку , и вывел с нее один контакт - 1.3 вольт (помериал мультиметром) и второй контакт через резистор - 0.4 вольт.

К ножке 1.5 подрубил 0.4 волта а к земе землю с батарейки
Картинка прилагается - http://clip2net.com/clip/m128804/139133550...b.jpg?nocache=1



Подключаю выход тот что через резистор к P1.5.
Посыпались проблемы
-в то время как плата включена и работает , померил еще раз напряжение и теперь оно не 0.4 ,а 0.8. Т.е. если плата включена - то растет до 0.8
- во время дебага смотрю что в регистре ADC10MEM - 0x017A , что никак не 0.4 и не 0.8 вольт

Все выключил и переподключил к выходу батарейки , что без резистора и обеспечивает 1.3 вольт.
И ! Ничего не изменилось ! В регисьре MEM все так же 0x017A или (0x0179, прыгает иногда).
Мультиметром померил - все так же 1.3 вольт. Нет изменений как в первом случае.

Проверил на трех выходах A0(P1.0),A1(P1.1),A5(P1.5)


Так же чуть чуть экперементировал и на G2452 тот же код запустить.
Так же самая картина...что делаю не так ?
Mihey_K
Проверьте так:
Код
ADC10CTL1 |= INCH_11;    // AVcc/2
           + SHS_0            // use ADC10SC bit to trigger sampling
           + ADC10DIV_3    // clock divider = 4
           + ADC10SSEL_3;    // clock source = SMCLK

В ADC10MEM должна быть половина VCC. Получилось?
Niketa
Так.
Удалил строек
Код
ADC10AE0 = BIT2;      // Разрешаем вход АЦП на порту P1.0


Поменял источник на ваше

Код
ADC10CTL1 |= INCH_11;    // AVcc/2
           + SHS_0            // use ADC10SC bit to trigger sampling
           + ADC10DIV_3    // clock divider = 4
           + ADC10SSEL_3;    // clock source = SMCLK


В самой первой строчке разве ; нужна ??


Однако в MEM регистре я получил 1FF (иногда прыгает 200) , что в свою очередь как раз половина от 1023 ! так что значит выдает ровно половину Vcc

Код
ADC10CTL1 |= INCH_11    // AVcc/2
           + SHS_0            // use ADC10SC bit to trigger sampling
           + ADC10DIV_3    // clock divider = 4
           + ADC10SSEL_3;    // clock source = SMCLK
\

Убрал точку с " ; " в первой строчке,вы наверно ошиблись.
Все работает и половину Vcc получаю. Но теперь я точно запутался.

Может быть к АЦП нельзя просто так взять и батарейку подрубить ? Может я чего то не понимаю ? Какая нить схема подключения может есть ?
Mihey_K
Значит АЦП работает правильно! Неверна настройка портов или подключение.

И лучше включить АЦП навсегда битом ENC
Код
    ADC10CTL0 |= SREF_0        // reference voltages are Vss and Vcc
               + ADC10SHT_3    // 64 ADC10 clocks for sample and hold time (slowest)
               + ADC10ON
               + ENC;

и запускать измерения битом ADC10SC, остальной код только поправить.

Цитата
Убрал точку с " ; " в первой строчке,вы наверно ошиблись.
ага накосячил

Цитата
Может быть к АЦП нельзя просто так взять и батарейку подрубить ? Может я чего то не понимаю ? Какая нить схема подключения может есть ?
Да подрубить + батареи к порту напрямую, а - на землю. Как успехи?
Niketa
Не понимаю в чем проблема.
С батарейкой почему то не работает.

Как и писал выше с батарейкой не работает.
Что через резистор, что не через резистор подключаю - все время в MEM 0х0178 вижу.

Решил проверить другой источник.
Взял телефон мобильный,включил на нем песню,вывел на наушники и начал снимать там.
И о чудо я увидел более менее правдоподобные данные.

Сейчас с показаниями мультиметра сравню,а то кажется что АЦП буд то усиливает немного

Ну да,показывает он совершенно не то что я хотел увидеть.
Мультиметр говорит что выход под наушники от 1 до 12 мВ дает. Это примерно 3-4 отсчета АЦП.
А в МЕМ я виже от 50 и до 200 аж отсчетов.... что то я совсем не понимаю...


Хотя вот вроде еще раз пропробовал и с телефона идет правдоподобный сигнал в ацп....
попробую другой источник,завтра куплю патенцометр и проверю.
Mihey_K
Это как Вы смотрели данные с АЦП в реальном времени? И к тому же мультиметр показывает RMS, а АЦП мгновенные значения, так что то, что Вы увидели с АЦП никак не совпадет с показаниями мультиметра, даже если все работает правильно. Проверяйте на источнике постоянного напряжения. Настройте UART и делайте вывод чере printf, ланчпад имеет режим VCP. Еще можно добавить ФНЧ для стабильности показаний. Берите не одно показание АЦП, а несколько, т.к. при подключении на проводах будет много шума.
Niketa
Вроде разобрался. Вроде работает. Сейчас приступлю ко второй задаче и там узнаю.

В какой ветке можно проконсультироваться по подключению Индикаторов к MSP430?
Mihey_K
Цитата
Вроде разобрался. Вроде работает.
В чем причина хоть была?
Цитата
В какой ветке можно проконсультироваться по подключению Индикаторов к MSP430?

Так вот тут поднимали семисегментный. Подключение же индикатора от платформы не зависит, главное выполнить спецификацию производителя. Индикатор какой?
Niketa
Напишу тут , вопрос небольшой , нет смысла в другую тему лезть или создавать.

Имеется 7 сегментный индикатор CA56-12.
В Даташите написано , что максимальное напряжение 2.2 В при том что ножка контроллера выдает 3.5 вольт (MSP430g2553).
Так же требуется выдержать ток не более 20мА. Или не более чем 140 в импульсном режиме.


Вопрос вот в следующем.

Нашел пример схемы подключения. Вот она

Можно ли мне так же поступить. Резисторы все будут одинаковыми.
Номиналы резисторов : Vcc=3.5V R=(Vcc-2.2)/0.02A =65 Ом. Ближайший по номиналу 62 Ом.

А как быть с выводами отвечающие за выбор разряда ? На них вешать такой же резистор или как быть ??

Индикатор конечно же будет работать в импульсном режиме и мигать с частотой где то 50Гц. Думаю глазу будет незаметно.

Цитата(Mihey_K @ Feb 2 2014, 20:17) *
В чем причина хоть была?


Пока точно не понял все ли 100 работает. Но симптомы пока такие
-подключаю батарейку 1.3 вольта - АЦП показывает правильно
-подключил 2 батарейки - показывает правильно
-подключаю батарейку через резистор в 500кОм - показывает тоже самое
-подключаю наушники от плеера - думаю показывает правильно

Завтра поеду куплю переменный резистор. и потестю еще.


Но надо разобраться какие резисторы купить для Индикатора.
Дома пока нету коллекции всех номиналов .
Mihey_K
Цитата
В Даташите написано , что максимальное напряжение 2.2 В при том что ножка контроллера выдает 3.5 вольт (MSP430g2553).
Да тут все просто, обычный расчет ограничения тока на светодиод, т.е. Ваша формула верна. Вот только не будет ли контроллеру ай-я-яй от 20 мА по 8 портам. Это только на индикатор по земле контроллера потечет суммарно 160 мА, да еще и с коммутацией. Лучше посмотреть на график зависимоcти падения U от I, выбрать там точку 10 мА и по ней нужное падение U, для запаса набросить 0.1 В и рассчитать.
Цитата
А как быть с выводами отвечающие за выбор разряда ? На них вешать такой же резистор или как быть ??
Туда нужно 4 ключика поставить и ими подтягивать к VCC нужный разряд с портов контроллера.
50 Гц хорошо заметны глазом sm.gif
Коль поедете в магазин, прихватите там парочку ULN2003LV или ULN2003V12. Через них и подключить индикатор, будет работать годами sm.gif
Niketa
Было бы хорошо поговорить с человеком который уже подключал такой индикатор. Но ЛС у меня пока не работают , да и не часто он на форуме бывает.

Значит так.
Вот хороший пример подключения
Надо только все перерасчитать.

Падение напряжения. Значит надо выдержать мне 1.8 Вольт которые пойдут с током 10мА.
Т.е. R=(3.5-1.8)/0.01A =170 Ом.


А вот с ключиками мне не очень ясно. Почему ключами от Vcc ? почему не напрямую с ножек через резисторы с теми же номиналами ?

Цитата(Mihey_K @ Feb 2 2014, 20:51) *
Коль поедете в магазин, прихватите там парочку ULN2003LV или ULN2003V12. Через них и подключить индикатор, будет работать годами sm.gif


Зачем это ?
Mihey_K
Вот и делайте как в примере, там все хорошо, но с одним но - у Вас индикатор CA56-12, а у него общий в разряде - анод. Вот для CC56-12 такая схема пойдет. Поэтому берем npn транзисторы, например BC817/BC847 и т.д., и ставим их вместо тех, что на схеме, коллектором к VCC, на базу 1-2 кОм. Но у такого включения есть один недостаток - на транзисторе будет падать 0.7 В, их нужно учесть при расчете R на каждый сегмент. Еще можно P-mosfet поставить вместо биполярных.
Цитата
Зачем это ?
Поставить их как буферы по всем портам и не нужно никаких больше транзисторов. Только 2 буфера, 8 резисторов и порты мк, без какой-либо нагрузки на них.
Niketa
Теперь я еще больше запутался.
Сейчас не хотелось бы менять индикатор. Хочу до конца разобраться как подключить проще всего тот что есть на руках.

Хочу узнать поподробнее о включении драйвера в сеть. Что то не разберусь что он делает. и почему 2 драйвера и 8 резисторов ?
-8 резисторов к каждой ножке самого диода
-плюс еще 4 ноги для выбора разряда ? их только через буфер пускать ? без резистора ?

И в магаазинах что то нету тех что вы указали...в наличии нету. Тут и Тут
Самые крупнейшие магазины москвы....
Боюсь придется прибегнуть к чему то другому


Вот оригинал картинок что я давал
Тут


Перелапатил весь даташит.
Не нашел данных по тому какой ток суммарный на ножках превышать нельзя

__________________________________

Жду тогда вашего ответа и совета.
1. ULN2003LV или ULN2003V12 - в продаже не нашел более
Аналогов подходящих не нашел
Данная идея предложенная вами не реализуема
2. В ссылке выше показан пример Ровно мой случай.
В статье указано КТ502Б – PNP для CA56-12.
Но не совсем понятно как расчитать резистор.

3. Схема подключения тоже непонятна.
Цитата
Управление выводами, выбирающими разряд, в этом случае аналогично описанному для прямого подключения, но наоборот:
- для индикаторов с общим анодом (CA56-12) необходимо задать уровень сигнала 0 (PORTx.n = 0). Управление осуществляется регистром направления порта (DDRx). При записи в DDRx.n единицы соответствующий вывод будет замыкаться на землю, и через подключенный транзистор пойдёт ток.

Т.е. просто P1DIR нужной ножки ставить 0 или 1 ?
Mihey_K
Суммарный ток по земле сам не нашел в даташите, но он точно пределен sm.gif
Что-то я сам вчера запутался. Мой ответ - делайте как в схеме, что прикрепляли, но только U0 подключайте к VCC - открываться транзистор будет 0 на порту. Расчет, что раньше - R=(3.5-1.8)/0.01A = 170 Ом., ставьте ближайший 150 Ом.


Вот тут набросал различия в подключении между типами индикаторов.
Niketa
Цитата(Mihey_K @ Feb 3 2014, 06:38) *
Суммарный ток по земле сам не нашел в даташите, но он точно пределен sm.gif
Что-то я сам вчера запутался. Мой ответ - делайте как в схеме, что прикрепляли, но только U0 подключайте к VCC - открываться транзистор будет 0 на порту. Расчет, что раньше - R=(3.5-1.8)/0.01A = 170 Ом., ставьте ближайший 150 Ом.


Вот тут набросал различия в подключении между типами индикаторов.


И последний вопрос.
Как расчитывается R что стоят на базе транзистора ?
Mihey_K
Вот тут хорошо описано. Правда для схемы с общим эмиттером, а тут с общим коллектором. Ток коллектора будет в β раз выше тока базы. По даташиту для КТ502Б β минимум 80. Значит упрощенно резистор базы Rb = (VCC - 0.7) / (Iс / β). Ic = максимальный ток через 8 сегментов. Для R в 150 Ом 1 сегмент потребляет 12 мА. Значит для 8 сегментов 96 мА. Округляем до 100 мА, получаем Rb = 2.2 кОм. А еще лучше поставить 1 кОм и не заморачиваться sm.gif
Niketa
Я просто дурень какой то.

Не работает что то.

Скажу сразу. Перед тем как я спросил как подключать Индикатор - я пытался его напрямую с выводов микроконтроллера включить. Я то не почитал даташит и мог спалить нафиг все что только можно.

После того как вы мне рассказали что надо подключать через резисторы и транзисторы - я съездил в магазин,все купил.

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

Я подумал что все тип топ и начал паять целый макет на весь индикатор.

Вот что спаял. Проверил себя 10 раз чтоб не было косяков

Включил помигать одной полоской из первого сегмента и тут началось веселье. Индикатор стал мигать тем чем сам хотел ) могли мигать даже одинаковые полоски на разных сегментах.

Отключил все.

Распаял и вернулся к проверке лишь подключением одного сегмента. Вроде заработало,но то нормально горит, то меняется яркость...

После долгих проверок - Совсем перестал загораться.

Вероятно я все таки спалил его ?

ЧТо делать ? покупать новый ? Ну логично, если я его спалил.
Или же стоит более точнее рассчитать номиналы резисторов ?
Так же замечу что я во время теса можно считать в постоянном режиме включал гореть. частота мигания была очень низка, 2-3 Гц ) А это как я понял не очень то хорошо при моём грубом расчете.
Niketa
////////////
Решил попробовать как тут написано
Цитата
- для индикаторов с общим анодом (CA56-12) необходимо задать уровень сигнала 0 (PORTx.n = 0). Управление осуществляется регистром направления порта (DDRx). При записи в DDRx.n единицы соответствующий вывод будет замыкаться на землю, и через подключенный транзистор пойдёт ток.
Mihey_K
Если у вас макетка, то возьмите провод от резистора базы любого транзистора разряда и посадите на землю. И проверяйте сегменты этого разряда замыканием их резистора, что к ноге МК идет, на землю. Так видно будет горит или нет. Сжечь маловероятно, только превышением тока выше предельного, а если в схеме замкнуто/разомкнуто и все перепутано, ни черта ему не будет - набор диодов же. Сразу можно подключать несколько сегментов и оценить, меняется ли яркость. А перед тем как включать, надо порты настроить на выход, выключить все подтяжки. Главное не паниковать sm.gif
Niketa
Сделал отдельную тему под индикатор
Тут обсуждаться будет только АЦП.

Позже финальное сообщение по поводу АЦП напишу дабы такие же олухи как я не городили новые темы.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.