LPC1768 PWM Uygulaması

Başlatan yamak, 20 Haziran 2011, 16:30:08

yamak

Arkadaş bir iki gündür lpc1768 in pwm ini öğrenmeye çalışıyodum. Küçük bir uygulama yaptım. ARM öğrenmek isteyen arkadaşlara yardımcı olur umarım. Kodlar ve video aşağıdadır.
main.c
#include <lpc17xx.h>
#include "yusuf_lpc17xx_delay.h"
int i=10,j=1;
int k,m=1;;
void pll_init(void)
{
	LPC_SC->SCS=0x20;
	LPC_SC->CLKSRCSEL=0x01;
	LPC_SC->CCLKCFG=0x02;
	LPC_SC->PLL0CON=0x01;
	LPC_SC->PLL0CFG=0xb;
	LPC_SC->PLL0FEED=0xAA;
    LPC_SC->PLL0FEED=0x55;
	while(!(LPC_SC->PLL0STAT&(1<<26)));
	LPC_SC->PLL0CON=0x07;
	LPC_SC->PLL0FEED=0xAA;
    LPC_SC->PLL0FEED=0x55;
	LPC_SC->PCLKSEL0=0;
}
void pwm_init(void)
{
	LPC_PINCON->PINSEL4=1<<0|1<<2|1<<4|1<<6|1<<8|1<<10;
	LPC_PWM1->MCR=2;
	LPC_PWM1->MR0=1000;
	LPC_PWM1->MR1=0;
	LPC_PWM1->MR2=0;
	LPC_PWM1->MR3=0;
	LPC_PWM1->MR4=0;
	LPC_PWM1->MR5=0;
	LPC_PWM1->MR6=0;
	LPC_PWM1->TCR=2;
	LPC_PWM1->PCR=1<<9|1<<10|1<<11|1<<12|1<<13|1<<14;
	LPC_PWM1->LER=3;
	LPC_PWM1->TCR=9;
}
void karasimsek(void)
{
if(k==0)
	 {	 
     LPC_PWM1->MR1=i;
	 LPC_PWM1->LER=2;
	 }
	 if(k==1)
	 {	 
     LPC_PWM1->MR2=i;
	 LPC_PWM1->LER=4;
	 }
	 if(k==2)
	 {	 
     LPC_PWM1->MR3=i;
	 LPC_PWM1->LER=8;
	 }
	 if(k==3)
	 {	 
     LPC_PWM1->MR4=i;
	 LPC_PWM1->LER=16;
	 }
	 if(k==4)
	 {	 
     LPC_PWM1->MR5=i;
	 LPC_PWM1->LER=32;
	 }
	 if(k==5)
	 {	 
     LPC_PWM1->MR6=i;
	 LPC_PWM1->LER=64;
	 }
	
}
int main(void)
{
   
   SystemInit();
   LPC_GPIO2->FIODIR=192;
   LPC_GPIO2->FIOCLR=192;
   pll_init();
   pwm_init();
   while(1)
   {
   	 for(k=0;k<6;k++)
	 {
	 LPC_PWM1->MR1=0;
	 LPC_PWM1->MR2=0;
	 LPC_PWM1->MR3=0;
	 LPC_PWM1->MR4=0;
	 LPC_PWM1->MR5=0;
	 LPC_PWM1->MR6=0;
	 for(;;)
	 {
	 karasimsek();
	 i=i+1;
	 DelayMs(0,1);
	 if(i>995)
	 {
	 for(;;)
	 {
	 karasimsek();
	 i=i-1;
	 DelayMs(0,1);
	 if(i==0)
	 {
	 m=0;
	 break;
	 }
	 }
	 if(m==0)
	 {
	  m=1;
	  DelayMs(0,750);
	  break;
	 }
	 }
     }
	 }
   }
  }

Delay.c
#include "lpc17xx.h"
#include "yusuf_lpc17xx_delay.h"
void DelayMs(int timer_num,int bekle)
{
     if(timer_num==0)
     {
	 				
                     LPC_TIM0->TCR=0x02;//reset timer
                     LPC_TIM0->IR=0xFF;//tüm kesmeleri restle
                     LPC_TIM0->MR0=bekle*24000;
                     LPC_TIM0->MCR=0x04;
                     LPC_TIM0->TCR=0x01;//start timer
					 LPC_TIM0->PR=0x00;//prescalar deger.Örnegin 2 oldugun her 3 tick de bir sayar.
                     while(LPC_TIM0->TCR&0x01);//tasana kadar bekle
     }
     if(timer_num==1)
     {
                     LPC_TIM1->TCR=0x02;
                     LPC_TIM1->IR=0xFF;
                     LPC_TIM1->MR0=bekle*24000;
                     LPC_TIM1->MCR=0x04;
                     LPC_TIM1->TCR=0x01;
                     while(LPC_TIM1->TCR&0x01);
     }
     return;
}
void DelayUs(int timer_num,int bekle)
{
     if(timer_num==0)
     {
                     LPC_TIM0->TCR=0x02;
                     LPC_TIM0->IR=0xFF;
                     LPC_TIM0->MR0=bekle*24;
                     LPC_TIM0->MCR=0x04;
                     LPC_TIM0->TCR=0x01;
                     while(LPC_TIM0->TCR&0x01);
     }
     if(timer_num==1)
     {
                     LPC_TIM1->TCR=0x02;
                     LPC_TIM1->IR=0xFF;
                     LPC_TIM1->MR0=bekle*24;
                     LPC_TIM1->MCR=0x04;
                     LPC_TIM1->TCR=0x01;
                     while(LPC_TIM1->TCR&0x01);
     }
     return;
} 
   


