LPC176X 6 Kanal PWM Kodu

Başlatan mistek, 03 Ocak 2014, 09:05:00

mistek

pwm_init fonksiyona Prescaler(bolme_orani) ve Match Register(Hassasiyet-Adım) değeri girilecek. PwmFrekansı= PCLK/(bolme_orani+1)/hassasiyet

pwm_init fonksiyonu
void pwm_init(uint32_t bolme_orani, uint32_t hassasiyet)
{
	LPC_SC -> PCONP 	|= 1 << 6;		   // PWM aktif
	LPC_SC -> PCLKSEL0  &= (~(3 << 12));   // PWM clock = PCLK=CCLK/4
	 
	LPC_PINCON -> PINSEL4 |= 1 << 0;	//P2.0 -> PWM1 kanalý için ayarlý
	LPC_PINCON -> PINSEL4 |= 1 << 2;	//P2.1 -> PWM2 kanalý için ayarlý
	LPC_PINCON -> PINSEL4 |= 1 << 4; 	//P2.2 -> PWM3 kanalý için ayarlý
	LPC_PINCON -> PINSEL4 |= 1 << 6;	//P2.3 -> PWM4 kanalý için ayarlý
	LPC_PINCON -> PINSEL4 |= 1 << 8;	//P2.4 -> PWM5 kanalý için ayarlý
	LPC_PINCON -> PINSEL4 |= 1 << 10;	//P2.5 -> PWM6 kanalý için ayarlý

	LPC_PWM1   -> TCR |= 1 << 1;  // Counter RESET	

	LPC_PWM1   -> PR   = bolme_orani;   // PWM frekansý bölme oraný  PWM freq = PCLK/PR+1

	LPC_PWM1   -> MCR 	= 1 << 1;	//MR0=TC olduðunda Timer Counterý sýfýrla  PWM0 kullanýlmýyor  
    
	/*  ÇIFT KENAR KONTROL PWM OLDUGUNDA KULLANILAN AYARLAR
	LPC_PWM1   -> MCR 	= 1 << 4;	//MR1=TC olduðunda Timer Counterý sýfýrla
	LPC_PWM1   -> MCR 	= 1 << 7;	//MR2=TC olduðunda Timer Counterý sýfýrla
	LPC_PWM1   -> MCR 	= 1 << 10;	//MR3=TC olduðunda Timer Counterý sýfýrla
	LPC_PWM1   -> MCR 	= 1 << 13;	//MR4=TC olduðunda Timer Counterý sýfýrla
	LPC_PWM1   -> MCR 	= 1 << 16;	//MR5=TC olduðunda Timer Counterý sýfýrla
	LPC_PWM1   -> MCR 	= 1 << 19;	//MR6=TC olduðunda Timer Counterý sýfýrla	  
	*/	
	
	LPC_PWM1   -> PCR &= 0x00;     // Tek kenar kontrollü PWM sinyali üretilecek

	LPC_PWM1   -> PCR |= 1 << 9;   // PWM1 kanalý aktif
	LPC_PWM1   -> PCR |= 1 << 10;  // PWM2 kanalý aktif
	LPC_PWM1   -> PCR |= 1 << 11;  // PWM3 kanalý aktif
	LPC_PWM1   -> PCR |= 1 << 12;  // PWM4 kanalý aktif
	LPC_PWM1   -> PCR |= 1 << 13;  // PWM5 kanalý aktif
	LPC_PWM1   -> PCR |= 1 << 14;  // PWM6 kanalý aktif
   
	LPC_PWM1   -> MR0 = hassasiyet;	//Timer Counter Karþýlaþtýrma deðeri ve PWM0 çözünürlüðü deðeri Resolution=1/hassasiyet
	LPC_PWM1   -> MR1 = 0;	//Timer Counter Karþýlaþtýrma deðeri
	LPC_PWM1   -> MR2 = 0;	//Timer Counter Karþýlaþtýrma deðeri
	LPC_PWM1   -> MR3 = 0;	//Timer Counter Karþýlaþtýrma deðeri
	LPC_PWM1   -> MR4 = 0;	//Timer Counter Karþýlaþtýrma deðeri
	LPC_PWM1   -> MR5 = 0;	//Timer Counter Karþýlaþtýrma deðeri
	LPC_PWM1   -> MR6 = 0;	//Timer Counter Karþýlaþtýrma deðeri
  
	LPC_PWM1   -> TCR  = 1 << 3 | 1 << 0 ;   // COUNTER ve PWM aktif	(Bu þekilde sýralý yazmazsak çalýþmaz)

	LPC_PWM1   -> LER = 1 << 0 | 1 << 1 | 1 << 2 | 1 << 3 | 1 << 4 | 1 << 5 | 1 << 6;
	
}



Duty cycle ayarlamak için aynı fonksiyona kanal numarası ve duty değeri vererek kullanabilirsiniz.

Duty_cycle fonksiyonu
void set_pwm_duty(uint8_t kanal_no, uint32_t duty_cycle)
{
	switch(kanal_no)
	{
		case 1: 
			LPC_PWM1   -> MR1 = duty_cycle;	//PWM1 duty_cycle deðerini yükle
			break;
		
		case 2:
			LPC_PWM1   -> MR2 = duty_cycle;	//PWM1 duty_cycle deðerini yükle
			break;
		
		case 3:
			LPC_PWM1   -> MR3 = duty_cycle;	//PWM1 duty_cycle deðerini yükle
			break;
 		
		case 4:
			LPC_PWM1   -> MR4 = duty_cycle;	//PWM1 duty_cycle deðerini yükle
			break;
		
		case 5:
			LPC_PWM1   -> MR5 = duty_cycle;	//PWM1 duty_cycle deðerini yükle
			break;

		case 6:
			LPC_PWM1   -> MR6 = duty_cycle;	//PWM1 duty_cycle deðerini yükle
			break;

		default:
			break;
		
		}
	
	LPC_PWM1   -> LER = 1 << 0 | 1 << 1 | 1 << 2 | 1 << 3 | 1 << 4 | 1 << 5 | 1 << 6;
	return;
}



Örnek Kullanım Sistem frekansı(CCLK) 100MHz olsun.

//Fonksiyon prototipleri

int main(void)
{
      pwm_init(9,6250); //PCLK=CCLK/4 -----> PWMFrekansı=25MHz/(9+1)/6250= 400hz olacak


      set_pwm_duty(1, 1250);   //%20 duty cycle
      set_pwm_duty(2, 1875);   //%30 duty cycle					
      set_pwm_duty(3, 2500);   //%40 duty cycle
      set_pwm_duty(4, 3125);   //%50 duty cycle
      set_pwm_duty(5, 5000);   //%80 duty cycle
      set_pwm_duty(6, 5625);   //%90 duty cycle

}
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R