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.
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.
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.