Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

msp430g2553 ADC10 въпроси
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=12959
Страница 1 от 1

Автор:  Hardest [ Чет Май 29, 2014 2:05 pm ]
Заглавие:  msp430g2553 ADC10 въпроси

Здравейте, играя си със мсп-то да видим какво съм научил от университета та към въпроса, искам с потенциометър да регулирам яркостта с която свети диода, всичко през мсп-то, обаче имам малко self-объркване, Output-a на ADC-то трябва да е Input на потенциометъра ли ?


Код:
#include <msp430G2553.h>
#define LED0 BIT0
unsigned int value;
void ConfigureADC(void)
{
   ADC10CTL1 = INCH_5 + ADC10DIV_2; // 5ti kanal na ADC-to + ADC10 Clock Divider Select Bit: 2 //
   ADC10CTL0 = SREF_0 + ADC10SHT_3 + ADC10ON + ADC10IE; // Vcc + Vss as reff voltage (ADC10 Reference Select Bit: 0 +64 x ADC10CLKs
   // + ADC10 On/Enable  + ADC10IE //
   ADC10AE0 |= BIT5; // Analog enable//
}
int main(void) {
    WDTCTL = WDTPW | WDTHOLD;   // Stop watchdog timer
   BCSCTL1 = CALBC1_1MHZ; // calibrates
   DCOCTL    = CALDCO_1MHZ; // calibrates
   BCSCTL2 &= ~(DIVS_3);  // SMCLK = DCO = 1MHZ
   P1DIR |= BIT0; // P1.0 output P1.5 input
   P1SEL |= BIT5;  // ADC input pin 1.5
   P1OUT &= ~(LED0);
      ConfigureADC();
      __enable_interrupt();
   while(1)
   {
      __delay_cycles(1000); // ADC Ref to settle
      ADC10CTL0 |= ENC + ADC10SC; // conversation start
//      __bis_SR_register(CPUOFF + GIE); // LPM0 with interruts
      value = ADC10MEM;
  if (value > 511);
{
   P1OUT &= ~(LED0);
   P1OUT |= LED0;
      }
   }
}
//ADC10 ISR
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)
{
__bis_SR_register_on_exit(CPUOFF);
}


Общо взето така си ги представям нещата ама не се случва в реалния свят :)

Автор:  ike [ Чет Май 29, 2014 2:20 pm ]
Заглавие:  Re: msp430g2553 ADC10 въпроси

За да регулираш яркостта, трябва това "value = ADC10MEM;" от това value става индекс на масив, защото светодиодите светят много нелинейно. Числото от масива го зареждаш в таймер работещ в PWM режим.

1. Конфигурираш ядрото, ADC, таймера, входовете и изходите.
2. Прочиташ ADC
3. От прочетеното ADC взимаш стойност от масив(таблица)
4. С тази стойност зареждаш PWM.
5. Отиваш на 2

Автор:  stefan63 [ Чет Май 29, 2014 2:41 pm ]
Заглавие:  Re: msp430g2553 ADC10 въпроси

Цитат:
Output-a на ADC-то трябва да е Input на потенциометъра ли ?

Да, IKE ти е казал как се прави.
С дебъгера виж АЦП какви стойности ти дава в двете крайни положения на потенциометъра. Да речем 0 и 511.
Тази ти програма не прави нищо друго, така че истинското PWM можеш да го прескочиш на този етап.
Четеш АЦП, умножаваш по 2 ,запомняш някъде това число "А" (0..1022).Стартираш АЦП-то. Всичко това става за няколко такта. Палиш светодиода и правиш дилей "А" цикъла, угасяш диода и правиш дилей (1023-"А") . Пак отиващ към четене на АЦП.

После почваш да четеш за PWM.

Автор:  Hardest [ Чет Май 29, 2014 4:21 pm ]
Заглавие:  Re: msp430g2553 ADC10 въпроси

ike написа:
За да регулираш яркостта, трябва това "value = ADC10MEM;" от това value става индекс на масив, защото светодиодите светят много нелинейно. Числото от масива го зареждаш в таймер работещ в PWM режим.

1. Конфигурираш ядрото, ADC, таймера, входовете и изходите.
2. Прочиташ ADC
3. От прочетеното ADC взимаш стойност от масив(таблица)
4. С тази стойност зареждаш PWM.
5. Отиваш на 2



