Перейти к содержанию
    

Предисловие

В универе года 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На вход АЦП что подаете?

 

 

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 В

Изменено пользователем Mihey_K

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Исправил код так чтоб было 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 ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Теперь опорное равно питанию. Да Vss = 0. VCC не обязательно 3.3 В, измерьте или посмотрите по схеме.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

поэксперементирую еще...

 

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прошу прощения еще раз,но все таки что то я сломал или неправильно понял

 

Вот код

#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 тот же код запустить.

Так же самая картина...что делаю не так ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проверьте так:

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. Получилось?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так.

Удалил строек

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 получаю. Но теперь я точно запутался.

 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Значит АЦП работает правильно! Неверна настройка портов или подключение.

 

И лучше включить АЦП навсегда битом ENC

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

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не понимаю в чем проблема.

С батарейкой почему то не работает.

 

Как и писал выше с батарейкой не работает.

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

 

Решил проверить другой источник.

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

И о чудо я увидел более менее правдоподобные данные.

 

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

 

Ну да,показывает он совершенно не то что я хотел увидеть.

Мультиметр говорит что выход под наушники от 1 до 12 мВ дает. Это примерно 3-4 отсчета АЦП.

А в МЕМ я виже от 50 и до 200 аж отсчетов.... что то я совсем не понимаю...

 

 

Хотя вот вроде еще раз пропробовал и с телефона идет правдоподобный сигнал в ацп....

попробую другой источник,завтра куплю патенцометр и проверю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Изменено пользователем Mihey_K

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

В какой ветке можно проконсультироваться по подключению Индикаторов к MSP430?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вроде разобрался. Вроде работает.
В чем причина хоть была?

В какой ветке можно проконсультироваться по подключению Индикаторов к MSP430?

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

Изменено пользователем Mihey_K

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Напишу тут , вопрос небольшой , нет смысла в другую тему лезть или создавать.

 

Имеется 7 сегментный индикатор CA56-12.

В Даташите написано , что максимальное напряжение 2.2 В при том что ножка контроллера выдает 3.5 вольт (MSP430g2553).

Так же требуется выдержать ток не более 20мА. Или не более чем 140 в импульсном режиме.

 

 

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

 

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

 

Можно ли мне так же поступить. Резисторы все будут одинаковыми.

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

 

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

 

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

 

В чем причина хоть была?

 

Пока точно не понял все ли 100 работает. Но симптомы пока такие

-подключаю батарейку 1.3 вольта - АЦП показывает правильно

-подключил 2 батарейки - показывает правильно

-подключаю батарейку через резистор в 500кОм - показывает тоже самое

-подключаю наушники от плеера - думаю показывает правильно

 

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

 

 

Но надо разобраться какие резисторы купить для Индикатора.

Дома пока нету коллекции всех номиналов .

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...