Ynt: Devir Sayma Devresi

Başlatan lethekun, 22 Mart 2013, 12:31:04

lethekun

Merhabalar son sınıf elektronik mühendisliği öğrencisiyim ve bitirme ödevimi PIC ile yapacağım Devir Sayma Devresi olarak aldım.

Motorlu bir sistemde dönen cisme bir mıknatıs yerleştireceğim ve bu mıknatıs yanından geçtiğinde oluşan manyetik etkileri sezecek bir sensör kullanacağım. PIC ile burada oluşan manyetik akım pulselarını saydıracağım ve led tabelaya kaç devir yapıldığını yazdıracağım.

Bu konuyu nasıl halledebilirim?
Nereden başlayabilirim?
Ne tür bir mikroişlemci kullanmalıyım?

(Daha önce hiç pic ile çalışmadım. Hoca ilk olarak bir veya birkaç led'i yakıp söndürmemi istedi, o kadar acemiyim :) )

Önemli not: Pic'in yazılımını C ile yapacağız.

Öneri ve görüşlerinizi bekliyorum.

mesaj birleştirme:: 22 Mart 2013, 12:59:47

Konuyla ilgili internette yaptığım bir araştırmada şunu buldum:

https://320volt.com/pic16f84-ile-motor-devir-sayaci/

Sensör yerine Reed Switch kullanmış. Benim isteğimi karşılar mı? Siz hangisini önerirsiniz? Benim yapacağım projede C dili kullanılacaktı. Devre şemasını bulduktan sonra sanırım yazılım kısmı çok da zor olmasa gerek. Benim aradığım devre şeması bu mudur? Linkte aşağıda verdiği "alternatif 2" kısmında devre şemasını görebilirsiniz.

Teşekkür ederim. Görüşlerinizi bekliyorum.

ferit06

#1
Mühendis olacak kişi için bitirme ödevi olarak çok kolay bir ödev almışsın. Bu ödevi biraz süslemen gerekecek. PIC olarak üretimi sona ermiş 16F84 yerine yeni birşeyler kullanmalısın (en azından 16f628 gibi). reed röle ile yapacağın algılayıcı kontaklardaki zıplama nedeniyle sorun yaratabilir(gerçi sorunu program ile halledebilirsin). Reed röle yerine hall effect sensör kullanırsan daha iyi sonuç alırsın. Hatta  dönen kısma mıknatıs koyamayacağın durumlarda ışık ile ölçme için seçenekli yapabilirsin. İşe ilk olarak bir PIC programlama kitabı almak ile başlayabilirsin...

haydarpasamikro

#2
Hatta ileri-geri hareketin rpm(devir) değerini versin ve LCD ekranda göstersin. Bunun için enkoder kullanırsın. İleri-geri hareketin yönünü ve hızını ölçmek için. Kolay ve kullanışlı.
Mikro Dünyası.Haydarpaşa Teknik ve Endüstri Meslek Lisesi Mikrodenetleyici Atl. Şefi

lethekun

Kullanacağımız sensör, yöne nasıl duyarlı olacak? Manyetik alan değişimine bağlı bir tepki elde ediyoruz ya, o da entegre devreye iletiyor. Bu farklı hareket bilgisini nasıl algılayacak?

yusufburak

Benzer bi projem vardı bende akışkan hızı ölçüm devresi yapmıştım orda da her tur için bi hall effect sensör kullanmıştım baya kullanışlı.
CCS C ise programın devir sayma işi kolay ledlerle gösterme kısmına da bakmak lazım o konuda bişey diyemeyeceğim henüz.
Öğretici aranıyor :)

sadogan

Önce işin senaryo sunu hazırla projede neler var.
inputların neler outputların neler.
yapılmaşı gereken işleri hangi yöntem ile yapılmalı  belirle.
Devir ölçmek için (pic falan boş ver) kağıt kalem ile nasıl yaparsın
Bu projeyi yaparerken birşeyler öğrenmek gibi de bir amacın varsa kesinlikle
hazır şema kullanma tamamen kendin tasarla.

lethekun

Ne tür pic kullanacağımı neye göre belirliyorum? Eminim birçok parametre vardır bununla ilgili de, mesela;

Ne kadar bellek gerekiyor?

A/D çevirici gerekli mi?

Kaç giriş çıkışa ihtiyaç duyuyorum

vb gibi soruların cevaplarına bir an önce ulaşmam gerek. Yabancı dilim yeterince var ama yabancı kaynaklardan öğrenmek beni yavaşlatıyor yine de. 2-3 ay gibi bir sürem var :) geç mi kalmışım bilemedim. Haftanın altı günü boş vaktim var gerçi. Kendimi vermem gerekiyor.