Под ядрото имаш в предвид, MCU-то предполагам, ADC съм съчинил горе долу някаква конфигурация, I/O ми е горе долу понаправен.

Как да направя value индекс на масив ?

Автор:  Dimitar [ Чет Май 29, 2014 5:38 pm ]
Заглавие:  Re: msp430g2553 ADC10 въпроси

Като гледам са ти казали как се прави, ама са пропуснали да ти кажат, че програмата ти е леко сбъркана. Отделно входа на АЦП-то трябва да свързано към изхода на потенциометъра, т.е. и понятията ти са объкани. Обаче ако не знаеш как се прави индекс към масив е още рано да ти обясняваме какво точно си объркал в програмата - трябва малко четене преди това :). Въпреки това ще направя опит да ти кажа - първо въобще няма да ти проверявам дали конфигурациите на регистрите са ти правилни, защото трябва да тръгна да чета дейташита, а няма време за това. Основното обаче е, че след като стартираш АЦП-то не можеш просто на следващия ред да опитваш да четеш какво е измерило, защото то още няма да го е направило. Затова или вкарай закъснение между стартирането на ацп-то и четенето на резултата, което да е по-голямо от времето на преобразуване или ползвай прекъсването за това. Сега като гледам просто преспиваш контролера в прекъсването и ако няма какво да го събуди той просто си стои там. Така че имаш два проблема - тайминга след стартирането на ацп-то и успиването в прекъсването. Махни всички спанета, за да си сигурен, че първо меренето работи и премести четенето на ацп-то в прекъсването му. Също така трябва да нулираш флага на прекъсванията, когато влизаш в тях, защото иначе се получава един безкраен цикъл на влизане/излизане в/от прекъсване. Това е достатъчно проста програма, за да имаш толкова грижи и това показва, че ти липсва малко теоритична подготовка, т.е. четене :D .

Автор:  ike [ Чет Май 29, 2014 8:41 pm ]
Заглавие:  Re: msp430g2553 ADC10 въпроси

При тези контролери автоматично се нулира флага при прекъсване и трябва специално да го вкючиш, ако искаш да живееш рисковано.

Автор:  stefan63 [ Чет Май 29, 2014 9:04 pm ]
Заглавие:  Re: msp430g2553 ADC10 въпроси

Димитър ти го е написал коректно - ако изместиш закъснението да е между стартирането на АЦП и четенето - ще се приближиш още една идея до описаната поредица.
Това закъснение има странен коментар - копи/пейст отнякъде. Предполагам, това закъснение е нужно еднократно след конфигурирането на АЦП. В безкрайния цикъл закъснение по принцип не е нужно - процесорът стартира АЦП, влиза в режим LPM0 (редът ,който ти е изключен//)и чака прекъсване да го събуди. Прекъсването е от АЦП,няма друго прекъсване, процедурата на прекъсване само събужда контролера. Според чаршафа е достатъчно.
Дори без корекции на главния цикъл би трябвало да върви - ако конфигурациите са верни. Но все пак тоя дилей и изключения режим LPM0
сочат ,че нещо не върви коректно - не е конфигурирано правилно.

Автор:  ike [ Чет Май 29, 2014 10:01 pm ]
Заглавие:  Re: msp430g2553 ADC10 въпроси

Примера най-вероятно е от copy/paste от http://www.ti.com/lit/zip/slac485
иначе проблема му е че
Код:
if (value > 511);
{
   P1OUT &= ~(LED0);
   P1OUT |= LED0;
      }

неизвесно защо, не иска да прави PWM от таблица. За това и е коментирал редове, които му трябват.

Автор:  stefan63 [ Чет Май 29, 2014 10:09 pm ]
Заглавие:  Re: msp430g2553 ADC10 въпроси

E ,човекът иска да светне светодиод, малко по-сложно , но си е задача "моят бърви блинк-лед". Ти го пращаш да чете таймери и т.н, пишеш му за нелинейности на светенето... Трябва някаква по-проста идея, ковто да не го плаши.

Автор:  ike [ Чет Май 29, 2014 10:14 pm ]
Заглавие:  Re: msp430g2553 ADC10 въпроси

Цитат:
искам с потенциометър да регулирам яркостта с която свети диода

Грешката е вярна. Ще прочете примерите от http://www.ti.com/lit/zip/slac485 , ще ги комбинира и е готов.

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/