Gömülü Sistem ve Programlama ile ilgili yazılar yazıyorum. Umarım faydalı olur.

28 Ağustos 2016 Pazar

MSP430 ile Vumetre Uygulaması

04:17:00 Posted by Erencan Tayanç , , , , , , , , , 1 comment

MSP430 ile Vumetre Uygulaması



   16 bitlik RISC mimarisine sahip MSP430 ailesi düşük güç tüketimi için Texas Instruments (TI) şirketi tarafından tasarlanmıştır. Bu tasarıma bağlı olarak azaltılmış komut kümesi sayesinde daha hızlı çalışır, işlemcilerin komut kümeleri basitleştirildiklerinden çok az yonga kullanır ve CISC işlemcilere göre daha çabuk tasarlanabilirler. USB, RF, LCD kontrollerinin yanı sıra I2C, SPI, USART, ADC dâhil olmak üzere yüksek performanslı çevre birimleri bulundururlar. MSP430/16x serileri halinde ailelere sahiptir.


MSP430 Geliştirme Kartı
   Kısaca mikrodenetleyicimizi tanımladıktan sonra vumetre nedir ona gelelim. Vumetre sesin şiddetine göre devreye bağlı olan ledlerin yanıp sönmesini görebildiğimiz bir devredir.
Vumetre Devresi Örneği


Devrenin fritzing Çizimi

   
   Yukarıda çizmiş olduğum devrede vumetre devresindeki ses çıkışı yerine pot kullandım. Bunun sebebi kodu basitçe deneyebilmeniz için uygun şartları sağlamaktadır. Potansiyometrenin içindeki ayarlanabilir uç sayesinde içindeki direnç miktarı değişir. bu sayede ise değişen direnç oranına göre üzerine düşen gerilim miktarı değişmektedir. Bu sayede ölçülen gerilim miktarına göre mikrodenetleyici çıkışlarındaki ledler bu voltaj şiddetine göre yanıp sönecektir. Devre ve kod MSP430G2553 mikrodenetleyicisinde denenmiş olup çalıştığı kesindir. Soru, öneri ve görüşlerinizi yorum olarak yazarsanız sevinirim...





/*
Yazar : Erencan TAYANÇ
MSP430 ile Vumetre
*/
#include <msp430.h>
void LedYak(int); // Fonksiyon prototipi.
int ADC_Ham; // Ham  değerlerini tutan değişkenler
void main(void) {
  P1DIR = 0xFE;  // p1.0 hariç hepsi output olarak ayarlandı
  P1OUT = 0x00;
  WDTCTL = WDTPW | WDTHOLD; // Watchdog timeri durdur.
  ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE; // ADC ayarları, kesme aktif
  ADC10CTL1 = INCH_0; // A0 girişini seç
  ADC10AE0 |= BIT0; // PA.0 ADC özelliğini aktif et
  _BIS_SR(GIE); // Kesmeleri aç
  for(;;){
    ADC10CTL0 |= ENC + ADC10SC; // AD çevrimi başlat
    _BIS_SR(LPM0_bits); // Uykuya gir (Low Power 0 Moduna)
    ADC_Ham = ADC10MEM; // Çevrim sonucunu ADC_Ham değişkenine at.
    LedYak(ADC_Ham);    //Led Yak fonksiyonuna ADC_Ham'ın değerini yolla.
  }
}
void LedYak(int ham){
  /* Bu fonksiyonun içindeki sayıları en iyi değeri bulmak
  * için deneyerek bulabilirsiniz. ADC' ye bağlanacak devrenin
  * çıkış gerilimine göre bu değerler farklılık gösterir.
  */

  if(ham>=100 && ham <130)
    P1OUT =  0x7E;

  else if(ham>=130 && ham<160)
    P1OUT =  0x3E;

  else if(ham>=160 && ham<190)
    P1OUT =  0x1E;

  else if(ham>=190 && ham<220)
    P1OUT =  0x0E;

  else if(ham>=220 && ham<250)
    P1OUT =  0x06
   
  else if(ham>=250 && ham<280)
    P1OUT =  0x02;
}
// ADC10 kesme vektörü
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)
{
  __bic_SR_register_on_exit(CPUOFF); // İşlemciyi uykudan uyandır.
}

1 yorum: