MSP430G2553 (QFN32) + LaunchPad = АЦП -> ШИМ

Появились-таки контроллеры у TI в Value Line с UARTом (G2xx3), я сгонял на кафедру попросил и через 2 недели пришли мне самые толстые 2553 только в DIP20 не было пришло в QFN32:

Тут просто неоценимым бонусом стало то, что контактные площадки торчат сбоку, паял паяльником, а 32 ноги дают минимальное мультиплексирование (взять хотя простое наличие 3-х полноценных портов и отдельных выводов под резонатор и аналоговой части)
Долго не думал сделал адаптивную плату для LaunchPad'а
вышло так (вторую сторону лень было на лут делать, обошелся 5-ю перемычками)


Желтые провода это исправление косяка TI, g2553 не совместим с линиями TxD и RxD лаунчпада с точностью до наоборот. Они как-то даже это признали эпическим фэйлом, не помню где-то читал, когда искал инфу о контроллере. Но тут это не используется (во всяком случае пока) по уарту отдельно напишу.
Схему дам позже, но она элементарна:
+ часовой кварц
+ на входы АЦП А0, А3, А4 и А5 идет напряжение с четырех делителей на переменных резисторах (знаю, варварство, но...) 1 и 2 пропущены специально, они с уартом мультиплексированы, это я на будущее оставил.
+ на 4-х младших битах порта 3 вывод ШИМ-сигнала (*сноска)
+ питание на сервы с отдельного источника (акк от мобилки)

* — Шим попробовал делать как написано тут, но столкнулся с проблемой когда значения были близки и как-то оно не айс было, а время поджимало)) тут меня вывезло наличие двух таймеров с тремя регистрами каждый, тоесть одним регистром я задавал частоту в 50 Гц, а на оставшиеся повешал по одной серве, итого 2 таймера = 4 сервы, задача выполнена

Изначально один таймер хотел отпустить на запуск преобразования АЦП, но, пришлой делать чередой спячек в вечном цикле основной программы, которая в свою очередь запускалась как только один из таймеров заканчивал генерацию на своих выводах, ну в коде это видно, через флажок сделал. причем проц типа много спит, тоже попал под задание курсача минимизации его работы (аля сниженное потребление)
работает это так:


#include "msp430g2553.h"

int PWM_fr = 50;//задание частоты)) так для понта

int flug;//Флажок
int x[4] = {64,64,64,64};//начальные значения для ШИМ
int a,b;

