EmteR
Üye
- Katılım
- 6 Ağu 2012
- Mesajlar
- 21
- Puanları
- 1
Bitirme projemizde fırçasız da motorunu esc yardımıyla sürmemiz gerekiyor. Motor hız kontrolü pwm sinyali ile sağlanmaktadır. Biz bu pwm sinyalini bilgisayar yazılımı ile kontrol etmek istiyoruz ama bazı sorunlarla karşılaşmaktayız.
Öncelikle istediğimi pwm sinyalinin özelliği şu şekilde;
1ms ile 2 ms arasında lojik 1 ve ardından gelen 20ms lik lojik sıfırdan oluşmakta. Yanı lojik 0 olan kısım sabit değişmiyor. lojik 1 olan kısmı ise biz pcden gelen veriye göre 1ms ile 2 ms arasında değiştirmekteyiz.
______
|,,,,,,,|
|,,,,,,,|
|,,,,,,,|_____________
<-t1-><-------t2---->
t1 1ms ile 2 ms arasında değişiyor. t2 her zaman 20 ms.
Sanırım istediğimiz pwm sinyalini anlatabildim. Gelelim yazdığımız CCS C koduna;
Aşağıda da c# ile seri data gönderme fonsiyonumuz bulunmakta;
Şimdi biz c# ile hazırladığımız arayüzde 0 ile 200 arasında byte türünde değerler gönderiyoruz. Ve 16f877A ya giden veri kesme içerisinde 10 ile çarpılarak 0 ile 2000 arasında değer alıyor. (pic içerisinde 10 ile çarpamızın sebebi, pcden byte türünde değer gönderdiğimiz için en fazla 255 gönderebiliyor olmamız.). 0-2000 arasındaki bu değer de bizim lojik 1 durumundaki gecikmemizi ayarlamış oluyor. Fakat bu kod çalışmıyor. Gürültülü bir sinyal görüyoruz pin d0 ucunda. Bunun sebebini bir türlü çözemedik. Dikkatimizden kaçan ya da yanlış yaptığımız yerleri sizler görürsünüz diye bu konuyu açma gereği duydum. Yardımlarınız için şimdiden teşekkürler.
Çalışmalarınızda başarılar dilerim, iyi akşamlar.
Öncelikle istediğimi pwm sinyalinin özelliği şu şekilde;
1ms ile 2 ms arasında lojik 1 ve ardından gelen 20ms lik lojik sıfırdan oluşmakta. Yanı lojik 0 olan kısım sabit değişmiyor. lojik 1 olan kısmı ise biz pcden gelen veriye göre 1ms ile 2 ms arasında değiştirmekteyiz.
______
|,,,,,,,|
|,,,,,,,|
|,,,,,,,|_____________
<-t1-><-------t2---->
t1 1ms ile 2 ms arasında değişiyor. t2 her zaman 20 ms.
Sanırım istediğimiz pwm sinyalini anlatabildim. Gelelim yazdığımız CCS C koduna;
Kod:
#include "C:\Users\Ali Ensar TERZİ\Documents\CCS C WORKSPACE\rs232 denemesi\main.h"
#use rs232(baud=9600, xmit=PIN_c6, rcv=pin_c7,uart1)
long gelen=0; //kesme ile gelen data
set_tris_d(0x00);
enable_interrupts(GLOBAL);
while(1)
{
enable_interrupts(INT_RDA);
output_high(pin_d0);
delay_us(gelen);
output_low(pin_d0);
delay_ms(20);
}
#INT_RDA
void seri_data_geldi()
{
disable_interrupts(INT_RDA);
gelen=getch();
gelen=gelen*10;
}
Aşağıda da c# ile seri data gönderme fonsiyonumuz bulunmakta;
Kod:
public void send(byte data)
{
if (serialPort1.IsOpen)
{
byte[] buffer = { 0 };
buffer[0] = data;
serialPort1.Write(buffer, 0, 1);
}
else
{
MessageBox.Show("Port açık değil", "Hata!");
}
}
Şimdi biz c# ile hazırladığımız arayüzde 0 ile 200 arasında byte türünde değerler gönderiyoruz. Ve 16f877A ya giden veri kesme içerisinde 10 ile çarpılarak 0 ile 2000 arasında değer alıyor. (pic içerisinde 10 ile çarpamızın sebebi, pcden byte türünde değer gönderdiğimiz için en fazla 255 gönderebiliyor olmamız.). 0-2000 arasındaki bu değer de bizim lojik 1 durumundaki gecikmemizi ayarlamış oluyor. Fakat bu kod çalışmıyor. Gürültülü bir sinyal görüyoruz pin d0 ucunda. Bunun sebebini bir türlü çözemedik. Dikkatimizden kaçan ya da yanlış yaptığımız yerleri sizler görürsünüz diye bu konuyu açma gereği duydum. Yardımlarınız için şimdiden teşekkürler.
Çalışmalarınızda başarılar dilerim, iyi akşamlar.