Jump to content

Muhammed Selim Erkühük

Onaylı Üye
  • İçerik sayısı

    11
  • Katılım

  • Son ziyaret

  • Days Won

    7

Muhammed Selim Erkühük kullanıcısının son zaferi 24 Kasım 2020

Muhammed Selim Erkühük en beğenilen içeriğe sahiptir

Güncel Profil Ziyaretleri

Güncel ziyaretçiler bloku aktif değil. Diğer kullanıcılar son ziyaretçilerinizi aktif edene kadar göremezler.

Muhammed Selim Erkühük's Achievements

Newbie

Newbie (1/14)

11

Topluluk Puanı

  1. Muhammed Selim Erkühük

    MODBUS CRC Fonksiyonu

    Bu kod bu şekilde derlendiğinde hata veriyordu. Kodu MODBUS'ın kendi sitesindeki dökümandan kopyalamıştım. Haklısınız, atlamışım,bu fonksiyon bu şekilde çalışmıyor. Derleyici hata veriyor. Bazı düzenlemelerin ardında çalıştırabilmiştim. Fakat doğru sonucu hesaplamıyordu. Bende daha fazla uğraşmayıp, şu linkteki MODBUS CRC kodunu kullanmıştım.Bah settiğiniz kısma gelecek olursa, ben burya düzenlenmemiş halini yüklemişim. Orjinal kodun linkini veriyorum. Bağlantısını verdiğim dökümanın sonundan kodu inceleyebilirsiniz. Kodu düzenleyip istediğim gibi çalıştıramayınca ilk bağlantıdaki açık kaynaklı CRC programını kullandım. Sorunu çözememiş olsam da etrafından dolaştım.
  2. Normal şartlar altında soru sormayı pek sevmem. Günlerden beri MODBUS'ın kendi sitesinde yayınladığı bir fonksiyon ile uğraşıyorum. Anladığım kadarı ile fonksiyon dışarıdan bir dizi ve dizinin boyutunu alarak çalışıyor. Birazcık modifiye ederek, fonksiyona tamsayı bir değer göndererek çalıştırmayı başardım.Fakat benim dizinin CRC'sini hesaplamam gerekiyor. Fonksiyonu kullanırken nerede hata yaptığımı anlamış değilim. MODBUS protokolü ile uğraştığımdan,sürekli CRC hesaplamam gerekiyor. Fonksiyonu ve fonksiyonun geçtiği dökümanı aşağı bırakıyorum.Programı bir gömülü sistemde çalıştırmam gerekiyor.Kodumun en başına fonksiyonu kullanacağımı aşağıdaki komut ile bildiriyorum. unsigned short CRC16( unsigned short puchMsg[], unsigned short usDataLen); Ardından CRC_16 fonksiyonu için dizi ve değişkenleri tanımlıyorum. uint8_t Adress=0x11; uint8_t Function_Code=0x03; uint8_t Start_Address_High_Byte= 0x00; uint8_t Start_Address_Low_Byte=0x00; uint8_t Number_Register_High_Byte= 0x00; uint8_t Number_Register_Low_Byte= 0x03; uint8_t Crc_High=0x5B; uint8_t Crc_Low=0x07; uint8_t CRC_dizi[6]={Adress,Function_Code,Start_Address_High_Byte,Start_Address_Low_Byte,Number_Register_High_Byte,Number_Register_Low_Byte}; Fonksiyonuda şu şekilde kullanıyorum. Crc_Recieve= CRC16(CRC_dizi,sizeof(CRC_dizi)); Hata ayıklama modunda baktığımda hesaplamak istediğim değerlerin fonksiyona iletilmediğini gözlemliyorum. Not:Kod bilgisayar ortamında hafıza hatası verdirtiyor.Denemeleri STM32 kartımda yapıyorum. İlgili dökümanın son sayfasından fonksiyona ulaşabilirsiniz. unsigned short CRC16 ( puchMsg, usDataLen ) /* The function returns the CRC as a unsigned short type */ unsigned char *puchMsg ; /* message to calculate CRC upon */ unsigned short usDataLen ; /* quantity of bytes in message */ { unsigned char uchCRCHi = 0xFF ; /* high byte of CRC initialized */ unsigned char uchCRCLo = 0xFF ; /* low byte of CRC initialized */ unsigned uIndex ; /* will index into CRC lookup table */ while (usDataLen--) /* pass through message buffer */ { uIndex = uchCRCLo ^ *puchMsg++ ; /* calculate the CRC */ uchCRCLo = uchCRCHi ^ auchCRCHi[uIndex] ; uchCRCHi = auchCRCLo[uIndex] ; } return (uchCRCHi << 8 | uchCRCLo) ; } static unsigned char auchCRCHi[] = { 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 } ; Low-Order Byte Table /* Table of CRC values for low–order byte */ static char auchCRCLo[] = { 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5, 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80, 0x40 };
  3. Muhammed Selim Erkühük

    4-20 MA Akım Üretme

    Tecrübem olmadı maalesef.
  4. Muhammed Selim Erkühük

    4-20 MA Akım Üretme

    Denk gelmemiştim hocam,teşekkür ederim.
  5. Muhammed Selim Erkühük

    4-20 MA Akım Üretme

    msp430g2553 entegresi bu iş için tasarlanmış SAC isimli bir birime sahip.Entegre olarakta TI'ın DAC161S997 isimli entegresi kullanılabilir.
  6. Muhammed Selim Erkühük

    4-20 MA Akım Üretme

    Şenol Hocam ve Azmi Hocam ikinize de değerli yorumlarınızdan ötürü teşekkür ediyorum.Konuyu buraya açtıktan sonra biraz daha araştırma yaptım.TI'ın 4-20 mA çıkış veren bir DAC'ını buldum.Entegre Spi üzerinden haberleşiyor. Akımı hassas bir şekilde ayarlayabiliyor.Alternatif olarak, msp430'un bir versiyonunda 4-20mA çıkış vermesi için tasarlanmış SAC isimli bir birim bulunuyor. Bu birim de bu işte kullanılabilir. Benim için en uygun olan dijital haberleşme kullanan TI'ın entegresi gibi gözüküyor. Mikrodenetleleyici olarak Stm32 serisi bir mikrodenetleyici düşünüyorum.
  7. İyi çalışmalar, Sıcaklık sensörlerinden gelen verileri ADC ile okuyup 4-20 mA çıkış veren bir sistem tasarlamam gerekiyor. Sensörleri (Termokupl,pt100,...) adc ile okuma konusunda çok sıkıntı çekeceğimi düşünmüyorum. 4-20 mA üretme devresinin girişine okunan ADC verisine göre PWM sinyali vermeyi düşünüyorum. Forumlarda gezinirken şöyle bir devreye denk geldim. Burada PWM sinyali alçak geçiren filtre yarıdımıyla düzeltilmiş. Ardından opamp gerilim izleyici olarak ayarlanıp opamp'ın girişine verilmiş.Bu devre 4-20 mA'de nasıl performans verir? Açıkçası çıkıştaki transistör ısıl değişimlerde sapma yapacak gibi geliyor.Yüksek akımlarda ufak oynamalar önemli değil ama senörler ile çalıştığım için sistemin hassas çalışması gerekiyor. Bu devreyi böyle bir iş için kullanmak doğru mu?
  8. Muhammed Selim Erkühük

    Transistör Sürme Hk.

    Gerçekten tasarım yapılırken ince eleyip sık dokumak gerekiyor hocam.
  9. Muhammed Selim Erkühük

    Transistör Sürme Hk.

    Vce gerilimi hocam.Bugün tartışmıştık burada belli parametreler kollektör gerilimini sanırım çok etkiliyor.
  10. Muhammed Selim Erkühük

    Transistör Sürme Hk.

    Bu da yük doğrusu.
  11. Transistör için bazı hesaplamalar yapıyorum.Yaptığım hesaplamalar ile simülasyon sonuçları çok yakın.Devreyi kurup denediğimde ise kollektör akımındaki bu farka anlam veremedim.Neden kollektör akımı hesaplamalarımdan bu kadar farklı?Aşığıda devreyi ve yaptığım hesapları paylaştım.
×
×
  • Yeni Oluştur...

Önemli Bilgilendirme

Facebook / Twitter / Google hesabınızla kolayca kaydolup cevap verebilir, soru sorabilir, istekte bulunabilirsiniz.
Devam etmeniz, forum kurallarını kabul ettiğiniz anlamına gelir.            Forum Kuralları