fork download
  1. #include <xc.h>
  2.  
  3. // Konfigürasyon bitleri (derleyiciye göre ayarlanabilir)
  4. #pragma config FOSC = HS // Yüksek hızlı osilatör
  5. #pragma config WDT = OFF // Watchdog Timer devre dışı
  6. #pragma config LVP = OFF // Düşük Voltajlı Programlama devre dışı
  7.  
  8. // ADC ve Kontaktör Çıkış Pin Tanımlamaları
  9. #define ADC_CURRENT_CHANNEL 0 // Akım kanalı (AN0)
  10. #define ADC_VOLTAGE_CHANNEL 1 // Gerilim kanalı (AN1)
  11. #define NUM_STEPS 16 // 16 adım
  12. int contactor_pins[NUM_STEPS] = {PORTBbits.RB0, PORTBbits.RB1, ..., PORTBbits.RB15}; // Örnek tanım
  13.  
  14. void ADC_Init() {
  15. // ADC yapılandırması
  16. ADCON1 = 0x0E; // AN0 ve AN1 analog giriş
  17. ADCON2 = 0xA9; // ADC hız ve yapılandırma
  18. ADCON0bits.ADON = 1; // ADC modülünü aktif et
  19. }
  20.  
  21. unsigned int ADC_Read(unsigned char channel) {
  22. ADCON0 &= 0xC5; // Kanalı temizle
  23. ADCON0 |= (channel << 3); // Seçilen kanalı ayarla
  24. __delay_us(30); // ADC örnekleme süresi
  25. ADCON0bits.GO_nDONE = 1; // ADC dönüştürmeyi başlat
  26. while (ADCON0bits.GO_nDONE); // Dönüşüm bitene kadar bekle
  27. return ((ADRESH << 8) + ADRESL); // 10-bit ADC sonucu
  28. }
  29.  
  30. void Contactor_Control(int step) {
  31. for (int i = 0; i < NUM_STEPS; i++) {
  32. if (i == step) {
  33. contactor_pins[i] = 1; // Kontaktörü çek
  34. } else {
  35. contactor_pins[i] = 0; // Kontaktörü bırak
  36. }
  37. }
  38. }
  39.  
  40. void main() {
  41. ADC_Init(); // ADC başlat
  42. while (1) {
  43. unsigned int current = ADC_Read(ADC_CURRENT_CHANNEL);
  44. unsigned int voltage = ADC_Read(ADC_VOLTAGE_CHANNEL);
  45.  
  46. // Güç faktörü hesaplamasını buraya ekle
  47. // Örnek: float powerFactor = calculatePowerFactor(current, voltage);
  48.  
  49. // Kontrol algoritmasını çağır
  50. // int step = determineStep(powerFactor);
  51. // Contactor_Control(step);
  52. }
  53. }
  54.  
Success #stdin #stdout 0.02s 25708KB
stdin
Standard input is empty
stdout
#include <xc.h>

// Konfigürasyon bitleri (derleyiciye göre ayarlanabilir)
#pragma config FOSC = HS  // Yüksek hızlı osilatör
#pragma config WDT = OFF  // Watchdog Timer devre dışı
#pragma config LVP = OFF  // Düşük Voltajlı Programlama devre dışı

// ADC ve Kontaktör Çıkış Pin Tanımlamaları
#define ADC_CURRENT_CHANNEL 0  // Akım kanalı (AN0)
#define ADC_VOLTAGE_CHANNEL 1  // Gerilim kanalı (AN1)
#define NUM_STEPS 16           // 16 adım
int contactor_pins[NUM_STEPS] = {PORTBbits.RB0, PORTBbits.RB1, ..., PORTBbits.RB15}; // Örnek tanım

void ADC_Init() {
    // ADC yapılandırması
    ADCON1 = 0x0E; // AN0 ve AN1 analog giriş
    ADCON2 = 0xA9; // ADC hız ve yapılandırma
    ADCON0bits.ADON = 1; // ADC modülünü aktif et
}

unsigned int ADC_Read(unsigned char channel) {
    ADCON0 &= 0xC5;             // Kanalı temizle
    ADCON0 |= (channel << 3);   // Seçilen kanalı ayarla
    __delay_us(30);             // ADC örnekleme süresi
    ADCON0bits.GO_nDONE = 1;    // ADC dönüştürmeyi başlat
    while (ADCON0bits.GO_nDONE); // Dönüşüm bitene kadar bekle
    return ((ADRESH << 8) + ADRESL); // 10-bit ADC sonucu
}

void Contactor_Control(int step) {
    for (int i = 0; i < NUM_STEPS; i++) {
        if (i == step) {
            contactor_pins[i] = 1; // Kontaktörü çek
        } else {
            contactor_pins[i] = 0; // Kontaktörü bırak
        }
    }
}

void main() {
    ADC_Init(); // ADC başlat
    while (1) {
        unsigned int current = ADC_Read(ADC_CURRENT_CHANNEL);
        unsigned int voltage = ADC_Read(ADC_VOLTAGE_CHANNEL);

        // Güç faktörü hesaplamasını buraya ekle
        // Örnek: float powerFactor = calculatePowerFactor(current, voltage);

        // Kontrol algoritmasını çağır
        // int step = determineStep(powerFactor);
        // Contactor_Control(step);
    }
}