16F877 ile input pwm duty cycle ölçümü

merener

Üye
Katılım
7 Kas 2010
Mesajlar
2
Puanları
1
Yaş
37
Merhabalar arkadaşlar,
Üzerinde çalıştığım projede digital output veren MEMSIC mxd2125g model accelerometer dan aldığım outputun duty cycle high/period oranını ölçerek 2 axis accelerometerin hareketini yorumlamam gerekiyor.Hareketi yorumlayıp ona göre her hareket için berlileyeceğim bir frekansta pwm output verip onu sinüs dalgasına çevirdikten sonra dizayn ettigim 200Mhz de çalışan transmitter ile aracın üstündeki bir diger pice göndericem. Araçtaki pice gelen sinyalin frekansına göre de araç harekete geçicek. PIC16f877 kullanıcam. Fakat önceden pic ile ilgili bir deneyimim yok. Picin registerlarının istenilen sekilde ayarlanıp duty cycle oranını ölçebileceğim örnek kodlarınız veya buna yardımcı olcak kodlarınızı benimle paylaşırsanız sevinirim. Compiler olarak ccs c düşündüm high level programlama assembly e göre daha kolay oldugu için. Daha önce M68HC11 de assembly kullanarak projeler yapmıştım. Sonuca ulaşabilmem için her fikre ve tavsiyeye açığım, şimdiden fikirleriniz için teşekkür ederim.
 
Daha önce bir projede yazdığım PWM oluşturma ve analog veri okuma fonksiyonları. Umarım işine yarar.
Kullanılan compiler : Hi-tech C compiler
mikrokontrolör : pic16f877

Aşağıdaki fonksiyonlarda yazılan terimler (PR2, CCPR1L vs..) registerlar olup datasheetten bu registerların ne işe yaradığına bakarak bazı ayarları değiştirebilirsin.

aşağıdaki fonksiyonlar duty cycle'ı yüzde olarak gönderdiğin bir PWM fonksiyonu ve pindeki analog veriyi 0-5 V arasında ölçen 10 bit çözünürlükte(0 1023 arasında) değerler alan, değerini 0-5 arasında float olarak döndüren bir ADC fonksiyonudur.

Kod:
void PWM(float duty){                               // pwm fonksiyonu
	PR2=249;                                            // pwm periyodu
	CCPR1L= (int)((duty*100)/249);             // duty_cycle
	CCP1X=0; CCP1Y=0;
	T2CKPS1=0; T2CKPS0=1;
	CCP1M2=1;
	CCP1M3=1;
	TMR2ON=1;
}

Kod:
float ADC(){                                 // analog veri okuyan fonksiyon
	 float value;                           // analog veri
	 ADCON1=0x8E;
	 CHS2=0; CHS1=0; CHS0=0;
	 ADCS1=1; ADCS0=0; ADON=1;
	 DelayUs(20);
	 ADGO=1;
	 while(ADGO);
	 value=ADRESL+(ADRESH*256);	 ADON=0;
	 value= (value/1023)*5;     // 0-5 V .
	 return value;                
}
 

Forum istatistikleri

Konular
128,179
Mesajlar
915,655
Kullanıcılar
449,940
Son üye
yavuzturan

Yeni konular

Geri
Üst