3 Adımda PP504F1A-02W40 ile İletişim

3 Adımda PP504F1A-02W40 ile İletişim

PP504F1A-02W40, Pwm Çekirdeği ailesinin yeni üyesidir. Aynı ailenin diğer üyesi olan PP504F0A-02W30’a göre daha fonksiyonel bir mimari ile karşımıza çıkmaktadır.

Pwm Çekirdeği ailesi ile iletişim kurmak oldukça kolaydır. Standart UART protokolünü kullanarak ve aşağıdaki 3 adımı uygulayarak rahatlıkla arduino ile iletişim kurabiliriz.  

Detaylı iletişim bilgisi için ürüne ait teknik dokümanı inceleyin.

1- Aşağıdaki örnek kodu arduino’ya yükleyin. Kodlamalara ürün teknik dokümanından da ulaşabilirsiniz.

//PP504F1A-02W40

#define Rx_Ready 10 //Any Input Pin
#include <SoftwareSerial.h>
SoftwareSerial _mySerial(10, 11);// RX, TX
uint8_t baslat= 0;

//----------SYNC--------------------
//SYNC -> 1 : 3 Phase SYNC PWM | SYNC -> 0 : 3 Standard ASYNC PWM
uint16_t cong_SYNC_[2]= {0, 0};
//----------Baud Rate--------------------
//Baud Rate: 4 -> 9600 | 3 -> 19200 | 2 -> 57600 | 1 -> 115200 
uint16_t cong_Baud_[2]= {4, 0};
//----------Period Calibration--------------------
//Calibration For 250 msec - 120 sec
uint16_t cong_Tune_[2]= {5, 0}; // Default Value: {5, 0} 
//-----------Period Type--------------------------
// S: Seconds | M: Milliseconds | U: Microseconds 
uint8_t channel_1_SMU_= 'M';
uint8_t channel_2_SMU_= 'M';
uint8_t channel_3_SMU_= 'M'; 
uint8_t channel_4_SMU_= 'M'; 
//------------Period------------------------------
//{Integer Part, Floating Part} Exp: {245,75} => if _config == 'U' than Period = 245.75 microseconds
uint16_t channel_1_period_[2]= {20, 0};
uint16_t channel_2_period_[2]= {20, 0};
uint16_t channel_3_period_[2]= {20, 0};
uint16_t channel_4_period_[2]= {20, 0};
//-------------Phase------------------------------
uint16_t channel_1_phase_[2]= {0, 0};
uint16_t channel_2_phase_[2]= {90, 0};
uint16_t channel_3_phase_[2]= {180, 0};
uint16_t channel_4_phase_[2]= {270, 0};
//-----------Duty Cycle---------------------------
uint16_t channel_1_duty_[2]= {47, 50};
uint16_t channel_2_duty_[2]= {47, 50};
uint16_t channel_3_duty_[2]= {47, 50};
uint16_t channel_4_duty_[2]= {47, 50};



void setup() {
Serial.begin(9600); while (!Serial) {;}
_mySerial.begin(9600); // Set Baud Rate
pinMode(Rx_Ready, INPUT_PULLUP); // Set Rx_Ready to input & Turn on pull-up resistors

//send_configuration(1, 'Y', cong_SYNC_, '>');
//send_configuration(1, 'B', cong_Baud_, '>');
//send_configuration(1, 'C', cong_Tune_, '>');
send_configuration(1, channel_1_SMU_, channel_1_period_, '<');
send_configuration(2, channel_2_SMU_, channel_2_period_, '*');
send_configuration(3, channel_3_SMU_, channel_3_period_, '*');
send_configuration(4, channel_4_SMU_, channel_4_period_, '*');
send_configuration(1, 'P', channel_1_phase_, '*');
send_configuration(2, 'P', channel_2_phase_, '*');
send_configuration(3, 'P', channel_3_phase_, '*');
send_configuration(4, 'P', channel_4_phase_, '*');
send_configuration(1, 'D', channel_1_duty_, '*');
send_configuration(2, 'D', channel_2_duty_, '*');
send_configuration(3, 'D', channel_3_duty_, '*');
send_configuration(4, 'D', channel_4_duty_, '>');

}void loop() {
  /*
  //-------------------*ASYNC*------------------------------
    //0.1% Duty each Cycle
  if((channel_1_duty_[1]+=10) >=90) {channel_1_duty_[1] = 0;
    if(channel_1_duty_[0]++ >=99) channel_1_duty_[0] = 0;
  }
  send_configuration(1, 'D', channel_1_duty_, '*');
  send_configuration(2, 'D', channel_1_duty_, '*');
  send_configuration(3, 'D', channel_1_duty_, '*');
  send_configuration(4, 'D', channel_1_duty_, '*');

  //10 micro seconds each cycle.
  if(channel_1_SMU_== 'U'){
  if((channel_1_period_[0]+=10) >=2000 && channel_1_SMU_== 'U') {channel_1_period_[0] = 2;channel_1_SMU_= 'M';}}
  
  if(channel_1_SMU_== 'M'){
    if(channel_1_period_[1]++ >=99) {channel_1_period_[1] = 0; 
      if(channel_1_period_[0]++ >=9 ) {channel_1_period_[0] = 500;channel_1_SMU_= 'U';}}
  }
  send_configuration(1, channel_1_SMU_, channel_1_period_, '*');
  send_configuration(2, channel_1_SMU_, channel_1_period_, '*');
  send_configuration(3, channel_1_SMU_, channel_1_period_, '*');
  send_configuration(4, channel_1_SMU_, channel_1_period_, '*');*/

  if (Serial.available()) {int a = Serial.read();_mySerial.write(a);Serial.write(a);}
  }

