МПЗПК лаби / LR_PMZV-6
.docМіністерство освіти і науки, молоді та спорту України
Вінницький національний технічний університет
Інститут автоматики, електроніки та комп‘ютерних систем управління
Кафедра метрології та промислової автоматики
Методичні вказівки
до лабораторної роботи №6
по курсу : "Проектування мікропроцесорних засобів вимірювання "
«Режими низького електроспоживання»
Вінниця - 2012

Мета: метою цієї лабораторної роботи є вивчення різних методів використання режимів низького енергоспоживання. Розпочнемо з коду попередньої лабораторної роботи і переналаштуємо його для роботи на режимах низького енергоспоживання.

Порядок виконання роботи:
Створіть New Project
1. Створіть новий проект (File → New → CCS Project) і назвіть його Lab6. Зніміть прапорець “use default location” ("Використовувати за замовчуванням"). Використовуючи кнопку Browse... , перейдіть до папки: C:\MSP430_LaunchPad\Labs\Lab6\Project. Натисніть кнопку ОК, а потім натисніть кнопку Next. Наступні параметри у трьох вікнах вже повинні бути встановленими за замовчуванням (project type MSP430, no inter-project dependencies selected, and device variant set to MSP430G2231). Наступні параметри також встановіть за замовчуванням, а в останньому вікні натисніть кнопку Finish.
Створіть Source File
2. Додайте source file до проекту (File →New →Source File) та назвіть його Lab6.c та натисніть кнопку Finish.
Створіть lab6.c Source File
Результуючий файл з останньої лабораторної роботи буде використовуватися в якості відправної точки.
3. Відкрийте Lab5_Finish.txt використовуючи (File →Open File…)
C:\MSP430_LaunchPad\Labs\Lab5\Files\Lab5_Finish.txt
4. Скопіюйте весь код з Lab5_Finish.txt та вставте його в Lab6.c. Це буде першим етапом до виконання задачі.
5. Закрийте файл Lab5_Finish.txt. Він більше не знадобиться.
Задайте необхідні налаштування для введення/виведення в режимі низького електроспоживання
Якщо у вас є цифровий мультиметр ви можете зробити наступне вимірювання. В іншому випадку необхідно слідувати написанному нижче. Частота дискретизації в одну секунду є занадто швидкою для більшості мультиметрів, тому ми збільшимо цей час до трьох секунд.
6. Знайдіть та замініть наступні рядки коду:
- У ConfigTimerA2(): Замініть: CCR0 = 12000 → На: CCR0 = 36000;
- У Timer_A0 ISR : Замініть: CCR0 += 12000 → На: CCR0 += 36000;
7. Протікання струму через червоний світлодіод робить неможливим наші вимірювання, тому поставте коментар на двох строках P1OUT у while(1).
8. В якості тесту, виконайте завантаження і запуск коду. Якщо все працює правильно, то зелений світлодіод буде мерехтіти приблизно один раз в 3 секунди. Коли закінчите, зупиніть код і натиснувши кнопку Terminate all, щоб повернутися в C/C ++.
Базові вимірювання
9. Виміряйте напругу між Vcc і GND на джемпері J6. Ви повинні отримати значення близько 3,7В постійного струму.
Запишіть результат вимірювання тут: _____________
10. На даний момент MCLK і SMCLK встановлені на 125 kHz (DCO/8) з використанням подільника. Так як нам потрібно щоб MCLK було встановлено на частоті 1 MHz, виконаємо наступне. Зробіть такі зміни у ConfigClocks():
Замініть: BCSCTL2 |= SELM_0 + DIVM_3 + DIVS_3;
На: BCSCTL2 = 0;
11. В якості тесту, виконайте завантаження і запуск коду. Якщо все працює правильно, то зелений світлодіод буде мерехтіти приблизно один раз в 3 секунди.
12. Потрібно повністю ізолювати мікроконтролер від емулятора, за виключенням землі. Видаліть всі п'ять джемперів з роз'єму J3. Встановіть свій мультиметр для вимірювання мкА. Підключіть червоний дріт мультиметра до верхнього контакту напруги живлення на роз'ємі J3 і чорний дріт мультиметра до нижнього контакту напруги живлення на роз'ємі J3. Далі, натисніть кнопку скидання на платі.
Якщо ваш мультиметр має досить низький внутрішній опір,то зелений світлодіод на платі буде мерехтіти нормально, і ви побачите результат вимірювання струму.
Виміряйте струм MSP430, без струму світлодіодів і емулятора. Це буде наше базове значення струму. Виміряйте струм між миготінням зеленого світлодіода.
Ви повинні отримати значення близько 362 мкА.
Запишіть результати вимірювання тут: _____________
Обережно встановіть чотири перемички на роз’ємі J3 за винятком Vcc.
Налаштування входів-виходів
Ми повинні переконатися, що всі виводи налаштовані для роботи у режимі низького електроспоживання. Зі схеми LaunchPad, ми бачимо, що Port1 з’єднаний з інтерфейсом GPIO (General Purpose Input/Output). Тільки P1.3 налаштований як вхід для підтримки кнопки-перемикача S2, а інші налаштовані як виводи. Входи P2.6 і P2.7 налаштуємо в якості GPIO.
13. Перейменуйте ConfigLEDs() на ConfigPins().
14. Видаліть вміст ConfigPins(), та введіть наступне:
P1DIR = ~BIT3;
P1OUT = 0;
15. Є два контакти на Port2 спільні з контактами XIN і XOUT. У цій лабораторній роботі кварцові резонатори використовуватись не будуть, тому нам потрібно встановити ці контакти як GPIO. Прилад покаже що біти 6 і 7 P2SEL мають бути очищені, щоб обрати GPIO. Додайте наступний код в ConfigPins():
P2SEL = ~(BIT6 + BIT7);
P2DIR |= BIT6 + BIT7;
P2OUT = 0;
16. На даний момент, наш код має виглядати так. Було додано коментарі, для кращого розуміння. Натисніть кнопку Save на панелі меню, щоб зберегти файл.
|
void ConfigPins(void) { P1DIR = ~BIT3; // P1.3 введення, інші - виведення P1OUT = 0; // очищує контакти виведення P2SEL = ~(BIT6 + BIT7); // P2.6 і 7 GPIO P2DIR |= BIT6 + BIT7; // P2.6 і 7 виведення P2OUT = 0; // очищує контакти виведення } |
17. Виконайте завантаження і запуск коду. Якщо все працює правильно, то зелений світлодіод буде мерехтіти приблизно один раз в 3 секунди. Зупиніть виконання коду і натисніть кнопку Terminate all, щоб повернутися в C/C++.
18. Потім видаліть чотири джемпери з роз'єму J3. Натисніть кнопку скидання на платі LaunchPad і виміряйте значення струму між мерехтінням зеленого світлодіода.
Ви повинні отримати значення близько 362 мкА.
Запишіть результати вимірювання тут: _____________
Обережно встановіть чотири джемпери на роз'єм J3, за винятком Vcc.
Споживання струму MSP430G2231
Споживання струму MSP430G2231 виглядає як на графіку, що нижче (без урахування LED). Процесор споживає 360 мкА на протязі усього часу (3 секунди). Необхідний струм для ADC10 складає 250 мкА на протязі 33 мкс. Збільшення струму до 600 мкА відбувається за 3 мкс.
Якщо
б можливо було обмежити кількість часу,
на протязі якого процесор активний,
загальне споживання струму було б значно
зменшено
Заміна циклу while(1) у режимі низького електроспоживання
Більшість потужності використовується програмою під час виконання циклу while(1). Ми можемо встановити процесор в режим зниженого електроспоживання і заощадити значну кількість електроенергії.
19. Видаліть весь код з циклу while(1). Видаліть _BIS_SR(GIE).
Видаліть volatile unsigned int i; з верхньої частини Lab6.c. Потім додайте наступне у цикл while(1):
_bis_SR_register(LPM3_bits + GIE);
Цей код буде вмикати переривання і переводити процесор в режим LPM3.
Ви можете помітити, що синтаксис змінився між цією строкою і тою, яку ми видалили. Код MSP430 розвивався протягом багатьох років, і, друга строка, є найоптимальнішою на сьогоднішній день, проте синтаксис першого рядка строки, як і раніше, приймається компілятором.
20. На даний момент код main() повинен мати такий вигляд:
|
void main(void) { ConfigWDT(); ConfigClocks(); ConfigPins(); ConfigADC10(); ConfigTimerA2(); while(1) { _bis_SR_register(LPM3_bits + GIE); // Встановлення режиму LPM3 з перериваннями } } |
21. Біти регістру стану (SR) встановлені вище у коді:
•SCG0: вимикає SMCLK;
• SCG1: вимикає DCO;
• CPUOFF: вимикає CPU
Додайте наступне до вашого коду Timer_A0 ISR:
_bic_SR_register_on_exit(LPM3_bits);
Цей рядок коду очищає біт який з'явився SR.
22. Timer_A0 ISR повинен виглядати так:
|
#pragma vector=TIMERA0_VECTOR __interrupt void Timer_A (void) { ADC10CTL0 = SREF_1 + ADC10SHT_3 + REFON + ADC10ON; _delay_cycles(5); // Затримка ADC Ref до урегулювання ADC10CTL0 |= ENC + ADC10SC; // Відбір проб і перетворення початку P1OUT |= BIT6; // P1.6 вкл. (зелений LED) _delay_cycles(100); ADC10CTL0 &= ~ENC; // Викл. АЦП ADC10CTL0 &= ~(REFON + ADC10ON); tempRaw = ADC10MEM; // Зчитується перетворене значення P1OUT &= ~BIT6; // Викл. зелений LED CCR0 += 36000; // Додається одна секунда до CCR0 _bic_SR_register_on_exit(LPM3_bits); // Очищує на виході LPM3 біти з SR } |
23. Виконайте завантаження і запуск коду. Якщо все працює правильно, то зелений світлодіод буде мерехтіти приблизно один раз в 3 секунди. Зупиніть код і натисніть кнопку Terminate all, щоб повернутися в C/C ++.
24. Потім видаліть чотири джемпери з роз'єму J3. Натисніть кнопку скидання на платі LaunchPad і виміряйте значення струму між мерехтінням зеленого світлодіода.
Ви повинні отримати значення близько 0,6 мкА.
Запишіть результати вимірювання тут: _____________
Процесор споживає набагато менше енергії.
Обережно встановіть чотири джемпери на роз'єм J3, за винятком Vcc.
Графік
поточного споживання буде виглядати
приблизно так:
Повністю оптимізований код для низького електроспоживання
Останнім кроком в оптимізації коду, буде видалення затримки програмного забезпечення в ISR. Використаємо Timer_A2 щоб це реалізувати та заощадити ще більше енергії. Малоймовірно, що ми зможемо виміряти цей струм без осцилографа, так як це відбувається дуже швидко. Але ми зможемо переконатися, що струм не збільшиться.
25. Оперційна затримка у Timer_A0 ISR повинна бути відповідною до частоти 1 МГц MCLK яку ми зробили раніше. Це дозволить зберегти коректну роботу коду. Для встановлення затримки в 30 мкс виконайте:
Замініть: _delay_cycles(5);
на: _delay_cycles(500);
26. Виконайте завантаження і запуск коду. Зелений світлодіод буде мерехтіти приблизно один раз в 3 секунди, проте дуже швидко. Якщо у вас виникли проблеми з кодом, тоді його можна знайти у папці Files, файл Lab6a.txt.
27. Переконайтеся, що код все ще зчитує температуру, встановіть tempRaw у вікні перегляду. Встановіть точку зупину CCR0 += 36000, у коді Timer_A0 ISR.
28. Запустіть код за допомогою F8 і зверніть увагу на значення tempRaw у вікні перегляду. Ви повинні спостерігати зміну значення. Зупиніть код і натисніть кнопку Terminate all, щоб повернутися в C/C ++.
Пояснення
В цьому додатку нам потрібні три окремих затримки:
• Три секунди між режимами
• 30 мкс для ведення регулювання
• 3 мкс для перетворення часу
Використаємо Timer_A2 для реалізації затримки в 3 секунди, а також 30 мкс часу врегулювання. Також застосуємо ADC10 перетворення, щоб перервати код по завершенні перетворення.
Ми будемо використовувати обидва регістри захоплення і порівняння; CCR0 і CCR1. Вони мають дещо іншу функціональність, але обидва здатні генерувати переривання. Коли Timer A Register (TAR) досягне CCR0, це призведе до скидання TAR. Таким чином ми використаємо CCR1 для затримки в 3 секунди, і CCR0 (3 секунди + 30 мкс).
Процес буде виглядати наступним чином:
• Ініціалізація CPU переход в LPM3;
• Timer_A2 CCR1 переривання кожні 3 секунди; Timer_A1 CCR0 переривання 3 секунди + 30 мкс;
• LPM3 повторно вступає в main();
• Timer_A0 ISR запускається після 30 мкс і починається ADC (аналогово-цифрове перетворення) , потім виконується налаштування ADC10 перетворення повного переривання; регістр таймеру TAR скидається;
• LM3 повторно вступає в main();
• ADC10 ISR виконується при повному перетворенні і завершує обробку ADC перетворення
29. В даний час Timer_A2 ISR запускається TAR (після отримання CCR0). Для зменшення плутанини, змінимо верхню частину Timer_A2 ISR наступним чином:
|
// Timer_A2 CCR0 обслуговування переривання (ISR) #pragma vector=TIMERA0_VECTOR __interrupt void Timer_A0 (void) |
30. Зробіть такі зміни в ConfigTimerA2 ():
|
void ConfigTimerA2(void) { CCTL1 = CCIE + OUTMOD_3; // CCR1 int. вкл./скидання CCR1 = 36000; // три секунди CCTL0 = CCIE; // CCR0 int. вкл. CCR0 = 36100; // 3 секунди + час встановлення TACTL = TASSEL_1 + MC_1; // ACLK } |
31. Додайте шаблон ISR у кінець Lab6.c:
|
// Timer_A2 CCR1 обслуговування переривання (ISR) #pragma vector=TIMERA1_VECTOR __interrupt void Timer_A1 (void) { } |
32. Зкопіюйте перший та останній рядок з Timer_A0 ISR і помістіть їх в Timer_A1 ISR:
|
// Timer_A2 CCR1 обслуговування переривання (ISR) #pragma vector=TIMERA1_VECTOR __interrupt void Timer_A1 (void) { ADC10CTL0 = SREF_1 + ADC10SHT_3 + REFON + ADC10ON; _bic_SR_register_on_exit(LPM3_bits); // Очищ. LPM3 бітів з SR на виході } |
33. У Timer_A0 ISR, видаліть перші два рядки і строку CCR0. Це усуне затримку програмного забезпечення. Порівняйте ваш код з наведеним нижче:
|
// Timer_A2 CCR0 обслуговування переривання (ISR) #pragma vector=TIMERA0_VECTOR __interrupt void Timer_A0 (void) { ADC10CTL0 |= ENC + ADC10SC; // Відбір проб P1OUT |= BIT6; // P1.6 вкл. (зелений LED) _delay_cycles(500); ADC10CTL0 &= ~ENC; // Викл. ADC перетворення ADC10CTL0 &= ~(REFON + ADC10ON); // Ref і ADC10 викл. tempRaw = ADC10MEM; // Зчит. перетв. значення P1OUT &= ~BIT6; // green LED викл. _bic_SR_register_on_exit(LPM3_bits); // Очищ. LPM3 бітів з SR на виході } |
34. Для того щоб прапори автоматично не видалялись при запуску коду повторно, на початку програми, додайте наступне:
|
// Timer_A2 CCR0 обслуговування переривання (ISR) #pragma vector=TIMERA0_VECTOR __interrupt void Timer_A0 (void) { CCTL0 &= ~CCIFG; // Очищ. прапор CCR0 int ADC10CTL0 |= ENC + ADC10SC; // Відбір проб P1OUT |= BIT6; // P1.6 вкл. (зелений LED) _delay_cycles(500); ADC10CTL0 &= ~ENC; // Викл. ADC перетворення ADC10CTL0 &= ~(REFON + ADC10ON); // Ref і ADC10 викл. tempRaw = ADC10MEM; // Зчит. перетв. значення P1OUT &= ~BIT6; // green LED off _bic_SR_register_on_exit(LPM3_bits); // Очищ. LPM3 бітів з SR на виході } // Timer_A2 CCR1 обслуговування переривання #pragma vector=TIMERA1_VECTOR __interrupt void Timer_A1 (void) { CCTL1 &= ~CCIFG; // Очищ. прапор CCR0 int ADC10CTL0 = SREF_1 + ADC10SHT_3 + REFON + ADC10ON; _bic_SR_register_on_exit(LPM3_bits); // Очищ. LPM3 бітів з SR на виході } |
35. Виконайте завантаження і запуск коду. Якщо все працює правильно, то зелений світлодіод буде мерехтіти настільки швидко, що це буде важко побачити. Зупиніть код і натисніть кнопку Terminate all, щоб повернутися в C/C ++.
36. Щоб забезпечити чітку вказівку про завершення перетворення, додайте наступне у шаблон ADC10 ISR в кінці Lab6.c:
|
// ADC10 обслуговування переривання #pragma vector=ADC10_VECTOR __interrupt void ADC10 (void) { } |
37. Скопіюйте усі строки з Timer_A0 ISR що знаходяться нижче delay_cycles і вставте їх у ADC10 ISR.
38. Видаліть код, що проходить через строку P1OUT у Timer_A0 ISR з _delay_cycles,
39. У верхній частині ADC10 ISR, додайте:
ADC10CTL0 & = ~ ADC10IFG, щоб очистити прапор переривання.
40. Нарешті, ми повинні включити ADC10 переривання. У Timer_A1 ISR, додайте: + ADC10IE до реєстру ADC10CTL0.
Дерево коду ISR має виглядати наступним чином:
|
// Timer_A2 CCR0 обслуговування переривання (ISR) #pragma vector=TIMERA0_VECTOR __interrupt void Timer_A0 (void) { CCTL0 &= ~CCIFG; // Clear CCR0 int flag ADC10CTL0 |= ENC + ADC10SC; // Відбір проб і перетворення початку P1OUT |= BIT6; // P1.6 вкл. (зелений LED) _bic_SR_register_on_exit(LPM3_bits); // Очищ. LPM3 бітів з SR на виході } // Timer_A2 CCR1 обслуговування переривання (ISR) #pragma vector=TIMERA1_VECTOR __interrupt void Timer_A1 (void) { CCTL1 &= ~CCIFG; // Clear CCR1 int flag ADC10CTL0 = SREF_1 + ADC10SHT_3 + REFON + ADC10ON + ADC10IE; _bic_SR_register_on_exit(LPM3_bits); // Очищ. LPM3 бітів з SR на виході } // ADC10 обслуговування переривання (ISR) #pragma vector=ADC10_VECTOR __interrupt void ADC10 (void) { ADC10CTL0 &= ~ADC10IFG; // Очищ. прапор ADC10 ADC10CTL0 &= ~ENC; // Викл. АЦП перетворення ADC10CTL0 &= ~(REFON + ADC10ON); // Ref і ADC10 викл. tempRaw = ADC10MEM; // Зчит. перетв. значення P1OUT &= ~BIT6; // зелений LED викл. _bic_SR_register_on_exit(LPM3_bits); // Очищ. LPM3 бітів з SR на виході } |
41. Виконайте завантаження і запуск коду. Ліквідуйте точки зупину і запустіть код. Якщо все працює правильно, то зелений світлодіод буде мерехтіти настільки швидко, що це буде важко побачити. Встановіть точку зупину на строці P1OUT в ADC10 ISR і переконайтеся, що код працює правильно, як було показано раніше. Зупиніть код і натисніть кнопку Terminate all, щоб повернутися в C/C ++.
42. Видаліть чотири джемпери з роз'єму J3. Натисніть кнопку скидання на платі LaunchPad і виміряйте значення струму між мерехтінням зеленого світлодіода. Ви повинні мати значення близько 0,7 мкА. Додаткові 0,1 мкА споживаються Timer_A2 для запуску VLO.
Запишіть результати вимірювання тут: _____________
Обережно встановіть чотири джемпери на роз'єм J3, за винятком Vcc.
Вимірювання струму завершено.
Графік
поточного споживання буде виглядати
приблизно так:
43. Далі, закрийте проект натиснувши правою кнопкою миші по Lab6 у вікні C/C++ Projects і оберіть Close Project.
