RS232 VE PİC16F877A İLE PWM ÜRETİMİ

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;
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.
 
Merhaba. Nasrettin hocanın hikayesini bilirsiniz, komşusu" hoca hiç kazan ölür mü" diye sorunca hoca: " doğduğuna inanıyorsun da öldüğüne neden inanmıyorsun" demiş. Sizinki de bu hesap;

PC'den en fazla 255 gönderebileceğinize inanıyorsunuz da , pic'ten long sayı alamadığınıza mı inanmıyorsunuz.
Sizin sıkıntı şurda; getch() 8 bit ile geri döner. [long gelen=0; gelen=getch(); gelen=gelen*10;] Bu anlamda "gelen" sabiti tutarsız görünüyor. Sayıları getch() ile almak sıkıntılı, bunun yerine PC'den göndereceğiniz sayıyı string şeklinde yollayın. Örneğin sayi="43529" gibi. Pic'ten alırken de;

char sayi[5];
int16 i;

gets(sayi); //sayi stringini bekler
i=atol(sayi); //stringi 16 bitlik sayıya dönüştürür, stdlib.h gerektirir.
printf(lcd_putc,"\f%Lu",i); // LCD de göstermek isterseniz.

Böyle basit şekilde 16 bitlik sayıları direkt gönderebilirsiniz..
 
Son düzenleme:
Merhaba. Nasrettin hocanın hikayesini bilirsiniz, komşusu" hoca hiç kazan ölür mü" diye sorunca hoca: " doğduğuna inanıyorsun da öldüğüne neden inanmıyorsun" demiş. Sizinki de bu hesap;

PC'den en fazla 255 gönderebileceğinize inanıyorsunuz da , pic'ten long sayı alamadığınıza mı inanmıyorsunuz.
Sizin sıkıntı şurda; getch() 8 bit ile geri döner. [long gelen=0; gelen=getch(); gelen=gelen*10;] Bu anlamda "gelen" sabiti tutarsız görünüyor. Sayıları getch() ile almak sıkıntılı, bunun yerine PC'den göndereceğiniz sayıyı string şeklinde yollayın. Örneğin sayi="43529" gibi. Pic'ten alırken de;

char sayi[5];
int16 i;

gets(sayi); //sayi stringini bekler
i=atol(sayi); //stringi 16 bitlik sayıya dönüştürür, stdlib.h gerektirir.
printf(lcd_putc,"\f%Lu",i); // LCD de göstermek isterseniz.

Böyle basit şekilde 16 bitlik sayıları direkt gönderebilirsiniz..


Cevabınız için teşekkürler. Gelen sabiti tutarsız derken neyi kastettiniz anlamadım. Uygulamaya sadece okulda yapabiliyorum. Uygulamayı sizi kodlarınızla yaptıktan sonra geri dönüş yapacağım.
 
sürdüğünüz motor 1 ile 2ms arası pwm ile çaışıyorsa muhtemelen bu motor rc uçak servosu. eğer öyleyse 20ms de sabit değil. toplam periodunuz 20ms olacak on time 2ms ise off time da 18ms olmalı. siz off time gecikmesini değişken yapıp ontime süresini offtimedan çıkararak verirsenz daha kararlı olur.aksi takdirde siz pwm yerine frekans modulasyonu yapmış oluyorsunuz.
 
Öncelikle PIC tarafını proteus ile simülasyonunu yapıp çalışıp çalışmadığını gör derim. Hala uğraşıyorsan ve işin içinden çıkamadı isen senin için kodlama yapabilirim
 

Forum istatistikleri

Konular
127,967
Mesajlar
913,969
Kullanıcılar
449,612
Son üye
esperran

Yeni konular

Geri
Üst