void main( void )
{
  WDTCTL = WDTPW + WDTHOLD;// Stop watchdog timer to prevent time out reset
  BCSCTL1 = CALBC1_16MHZ;//Проц тактируем от встроенного
  DCOCTL  = CALDCO_16MHZ;//генератора с калибровкой последнего на 16 мгц
  BCSCTL3 = XCAP_1;//встроенная нагрузочная емкость в 6 пФ (на кой хрен не знаю, препод "посоветовал", работало и так)
  P1DIR = 0xFF;//
  P2DIR = 0xFF;//порты на вывод, чтоб не болтались просто так
  P3DIR = 0xFF;//
  
  //конфиг первого таймера
  TA0CCR0  = 32000/PWM_fr;//частота
  TA0CCR1  = 60;//стартовое на ШИМ
  TA0CCR2  = 60;//стартовое на ШИМ
  TA0CCTL0 = CCIE;//
  TA0CCTL1 = CCIE;//разрешить прерывания от все трех регистров
  TA0CCTL2 = CCIE;//
  
  //конфиг второго таймера
  TA1R = 16000;// смешение относительно первого, чтоб прерывания не накладывались
  TA1CCR0  = 32000/PWM_fr;// частота
  TA1CCR1  = 60;//стартовое на ШИМ
  TA1CCR2  = 60;//стартовое на ШИМ
  TA1CCTL0 = CCIE;//
  TA1CCTL1 = CCIE;//разрешить прерывания от все трех регистров
  TA1CCTL2 = CCIE;//
    
  TA1CTL   = TASSEL_1 + MC_1 + TAIE;//запустили таймера и разрешили прерывания
  TA0CTL   = TASSEL_1 + MC_1 + TAIE;//
  
  //настройка АЦП
  ADC10CTL0 = SREF_0 + ADC10SHT_1 + ADC10ON + ADC10IE;//опора AVcc,16 тиков на преобразование, АЦП вкл, разрешить прерывания АЦП
  ADC10AE0  = 0x01+0x08+0x10+0x20;//входы P1.0, P1.3, P1.4 и P1.5 считать входами АЦП
  
  __bis_SR_register(GIE);// General Interrupt Enable
  //вечный цикел
  for(;;)
  {
    if (flug == 0)//флажок, показывающий считывались ли даннные с последнего преобразования
    {
      ADC10CTL0 &= ~ENC;//отключили преобразование (бит должен быть "0" чтобы не возникало проблем с конфигом АЦП,в данном случае смена канала)
      ADC10CTL1  = INCH_0;//канал А0
      ADC10CTL0 |= ENC + ADC10SC;// аля "конфиг принять" и Start Convertion
      LPM0;//спать, проснется с прерывая от АЦП, где получит установку продолжить работу
      x[0] = 75 - ADC10MEM/16;// результат в ячейку отбрасываем 4 бита (ибо под нашу частоту кварца
                              //  самое оно получается на весь диапазон восприятия Серво) и смещаем немного

      //далее настройка на следующий канал и таких настроек, собственно, всего 4
      ADC10CTL0 &= ~ENC;
      ADC10CTL1  = INCH_3;
      ADC10CTL0 |= ENC + ADC10SC;
      LPM0;
      x[1]   = 75 - ADC10MEM/16;
      ADC10CTL0 &= ~ENC;
      ADC10CTL1  = INCH_4;
      ADC10CTL0 |= ENC + ADC10SC;
      LPM0;
      x[2]   = 75 - ADC10MEM/16;
      ADC10CTL0 &= ~ENC;
      ADC10CTL1  = INCH_5;
      ADC10CTL0 |= ENC + ADC10SC;
      LPM0;
      x[3]   = 75 - ADC10MEM/16;
      flug = 1;//флажок в "1" = "теперь у нас есть свежие данные, можно считывать"
    }
   //вот тут бы посадить проц в спячку, да что то руки не дошли
  };
};

//обработка прерываний
#pragma vector = ADC10_VECTOR//от АЦП
__interrupt void ADC(void)
{
  LPM0_EXIT;//разбудить проц и выпнуть в поле
};

//первый таймер
//вот тут интересно, на регистр CCR0 одельный вектор прерывания
//а на остальные другой
#pragma vector = TIMER0_A0_VECTOR//на CCR0
__interrupt void TA0_0(void)
{
  P3OUT |= 0x01+0x02;//дали начало импульса ШИМ
  flug = 0;//дали задание АЦП, что считали данные
  //это потому что этот таймер начинает все делать со сдвигом, тоесть к этому моменту все данные точно будут считаны
  //флаг сбрасывается автоматически
};
//второй таймер
#pragma vector = TIMER1_A0_VECTOR//на CCR0
__interrupt void TA0_1(void)
{
  P3OUT |= 0x04+0x08;//начало импульса
  if (flug == 1)//если есть свежачок (а он есть всегда, если частоты посчитать) считываем в регистры таймеров
  {
    TA0CCR1 = x[0];
    TA0CCR2 = x[1];
    TA1CCR1 = x[2];
    TA1CCR2 = x[3];
  };
  //флаг сбрасывается автоматически
};
#pragma vector = TIMER0_A1_VECTOR//вектор прерываний от CCR1, CCR2 и перполнения таймера
__interrupt void TA1_0(void)
{
  switch (TA0IV)
  {
    case 0x02://на CCR1
    {
    P3OUT &= ~0x01;//закончили импульс
    break;
    }
    case 0x04://на CCR2
    {
    P3OUT &= ~0x02;//закончили импульс
    break;
    }
  }
  TA0IV = 0x00;//чистим регистр вектора, автоотчистки тут нет
};
#pragma vector = TIMER1_A1_VECTOR//вектор прерываний от CCR1, CCR2 и перполнения таймера
__interrupt void TA1_1(void)
{
  switch (TA1IV)
  {
  case 0x02://на CCR1
    {
    P3OUT &= ~0x04;//закончили импульс
    break;
    }
  case 0x04://на CCR2
    {
    P3OUT &= ~0x08;//закончили импульс
    break;
    }
  }
  TA1IV = 0x00;//чистим регистр вектора, автоотчистки тут нет
};