lethekun

Tekrardan merhabalar. Bazı sorunlarım oldu projeyi gerçeklerken.
#include <pic.h>
#include <stdio.h> 
#include <stdarg.h> 
#include <string.h>
#include "lcd.h"
#include "delay.h"

 #define BUF_LEN					16
 #define TIMETICK_INTERVAL_IN_MS	50
 #define TIMETICK_FOR_SECOND		(1000/TIMETICK_INTERVAL_IN_MS)

unsigned int sPulseCount=0;
unsigned int sTotalPulseCount=0;
unsigned int sTimeTickCount=0;
unsigned int sSecCount=0;
unsigned int sRPMsec=0;
unsigned int sRPSOrt=0;
char caTemp[BUF_LEN]=0;
unsigned char bIndex=0;


unsigned char flag=0;


unsigned char tmr0degeri=60;


void RB0_int_prepare(void);
void TIM_int_prepare(void);

static void interrupt Overflow_interrupt(void)
{
	if(T0IF)
	{
		sTimeTickCount++;
		if(sTimeTickCount==TIMETICK_FOR_SECOND)
		{
		sSecCount++;
		flag=1;
		sRPSOrt = (((sRPSOrt*(sSecCount-1))+sPulseCount)/sSecCount);
		
		sTimeTickCount=0;
		}
		
		RC0^=1;
	 	T0IF=0;
	 	TMR0=tmr0degeri;
	}
	else if(INTF)
	{
		sPulseCount++;
		sTotalPulseCount++;
		INTF=0;
	}

}

void main(void)
{
 TRISB=0x01;
 PORTB=0x00;
 TRISD=0x00;
 PORTD=0x00;
 RB0_int_prepare();
 TIM_int_prepare();
 
 TMR0=tmr0degeri;
	lcd_init();
	while(1){
			if(flag)
			{
				flag=0;
				//lcd_goto(0x01);
	
				for(bIndex=0;bIndex<BUF_LEN;bIndex++)
					caTemp[bIndex]=0;
				sprintf(caTemp,"RPS:%d",sRPSOrt+1);
				//lcd_putch(sPulseCount+0x30);
				lcd_clear();
				lcd_goto(0x00);
				lcd_puts(caTemp);

				for(bIndex=0;bIndex<BUF_LEN;bIndex++)
					caTemp[bIndex]=0;
				sprintf(caTemp,"REV:%d",sTotalPulseCount);
				sPulseCount=0;
				//lcd_putch(sPulseCount+0x30);
				//lcd_clear();
				lcd_goto(0x40);
				lcd_puts(caTemp);
				
			}
			}

}

void TIM_int_prepare(void)
{
 T0IE=1;//enables timer overflow interrupt
 T0CS = 0; // use the same clock with the microcontroller
 PSA = 0; // associate the frequecy divider with the timer0
 PS0=1;//these three bits->
 PS1=1;//->divides the frequency
 PS2=1;//to 2.
}

void RB0_int_prepare(void)
{
	INTEDG = 0;	  // Sensing the falling edge (1 for rising) OPTION<6>
	INTE = 1;	  // Enable external interrupt (RB0/INT)  INTCON<4>
	GIE = 1;     // Enable all interrupts INTCON<7>
}


kodu bu şekilde C dilinde yazdık MPLAB kullanarak. Devre şemasını da şöyle çıkardım:


Sorum şu olacak:

Henüz sensörü RB0'a takmamışken 5Vluk gerilimi uyguladığım zaman LCD'nin üst satırı karardı sadece. Lcd ayarlarında herhangi bir eksiklik mi var? Yoksa sensörü takıp kesme mekanizmasını başlatmadan Lcd'de bir sonuç alamaz mıyım? Bir arkadaş alman gerekir dedi. Örneğin ilk satırda "RPS: %d" gibi bir kısım var. Henüz o %d olan sayı oluşmamış olsa bile RPS yazmasını beklememiz doğru olmaz mıydı?

JKramer

Doğru olabilir ama bu tip durumlarda her şeyi bir anda yapmak yerine kademeli olarak gitmekte fayda var. Kodu tamamen temizleyip sadece lcd'de sabit bir yazı yazacak hale getirin, başka bir şey (devir sayma, vs.) yapılmasın yani.

Kullandığınız lcd'nin kontrolcüsüne göre lcd kütüphanesini kontrol edebilirsiniz; belki init bölümünde farklılık vardır.

Mr.Java

Ayrıca sprintf neden kullanıyorsunuz aşırı derecede yer kaplıyor.2dk kendi lcd kütüphanenizi yazın derim hem daha kullanışlı olur proje içinde sağlıklı olur kanımca.