void send_configuration (uint8_t _ch, uint8_t _conf, uint16_t* _value, uint8_t _end){
char _buffer[12]; // Buffer
sprintf(_buffer, "%d%c%d.%02d%c\n\r",_ch,_conf,_value[0],_value[1],_end); // Prepare the buffer Note: \n\r is not necessary
while(!digitalRead(Rx_Ready)); delayMicroseconds(50); // Wait for the Pwm-Core to be ready
_mySerial.write(_buffer); // Send buffer to Pwm-Core
Serial.write(_buffer);
}

//End of CODE

Yukarıdaki örnek arduino kodlamasının amacı, Arduino’nun her yeniden başlatıldığında (Reset durumu gibi) Uart haberleşmesi görevi verilen (Kodlamaya göre Rx – Arduino pin 10 ve Tx – Arduino pin 11) portlarının yukarıda “Outputs” olarak gösterilen kutu içerisindeki çıktıları vermesidir.

1C5.50* -> Tüm kanallarda 120 saniye ve 250 milisaniye düşük frekans periyot aralığı kalibrasyon katsayısını 5.50 olarak ayarlar (Varsayılan: 5.00)
4Hz-500KHz periyot bandı için geçerli değildir.
1U500.05* -> 1. Kanalın periyot değerini 500.05 mikro saniye olarak kaydeder.
2U100.00* -> 2. Kanalın periyot değerini 100.00 mikro saniye olarak kaydeder.
3U15.38* -> 3. Kanalın periyot değerini 15.38 mikro saniye olarak kaydeder.
4U5.00* -> 4. Kanalın periyot değerini 5.00 mikro saniye olarak kaydeder.

Bu noktada, U değerinin mikro saniye olarak okur. Saniye değeri girmek için U yerine S veya milisaniye girmek için U yerine M kullanabilirsiniz.

1P0.00* -> 1. Kanalın faz açısı değerini 0.00 derece olarak kaydeder.
2P90.00* -> 2. Kanalın faz açısı değerini 90.00 derece olarak kaydeder.
3P180.00* -> 3. Kanalın faz açısı değerini 180.00 derece olarak kaydeder.
4P270.00* -> 4. Kanalın faz açısı değerini 270.00 derece olarak kaydeder.
1D25.00* -> 1. Kanalın görev süresi (Duty Cycle) değerini %25.00 olarak kaydeder.
2D25.00* -> 2. Kanalın görev süresi (Duty Cycle) değerini %25.00 olarak kaydeder.
3D50.00* -> 3. Kanalın görev süresi (Duty Cycle) değerini %50.00 olarak kaydeder.
4D50.00* -> 4. Kanalın görev süresi (Duty Cycle) değerini %50.00 olarak kaydeder.

PWM Core ürünlerinin tek ihtiyacı olan bu bilgilerden sizin ihtiyacınız kadar olanıdır.
Tek bir kanala ait tek bir parametreyi yükleyerek de iletişimi sonlandırabilirsiniz.
Yani bu örnekteki gibi her kanala ait tüm parametre bilgilerini bir anda yüklemenize gerek yoktur.

 

2- Bağlantıyı aşağıdaki gibi gerçekleştirin.

3- Arduinonun “Reset” tuşuna basın. İşte bu kadar! :) 

 

Hatırlatmalar:

  • Pwm Core’a yeni pwm konfigürasyonu yüklemeniz için diğer bağlantılarını sökmenize gerek yoktur.
  • Pwm Core ürünlerinin tek ihtiyacı olan “Outputs” olarak gösterilen kutu içerisindeki bilgilerden sizin ihtiyacınız kadar olanıdır. Tek bir kanala ait tek bir parametreyi yükleyerek de iletişimi sonlandırabilirsiniz. Yani örnek kodlamadaki gibi her kanala ait tüm parametre bilgilerini bir anda yüklemenize gerek yoktur.
  • Pwm Core ürünlerinin yüklenen konfigürasyonu hafızasında tuttuğunu unutmayın. Yani her yeniden başlatıldığında en son yüklediğiniz konfigürasyonu otomatik olarak yükleyecektir.
  • Örnek kodlamadaki çıktıların neyi ifade ettiğine ürüne ait teknik dokümanın “İletişim Kuralları” konu başlığında örneklerle birlikte detaylıca yer verilmiştir.