P.S. Файлы, в том числе и схему выложу чуть позже (а вообще чего туда дать хоть? в файлы то)
P.P.S. большие сервы надыбал в журнале AMG Mercedess от деагостини, номер выпуска 50, стоит он 270 р, сервы дастаточно качественные, правда шестерни пластиковые. Вообще должен быть еще один номер с сервой, только я не уверен, кому интересно спрашивайте в киосках «Роспечать»))) я себе взял 3 штучки
  • +3
  • 27 декабря 2011, 18:42
  • X-Antr

Комментарии (37)

RSS свернуть / развернуть
Желтые провода это исправление косяка TI, g2553 не совместим с линиями TxD и RxD лаунчпада с точностью до наоборот. Они как-то даже это признали эпическим фэйлом, не помню где-то читал, когда искал инфу о контроллере.

А чего бы прям в разводке мезонинной платы не поправить?
0
  • avatar
  • _YS_
  • 27 декабря 2011, 18:45
я сначала вытравил и припаял неглядя, а потом когда встал вопрос об использовании уарта, решил сподручно
0
От оно чо. Понял.
0
и кстати, в таком случае я просто линии поменяю местами, а при разводке ноги, а они мультиплексированы со всякой бякой
0
>>я сгонял на кафедру попросил и через 2 недели пришли мне самые толстые 2553 только в DIP20 не было пришло в QFN32:

у вас прекрасный институт/университет.
0
просто у нас на кафедре что-то вроде сотрудничества с TI, они нам хорошо, а кафедра учит студентов прогать их контроллеры. ИРИТ-РтФ УрФУ (Радиофак УПИ раньше) г. Екатеринбург
0
а у нас в универе соседней группе (контроллеры их специальность, у мя другая совсем) показывали программатор размером с осциллограф C1-55. Было бы так смешно, если бы небыло так грустно)
0
О как. А когда я там учился (точнее, в филиале, но основные преподы ездили оттуда) я о TI и MSP430 и не слыхал ни разу.
0
Просто золотой.
В моем универе за подобную просьбу пошлют на ***. Все начинания исключительно за собственный счет.
0
я у максима заказывал дорогие step up и прочее гавно
указал свой универский адрес мыла
не прислали только ацп для термопары, но китайцы продают их по 3 бакса, а так он все 10 стоит
0
тем более я взял с них только контроллер, который стоит рубли, с их стороны тупо требовалось его заказать, я готов был его даже выкупить)) но дали просто так, а вот остальное все личное.
0
А подскажите, пожалуйста, профану, в чем профит этого контроллера? Я только с 8051 и AVR от Atmel знакомился лет 7 назад в школе еще :( Да и за ссылку на какой-нибудь обзорчег популярный современных МК буду весьма благодарен (какой чем силен и где полезно применять) :)
0
Для меня профит этого контроллера в том, что университетская дисциплина на нем основана, а вообще MSP430 лидируют (не?) в среде устройств с пониженным энергопотреблением, ну соответственно с автономным (батарейным) питанием.

сслыку дать не могу за неимением оной))
0
Ну лидер это громко сказано. Есть конкуренты.
0
не настаиваю, в подробности не вдавался
0
как я понимаю вам в универе их называют лидерами? Реклама проплачена)
0
Теоретически — да, практически — нет.
Единственный полноправный конкурент — это Cortex M0 от какой-то малоизвестной конторы, но и то в будущем.
Это если именно по потреблению и не в каких-то отдельных специально подогнанных тестах (типа как БМВ М6 жрет на треке в «топ гир» меньше приуса), а именно в реальных приложениях.
0
MPS430 на 1Mhz потребляет 230uA
STM8L на 1Mhz потребляет 150-192uA.

И это не единственный конкурент.
0
Я ж говорю, в реальных приложениях, а не специально подобранных режимах.
Смотреть надо по совокупности параметров.
У МСП периферия заточена под микропотребление и автономную работу без участия ядра.
Да и ядро тоже.
А в энергосберегающих приложениях один из ключевых параметров — потребление в спячке.
И вот тут реальных конкурентов мало, если вообще есть.
0
Да у всех заточенно под микро потребление.
Да и «реальных приложениях» это как?
MSP430 в своих даташитах указывает данные для каких приложений?

MSP430 некоторым проигрывает и по режиму сна. STM8L у них выигрывает.
0
Реальное батарейное приложение — это:
Инициализация, спим. (LPM3)
Прерывание от периферии -> по-быстрому раскидали данные -> спим.

Глянул STM8L.
Вроде сопоставимо, не считая разрядности.
Нет порта GCC — жирный минус.
ИАР под каждую фитюльку покупать — без штанов останешься.
Но вообще интересно, будем иметь в виду.
0
Есть еще STM32L www.st.com/internet/mcu/subclass/1376.jsp

Также атмеловские контроллеры на технологии Pico Power. Philips тоже не отстает от гонки.
0
Техасцам, кстати, тоже есть чем удивлять
Test case
CPU speed @ 8MHz
Both memory options capped @ 12kB/s throughput (typical application)
FRAM consumes 9μA @ 12kB/s
Flash consumes 2200μA @ 12kB/s
Ценой, наверно, тоже :)
0
Хотя нет, глянул — пару баксов за кило :)
0
TI походу первые кто засунул эту память в микроконтроллеры. Нужно еще поглядеть как это приживется)

TI без спорный лидер в трансиверах. Ихние трансиверы можно ведрами покупать, причем почти везде.
0
Cortex M0 от какой-то малоизвестной конторы, но и то в будущем.
В смысле «Gecko»? Если в реале окажется, что в них нет не только «known errata», а и «unknown» тоже, то это бомба…
Их потихоньку уже возят, «Элтех», в частности. Но мне туда не дотянуться.
0
Кафедра ТСС небось? или ТиСС хз как правильно
0
  • avatar
  • mlex
  • 28 декабря 2011, 10:15
да
0
TA1IV = 0x00;//чистим регистр вектора, автоотчистки тут нет
Жесть!
Похоже, техасцы пошли по пути атымела по части косяков…
Индусов наняли, чтоли
0
причем не наняли, а взяли на аутсорс у атмела.
0
Флуд
РТФ УПИ 1972...1977. Ядрёна канифоль. Как давно это было.
0
  • avatar
  • akl
  • 28 декабря 2011, 16:46
кстати горячие техаские рейнджеры шлют новый ланчпад v 1.5 с исправленным uart и 2-мя камнями — G2553 и G2452. Заказал с схоронил
0
а цена та же?))
0
да, 4.30$. по номеру серии msp430
0
не удержался и заказал себе… :)
0
А можно подробнее что там за косяки? А то как раз прислали эту версию LaunchPad.
0
когда выпускали ланчпад (первые версии), то еще не было камней дешевой серии G2 с USCI, только USI. Но разводку на плате сделали под них заранее, перепутав при этом ноги :)
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.