Erhan YILMAZ

Elinize sağlık.Hocam kullandığınız kitin fiyatı nedir, nereden aldınız v.s. bilgilendirir misiniz?

yamak

Ebay den bi çin firmasindan aldim ben aldigimda 110 dolar civarindaydi fakat simdi 90 $ civarina dustuler

XX_CİHAN_XX

Alıntı yapılan: yamak - 21 Haziran 2011, 09:02:25
Ebay den bi çin firmasindan aldim ben aldigimda 110 dolar civarindaydi fakat simdi 90 $ civarina dustuler
Setteki ekran dokunmatik özellikli mi?
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

Veli B.

Alıntı yapılan: XX_CİHAN_XX - 21 Haziran 2011, 21:34:27
Alıntı yapılan: yamak - 21 Haziran 2011, 09:02:25
Ebay den bi çin firmasindan aldim ben aldigimda 110 dolar civarindaydi fakat simdi 90 $ civarina dustuler
Setteki ekran dokunmatik özellikli mi?

Ürün linki...
Farklı üreticilerinde benzer ürünleri var.
http://cgi.ebay.ph/NXP-ARM-LPC1768-DevBoard-Cortex-M3-3-2-touchscreen-LCD-/320602987762

emrah

mrb,
arkadaslar arm işlemcıler konusunda pek bir bilgim yok ama merak ettigm bikaç şey var,

yukarda iki ayrı program görülmekte, main.c  ve   delay.c    videodaki çalısan program ikisinden birimi yoksa her iki programda dahilmi? nasıl oluyor ?   programları keil de derledigin zaman ikiside yükleniyorsa,  derledigin kodlar işlmeciye nasıl yükleniyor?

yamak

Delay.c main.c de tanimlanan delay.h kutuphanesin fonksiyonlarinin bulundugu dosya.o kutuphane araciligiyla  DelayMs fonksiyonunu kullanabiliyorum

yamak

Alıntı YapSetteki ekran dokunmatik özellikli mi?
Normalde dokunmatik özellikli diye aldım ama daha kullanma şansım olmadı.

XX_CİHAN_XX

Programınızda
   SystemInit();

Fonksiyonunun içeriği yok. Birde derlediğimde

main.c(136): warning:  #1-D: last line of file ends without a newline

Şeklinde bir uyarı alıyorum.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

yamak

O uyarinin pek bir önemi yok. zaten 2. kez derlendiğinde o uyarı gidiyor. SystemInit(); fonksiyonunu kullanmasınız da olur. Alışkanlıktan dolayı yazdım silinebilir yani. Pll ayarlarını zaten kendimiz yapıyoruz.Eğer pll_init fonksiyonu kullanılmayıp SystemInit(); kullanılırsa pll işlemci 100mhz de çalışacak şekilde ayarlanıyo.

z

Alıntı Yapmain.c(136): warning:  #1-D: last line of file ends without a newline

Son satırda } sonrasını enterle asagıya itersen uyarıyı almazsın.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

XX_CİHAN_XX

#11
@yamak,
Elindeki board için hazırlanmış LCD_BLINKY isimli bir kütüphane vardı. Onu hiç denedin mi?
Birde elinde bu board için hazırlanmış başka LCD ile ilgili kaynak kodlar varsa paylaşırmısın?
Bu arada LCD_BLINKY elinde yoksa paylaşabilirim.


EDİT:

Keilin içinde MCB1700 için kaynak kodların bilgisayarıma yüklendiğini farkettim. :)
Fakat oradaki LCD_BLINKY kodunu boarda yüklediğimde ise bendeki çakma Boardun orjinalle uyuşmadığını anlayarak büyük bir hayal kırıklığı yaşamış oldum :(
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

mistek

void pll_init(void)
{
    LPC_SC->SCS=0x20;
    LPC_SC->CLKSRCSEL=0x01;
    LPC_SC->CCLKCFG=0x02;
    LPC_SC->PLL0CON=0x01;
    LPC_SC->PLL0CFG=0xb;
    LPC_SC->PLL0FEED=0xAA;
    LPC_SC->PLL0FEED=0x55;
    while(!(LPC_SC->PLL0STAT&(1<<26)));
    LPC_SC->PLL0CON=0x07;
    LPC_SC->PLL0FEED=0xAA;
    LPC_SC->PLL0FEED=0x55;
    LPC_SC->PCLKSEL0=0;
}

Buradaki pll değerlerinin nasıl hesaplandığını merak ediyorum yardımcı olurmusunuz?
Mesela datasheette MSEL0=(Fcco*N)/(2*Fin) deniyor şimdi N=1 M=13 Fin=12Mhz buradaki değerleri yerine koyarsak Fcco=(2*12mhz*13)/1 = 312Mhz yapıyor. Burada işlemciyi kaç Mhz ile çalıştırmış oluyorum? birde CCLKCFG tam olarak ne işe yarıyor? Fcco/CCLKCFG+1 = PLL frekansımı oluyor?
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

mistek

@gerbay çok teşekkür ederim.
Lpc1769 da anladığım kadarıyla 6 tane normal PWM kanalı,  A ve B olmak üzerede 2 blok halinde 3 pin motor kontrol pwm birimi var yanılıyor muyum?(ingilizcem pek iyi olmadığı için ancak bu kadar oluyor)

Ben motor kontrol pwm biriminden 4 bağımsız duty cycle almak istiyorum böyle bişey mümkün müdür acaba? yoksa sadece en fazla üç tane mi bağımsız çıkış alabilirim?
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R