|
Проблемы с АЦП, MSP430G2553 |
|
|
|
Feb 1 2014, 21:42
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Feb 2 2014, 05:50
|

Частый гость
 
Группа: Участник
Сообщений: 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 и не только...
|
|
|
|
|
Feb 2 2014, 08:28
|
Участник

Группа: Участник
Сообщений: 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 ?
|
|
|
|
|
Feb 2 2014, 08:46
|

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

|
Цитата Дело в том что я вообще ничего на ножку не подаю,ничего к ней не подсоединено. Вот в этом и проблема, такой висящей ногой и вход пожечь недолго. А что там АЦП считает, кто его знает. Кто его знает, что там ложится в УВХ. Но 0 там никогда не будет. Подтяните к земле и никогда не оставляйте входы АЦП в воздухе, и выключится Ваш диод. Теперь опорное равно питанию. Да Vss = 0. VCC не обязательно 3.3 В, измерьте или посмотрите по схеме.
--------------------
Блог о разработке на CC430, SIM900, GPS, ARM и не только...
|
|
|
|
|
Feb 2 2014, 08:53
|
Участник

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

|
я все понял. благодарю,но возможно я его уже таким вот безрасудством испортил ... поэксперементирую еще... если я к тому входу ацп подключу плюс от батарейки 1.5 вольт ,а минус батарейки к земле - то по сути ацп должен выдать в ADC10MEM отсчет соответствющий 1.5 волтам при опорном напряжении равным Vcc. Так ?
|
|
|
|
|
Feb 2 2014, 10:20
|
Участник

Группа: Участник
Сообщений: 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 тот же код запустить. Так же самая картина...что делаю не так ?
|
|
|
|
|
Feb 2 2014, 10:46
|

Частый гость
 
Группа: Участник
Сообщений: 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 и не только...
|
|
|
|
|
Feb 2 2014, 11:33
|
Участник

Группа: Участник
Сообщений: 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 получаю. Но теперь я точно запутался. Может быть к АЦП нельзя просто так взять и батарейку подрубить ? Может я чего то не понимаю ? Какая нить схема подключения может есть ?
|
|
|
|
|
Feb 2 2014, 12:16
|

Частый гость
 
Группа: Участник
Сообщений: 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 и не только...
|
|
|
|
|
Feb 2 2014, 13:25
|
Участник

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

|
Не понимаю в чем проблема. С батарейкой почему то не работает.
Как и писал выше с батарейкой не работает. Что через резистор, что не через резистор подключаю - все время в MEM 0х0178 вижу.
Решил проверить другой источник. Взял телефон мобильный,включил на нем песню,вывел на наушники и начал снимать там. И о чудо я увидел более менее правдоподобные данные.
Сейчас с показаниями мультиметра сравню,а то кажется что АЦП буд то усиливает немного
Ну да,показывает он совершенно не то что я хотел увидеть. Мультиметр говорит что выход под наушники от 1 до 12 мВ дает. Это примерно 3-4 отсчета АЦП. А в МЕМ я виже от 50 и до 200 аж отсчетов.... что то я совсем не понимаю...
Хотя вот вроде еще раз пропробовал и с телефона идет правдоподобный сигнал в ацп.... попробую другой источник,завтра куплю патенцометр и проверю.
|
|
|
|
|
Feb 2 2014, 13:51
|

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

|
Это как Вы смотрели данные с АЦП в реальном времени? И к тому же мультиметр показывает RMS, а АЦП мгновенные значения, так что то, что Вы увидели с АЦП никак не совпадет с показаниями мультиметра, даже если все работает правильно. Проверяйте на источнике постоянного напряжения. Настройте UART и делайте вывод чере printf, ланчпад имеет режим VCP. Еще можно добавить ФНЧ для стабильности показаний. Берите не одно показание АЦП, а несколько, т.к. при подключении на проводах будет много шума.
Сообщение отредактировал Mihey_K - Feb 2 2014, 14:01
--------------------
Блог о разработке на CC430, SIM900, GPS, ARM и не только...
|
|
|
|
|
Feb 2 2014, 15:36
|
Участник

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

|
Вроде разобрался. Вроде работает. Сейчас приступлю ко второй задаче и там узнаю.
В какой ветке можно проконсультироваться по подключению Индикаторов к MSP430?
|
|
|
|
|
Feb 2 2014, 16:17
|

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

|
Цитата Вроде разобрался. Вроде работает. В чем причина хоть была? Цитата В какой ветке можно проконсультироваться по подключению Индикаторов к MSP430? Так вот тут поднимали семисегментный. Подключение же индикатора от платформы не зависит, главное выполнить спецификацию производителя. Индикатор какой?
Сообщение отредактировал Mihey_K - Feb 2 2014, 16:17
--------------------
Блог о разработке на CC430, SIM900, GPS, ARM и не только...
|
|
|
|
|
Feb 2 2014, 16:25
|
Участник

Группа: Участник
Сообщений: 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кОм - показывает тоже самое -подключаю наушники от плеера - думаю показывает правильно Завтра поеду куплю переменный резистор. и потестю еще. Но надо разобраться какие резисторы купить для Индикатора. Дома пока нету коллекции всех номиналов .
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|