niketa 0 1 февраля, 2014 Опубликовано 1 февраля, 2014 · Жалоба Предисловие В универе года 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
miheyk 0 2 февраля, 2014 Опубликовано 2 февраля, 2014 (изменено) · Жалоба На вход АЦП что подаете? 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 В Изменено 2 февраля, 2014 пользователем Mihey_K Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
niketa 0 2 февраля, 2014 Опубликовано 2 февраля, 2014 · Жалоба Исправил код так чтоб было 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 ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
miheyk 0 2 февраля, 2014 Опубликовано 2 февраля, 2014 · Жалоба Дело в том что я вообще ничего на ножку не подаю,ничего к ней не подсоединено. Вот в этом и проблема, такой висящей ногой и вход пожечь недолго. А что там АЦП считает, кто его знает. Кто его знает, что там ложится в УВХ. Но 0 там никогда не будет. Подтяните к земле и никогда не оставляйте входы АЦП в воздухе, и выключится Ваш диод. Теперь опорное равно питанию. Да Vss = 0. VCC не обязательно 3.3 В, измерьте или посмотрите по схеме. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
niketa 0 2 февраля, 2014 Опубликовано 2 февраля, 2014 · Жалоба я все понял. благодарю,но возможно я его уже таким вот безрасудством испортил ... поэксперементирую еще... если я к тому входу ацп подключу плюс от батарейки 1.5 вольт ,а минус батарейки к земле - то по сути ацп должен выдать в ADC10MEM отсчет соответствющий 1.5 волтам при опорном напряжении равным Vcc. Так ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
miheyk 0 2 февраля, 2014 Опубликовано 2 февраля, 2014 · Жалоба Именно так. А вместо этого порта можно другой взять для проверки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
niketa 0 2 февраля, 2014 Опубликовано 2 февраля, 2014 · Жалоба Прошу прощения еще раз,но все таки что то я сломал или неправильно понял Вот код #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 тот же код запустить. Так же самая картина...что делаю не так ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
miheyk 0 2 февраля, 2014 Опубликовано 2 февраля, 2014 · Жалоба Проверьте так: 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 0 2 февраля, 2014 Опубликовано 2 февраля, 2014 · Жалоба Так. Удалил строек 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 получаю. Но теперь я точно запутался. Может быть к АЦП нельзя просто так взять и батарейку подрубить ? Может я чего то не понимаю ? Какая нить схема подключения может есть ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
miheyk 0 2 февраля, 2014 Опубликовано 2 февраля, 2014 (изменено) · Жалоба Значит АЦП работает правильно! Неверна настройка портов или подключение. И лучше включить АЦП навсегда битом ENC ADC10CTL0 |= SREF_0 // reference voltages are Vss and Vcc + ADC10SHT_3 // 64 ADC10 clocks for sample and hold time (slowest) + ADC10ON + ENC; и запускать измерения битом ADC10SC, остальной код только поправить. Убрал точку с " ; " в первой строчке,вы наверно ошиблись. ага накосячил Может быть к АЦП нельзя просто так взять и батарейку подрубить ? Может я чего то не понимаю ? Какая нить схема подключения может есть ? Да подрубить + батареи к порту напрямую, а - на землю. Как успехи? Изменено 2 февраля, 2014 пользователем Mihey_K Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
niketa 0 2 февраля, 2014 Опубликовано 2 февраля, 2014 · Жалоба Не понимаю в чем проблема. С батарейкой почему то не работает. Как и писал выше с батарейкой не работает. Что через резистор, что не через резистор подключаю - все время в MEM 0х0178 вижу. Решил проверить другой источник. Взял телефон мобильный,включил на нем песню,вывел на наушники и начал снимать там. И о чудо я увидел более менее правдоподобные данные. Сейчас с показаниями мультиметра сравню,а то кажется что АЦП буд то усиливает немного Ну да,показывает он совершенно не то что я хотел увидеть. Мультиметр говорит что выход под наушники от 1 до 12 мВ дает. Это примерно 3-4 отсчета АЦП. А в МЕМ я виже от 50 и до 200 аж отсчетов.... что то я совсем не понимаю... Хотя вот вроде еще раз пропробовал и с телефона идет правдоподобный сигнал в ацп.... попробую другой источник,завтра куплю патенцометр и проверю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
miheyk 0 2 февраля, 2014 Опубликовано 2 февраля, 2014 (изменено) · Жалоба Это как Вы смотрели данные с АЦП в реальном времени? И к тому же мультиметр показывает RMS, а АЦП мгновенные значения, так что то, что Вы увидели с АЦП никак не совпадет с показаниями мультиметра, даже если все работает правильно. Проверяйте на источнике постоянного напряжения. Настройте UART и делайте вывод чере printf, ланчпад имеет режим VCP. Еще можно добавить ФНЧ для стабильности показаний. Берите не одно показание АЦП, а несколько, т.к. при подключении на проводах будет много шума. Изменено 2 февраля, 2014 пользователем Mihey_K Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
niketa 0 2 февраля, 2014 Опубликовано 2 февраля, 2014 · Жалоба Вроде разобрался. Вроде работает. Сейчас приступлю ко второй задаче и там узнаю. В какой ветке можно проконсультироваться по подключению Индикаторов к MSP430? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
miheyk 0 2 февраля, 2014 Опубликовано 2 февраля, 2014 (изменено) · Жалоба Вроде разобрался. Вроде работает. В чем причина хоть была? В какой ветке можно проконсультироваться по подключению Индикаторов к MSP430? Так вот тут поднимали семисегментный. Подключение же индикатора от платформы не зависит, главное выполнить спецификацию производителя. Индикатор какой? Изменено 2 февраля, 2014 пользователем Mihey_K Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
niketa 0 2 февраля, 2014 Опубликовано 2 февраля, 2014 · Жалоба Напишу тут , вопрос небольшой , нет смысла в другую тему лезть или создавать. Имеется 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кОм - показывает тоже самое -подключаю наушники от плеера - думаю показывает правильно Завтра поеду куплю переменный резистор. и потестю еще. Но надо разобраться какие резисторы купить для Индикатора. Дома пока нету коллекции всех номиналов . Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться