PWM sinyalini durdurmak

Başlatan Kevinlomax, 30 Nisan 2019, 12:50:45

Kevinlomax

Merhaba
PWM sinyali üretip 50 ms sonra sinyali kesmek istiyorum. 2 adet timer kullanarak bunu yapmayı denedim. Ancak durdurmayı başaramadım. Yardımcı olursanız çok sevinirim.


#include <msp430.h>

void PWMgonder(void);
void PWMdur(void);
unsigned char sayac=0;

int main(void)
{
WDTCTL = WDTPW | WDTHOLD; 
BCSCTL1 = CALBC1_1MHZ; 
DCOCTL = CALDCO_1MHZ; // Hesaplama kolaylığı için clock 1 Mhz' ye ayarlandı
CCTL0 = CCIE;  // Timer kesmesi aktif hale getirildi 

P2DIR |= BIT2;
P2SEL |= BIT2;// Pwm sinyalinin iletileceği pin seçildi
      
P2OUT=0x00;


while(1){

if((P1IN & BIT4)!=BIT4) //butona basıldı
  {
PWMgonder(); // pwm üret
PWMdur(); // 50 ms sonra dur
  }
  
}

}

void PWMgonder(void) // pwm sinyal üretimi
{
TA1CCR0 = 26-1;                          // Periyot
  TA1CCR1 = 13;                            // %50 duty cycle
  TA1CCTL1 |= OUTMOD_6;                    // 13 değerine ulaşınca 1'den 0'a geçiş
  TA1CTL = TASSEL_1 + MC_1 + TACLR;            // timer ayarı
}


void PWMdur(void) // 50 ms sonra pwm'yi durdurmaya çalıştığım kod 
{
CCR0 = 5000; // CCR0 5 ms 
TACTL = TASSEL_2 + MC_2; //5000'e sayıp kesme üreten timer ayarı
}

#pragma vector=TIMER0_A0_VECTOR // timer kesmesi
__interrupt void Timer_A (void)
{
if(++sayac==10){ // sayaç 10 oldu (10*5 50 msn )
 TA1CCR1 = 0;  ; // Timer'ı durdur
sayac = 0;
} 
}


Bu şekilde bir sinyal üretmek istiyorum.

z

#1
PWM duty registerine istedigin duty ile orantili sayiyi yukluyorsun ya, iste bu registere
50 ms sonra 0 yukle.

Gerci sen de aynini yapmissin.

Timer_A int rutinine giriyor mu? Debug ettin mi?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Kevinlomax

Alıntı yapılan: z - 30 Nisan 2019, 13:22:03PWM duty registerine istedigin duty ile orantili sayiyi yukluyorsun ya, iste bu registere
50 ms sonra 0 yukle.

Gerci sen de aynini yapmissin.

Timer_A int rutinine giriyor mu? Debug ettin mi?

Hayır girmiyor Ama yinede ne yazmam gerektiğini anlamadım.
#define TIMER0_A1_VECTOR    (8u * 2u)  /* 0xFFF0 Timer0)A CC1, TA0 */
#define TIMER0_A0_VECTOR    (9u * 2u)  /* 0xFFF2 Timer0_A CC0 */

https://www.mcufreak.com/msp430-nedir-msp430-baslangic-rehberi/msp430g2553-pinout/

z

Timer Interrupt'a izin veren bir register olmali. Islemcinin tanimiyorum register adini dokumanlarindan bulabilirsin. Genelde registerdeki bir biti 1 yaparak int enb islemi yapilir.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com