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


Тут просто неоценимым бонусом стало то, что контактные площадки торчат сбоку, паял паяльником, а 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
Желтые провода это исправление косяка TI, g2553 не совместим с линиями TxD и RxD лаунчпада с точностью до наоборот. Они как-то даже это признали эпическим фэйлом, не помню где-то читал, когда искал инфу о контроллере.
А чего бы прям в разводке мезонинной платы не поправить?
>>я сгонял на кафедру попросил и через 2 недели пришли мне самые толстые 2553 только в DIP20 не было пришло в QFN32:
у вас прекрасный институт/университет.
у вас прекрасный институт/университет.
просто у нас на кафедре что-то вроде сотрудничества с TI, они нам хорошо, а кафедра учит студентов прогать их контроллеры. ИРИТ-РтФ УрФУ (Радиофак УПИ раньше) г. Екатеринбург
Просто золотой.
В моем универе за подобную просьбу пошлют на ***. Все начинания исключительно за собственный счет.
В моем универе за подобную просьбу пошлют на ***. Все начинания исключительно за собственный счет.
я у максима заказывал дорогие step up и прочее гавно
указал свой универский адрес мыла
не прислали только ацп для термопары, но китайцы продают их по 3 бакса, а так он все 10 стоит
указал свой универский адрес мыла
не прислали только ацп для термопары, но китайцы продают их по 3 бакса, а так он все 10 стоит
- kalobyte-ya
- 27 декабря 2011, 20:29
- ↑
- ↓
А подскажите, пожалуйста, профану, в чем профит этого контроллера? Я только с 8051 и AVR от Atmel знакомился лет 7 назад в школе еще :( Да и за ссылку на какой-нибудь обзорчег популярный современных МК буду весьма благодарен (какой чем силен и где полезно применять) :)
Для меня профит этого контроллера в том, что университетская дисциплина на нем основана, а вообще MSP430 лидируют (не?) в среде устройств с пониженным энергопотреблением, ну соответственно с автономным (батарейным) питанием.
сслыку дать не могу за неимением оной))
сслыку дать не могу за неимением оной))
Теоретически — да, практически — нет.
Единственный полноправный конкурент — это Cortex M0 от какой-то малоизвестной конторы, но и то в будущем.
Это если именно по потреблению и не в каких-то отдельных специально подогнанных тестах (типа как БМВ М6 жрет на треке в «топ гир» меньше приуса), а именно в реальных приложениях.
Единственный полноправный конкурент — это Cortex M0 от какой-то малоизвестной конторы, но и то в будущем.
Это если именно по потреблению и не в каких-то отдельных специально подогнанных тестах (типа как БМВ М6 жрет на треке в «топ гир» меньше приуса), а именно в реальных приложениях.
MPS430 на 1Mhz потребляет 230uA
STM8L на 1Mhz потребляет 150-192uA.
И это не единственный конкурент.
STM8L на 1Mhz потребляет 150-192uA.
И это не единственный конкурент.
Я ж говорю, в реальных приложениях, а не специально подобранных режимах.
Смотреть надо по совокупности параметров.
У МСП периферия заточена под микропотребление и автономную работу без участия ядра.
Да и ядро тоже.
А в энергосберегающих приложениях один из ключевых параметров — потребление в спячке.
И вот тут реальных конкурентов мало, если вообще есть.
Смотреть надо по совокупности параметров.
У МСП периферия заточена под микропотребление и автономную работу без участия ядра.
Да и ядро тоже.
А в энергосберегающих приложениях один из ключевых параметров — потребление в спячке.
И вот тут реальных конкурентов мало, если вообще есть.
Да у всех заточенно под микро потребление.
Да и «реальных приложениях» это как?
MSP430 в своих даташитах указывает данные для каких приложений?
MSP430 некоторым проигрывает и по режиму сна. STM8L у них выигрывает.
Да и «реальных приложениях» это как?
MSP430 в своих даташитах указывает данные для каких приложений?
MSP430 некоторым проигрывает и по режиму сна. STM8L у них выигрывает.
Реальное батарейное приложение — это:
Инициализация, спим. (LPM3)
Прерывание от периферии -> по-быстрому раскидали данные -> спим.
Глянул STM8L.
Вроде сопоставимо, не считая разрядности.
Нет порта GCC — жирный минус.
ИАР под каждую фитюльку покупать — без штанов останешься.
Но вообще интересно, будем иметь в виду.
Инициализация, спим. (LPM3)
Прерывание от периферии -> по-быстрому раскидали данные -> спим.
Глянул STM8L.
Вроде сопоставимо, не считая разрядности.
Нет порта GCC — жирный минус.
ИАР под каждую фитюльку покупать — без штанов останешься.
Но вообще интересно, будем иметь в виду.
Есть еще STM32L www.st.com/internet/mcu/subclass/1376.jsp
Также атмеловские контроллеры на технологии Pico Power. Philips тоже не отстает от гонки.
Также атмеловские контроллеры на технологии Pico Power. Philips тоже не отстает от гонки.
Техасцам, кстати, тоже есть чем удивлять
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
кстати горячие техаские рейнджеры шлют новый ланчпад v 1.5 с исправленным uart и 2-мя камнями — G2553 и G2452. Заказал с схоронил
- DeusExMachina
- 30 декабря 2011, 09:33
- ↓
когда выпускали ланчпад (первые версии), то еще не было камней дешевой серии G2 с USCI, только USI. Но разводку на плате сделали под них заранее, перепутав при этом ноги :)
- DeusExMachina
- 05 января 2012, 09:06
- ↑
- ↓
Комментарии (37)
RSS свернуть / развернуть