реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Проблемы с АЦП, MSP430G2553
Niketa
сообщение Feb 1 2014, 21:42
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 1-02-14
Пользователь №: 80 290



Предисловие
В универе года 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
Go to the top of the page
 
+Quote Post
Mihey_K
сообщение Feb 2 2014, 05:50
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 156
Регистрация: 27-09-06
Из: Irkutsk
Пользователь №: 20 747



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


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 - Feb 2 2014, 12:57


--------------------
Блог о разработке на CC430, SIM900, GPS, ARM и не только...
Go to the top of the page
 
+Quote Post
Niketa
сообщение Feb 2 2014, 08:28
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 1-02-14
Пользователь №: 80 290



Исправил код так чтоб было 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 ?
Go to the top of the page
 
+Quote Post
Mihey_K
сообщение Feb 2 2014, 08:46
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 156
Регистрация: 27-09-06
Из: Irkutsk
Пользователь №: 20 747



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


--------------------
Блог о разработке на CC430, SIM900, GPS, ARM и не только...
Go to the top of the page
 
+Quote Post
Niketa
сообщение Feb 2 2014, 08:53
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 1-02-14
Пользователь №: 80 290



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

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

Go to the top of the page
 
+Quote Post
Mihey_K
сообщение Feb 2 2014, 09:08
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 156
Регистрация: 27-09-06
Из: Irkutsk
Пользователь №: 20 747



Именно так. А вместо этого порта можно другой взять для проверки.


--------------------
Блог о разработке на CC430, SIM900, GPS, ARM и не только...
Go to the top of the page
 
+Quote Post
Niketa
сообщение Feb 2 2014, 10:20
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 1-02-14
Пользователь №: 80 290



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

Вот код
Код
#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 тот же код запустить.
Так же самая картина...что делаю не так ?
Go to the top of the page
 
+Quote Post
Mihey_K
сообщение Feb 2 2014, 10:46
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 156
Регистрация: 27-09-06
Из: Irkutsk
Пользователь №: 20 747



Проверьте так:
Код
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. Получилось?


--------------------
Блог о разработке на CC430, SIM900, GPS, ARM и не только...
Go to the top of the page
 
+Quote Post
Niketa
сообщение Feb 2 2014, 11:33
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 1-02-14
Пользователь №: 80 290



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

Может быть к АЦП нельзя просто так взять и батарейку подрубить ? Может я чего то не понимаю ? Какая нить схема подключения может есть ?
Go to the top of the page
 
+Quote Post
Mihey_K
сообщение Feb 2 2014, 12:16
Сообщение #10


Частый гость
**

Группа: Участник
Сообщений: 156
Регистрация: 27-09-06
Из: Irkutsk
Пользователь №: 20 747



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

И лучше включить АЦП навсегда битом 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 - Feb 2 2014, 11:55


--------------------
Блог о разработке на CC430, SIM900, GPS, ARM и не только...
Go to the top of the page
 
+Quote Post
Niketa
сообщение Feb 2 2014, 13:25
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 1-02-14
Пользователь №: 80 290



Не понимаю в чем проблема.
С батарейкой почему то не работает.

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

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

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

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


Хотя вот вроде еще раз пропробовал и с телефона идет правдоподобный сигнал в ацп....
попробую другой источник,завтра куплю патенцометр и проверю.
Go to the top of the page
 
+Quote Post
Mihey_K
сообщение Feb 2 2014, 13:51
Сообщение #12


Частый гость
**

Группа: Участник
Сообщений: 156
Регистрация: 27-09-06
Из: Irkutsk
Пользователь №: 20 747



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

Сообщение отредактировал Mihey_K - Feb 2 2014, 14:01


--------------------
Блог о разработке на CC430, SIM900, GPS, ARM и не только...
Go to the top of the page
 
+Quote Post
Niketa
сообщение Feb 2 2014, 15:36
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 1-02-14
Пользователь №: 80 290



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

В какой ветке можно проконсультироваться по подключению Индикаторов к MSP430?
Go to the top of the page
 
+Quote Post
Mihey_K
сообщение Feb 2 2014, 16:17
Сообщение #14


Частый гость
**

Группа: Участник
Сообщений: 156
Регистрация: 27-09-06
Из: Irkutsk
Пользователь №: 20 747



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

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

Сообщение отредактировал Mihey_K - Feb 2 2014, 16:17


--------------------
Блог о разработке на CC430, SIM900, GPS, ARM и не только...
Go to the top of the page
 
+Quote Post
Niketa
сообщение Feb 2 2014, 16:25
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 1-02-14
Пользователь №: 80 290



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

Имеется 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кОм - показывает тоже самое
-подключаю наушники от плеера - думаю показывает правильно

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


Но надо разобраться какие резисторы купить для Индикатора.
Дома пока нету коллекции всех номиналов .
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th August 2025 - 16:23
Рейтинг@Mail.ru


Страница сгенерированна за 0.01498 секунд с 7
ELECTRONIX ©2004-2016