Announcement

Collapse
No announcement yet.

Signal synthesis for simple PI detector

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • ivconic
    replied
    This is the supporting circuit, explaining the code:

    Click image for larger version

Name:	Barracudaavr.JPG
Views:	1
Size:	347.5 KB
ID:	352783

    Leave a comment:


  • ivconic
    started a topic Signal synthesis for simple PI detector

    Signal synthesis for simple PI detector

    This is one of my early attempts, more like educational example.
    Code is based on previous Joop's work.
    I just made adaptation for Barracuda PI metal detector.
    I will use this occasion too; to place big THANKS and tribute to previous Joop's work!
    Code is pretty much self explanatory. Also Joop added essential comments in it.
    I think there is no need me to add anything above.


    Code:
    #include <Wire.h> 
    #include <LiquidCrystal_I2C.h>
    #include <LCDBitmap.h>
    LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
    LCDBitmap bitmap(&lcd, 12, 0);
    
    #define DIGITAL_OUT PORTB
    #define TX_PIN_A 5       // 13     
    #define SAMPLE_PIN_B 4   // 12 
    #define SAMPLE_PIN_C 3   // 11
    
    unsigned int Sample1Delay = 65295;
    static int value;
    static int Mikrosekunde;
    
    void setup ()
    {
    Init (); 
    InitTimer2 ();
    InitTimer1 ();
    TCNT2 = 200; 
    //*********************
    Serial.begin(1200);
     lcd.begin(16,2);
     lcd.clear ();
     lcd.setCursor(2, 0);
     lcd.print("BARRACUDA");
     //**************************************************
     bitmap.begin();  
     bitmap.home();
     for (byte x=0; x<=4; x++) 
      {
        bitmap.line(x, BITMAP_H-1, x+BITMAP_H-1, 0, ON, NO_UPDATE);  
        bitmap.line(x, 0, x+BITMAP_H-1, BITMAP_H-1, ON, NO_UPDATE);  
      }
      bitmap.update();  
    }
    void VoidDelay (unsigned int n)
    {
    n += 12; 
    TCNT1 = n; 
    bitSet (TIFR1, TOV1);
    while (!(TIFR1 & (1<<TOV1))) {;} 
    }
    void loop ()
    {
          lcd.setCursor(0, 1);
          lcd.print("D=");
          lcd.print(Mikrosekunde);
          lcd.print("uS ");
          delay(50);
    }
    void InitTimer1 (void)
    {
    TCCR1A = 0;
    TCCR1B = 0;
    bitClear (TIMSK1, TOIE1); 
    TCNT1 = 0; 
    TCCR1B = 0x01; 
    }
    void InitTimer2 (void)
    {
    TCCR2A = 0;
    TCCR2B = 0;
    bitSet (TIMSK2, TOIE2); // Enable Timer2 interrupt, TIMSKx, Timer/Counter Interrupt Mask Register
    TCCR2B = 0x05; // Prescaler = /128 (8 us resolution)
    }
    void Init (void)
    {
    DDRB = B00111111; 
    }
    void ReadDelayPot (void)
    {
    value = analogRead(A0);
    Sample1Delay = 65535 - 16 - value; 
    Mikrosekunde = (65535 -Sample1Delay)/16;
    }
    ISR (TIMER2_OVF_vect)
    {
    TCNT2 = 47; 
    //******************************** MAIN PULSE - TX ******************************
    DIGITAL_OUT |= (1<<TX_PIN_A);                   
    VoidDelay (63935);  // 65535-63935=1600, 1600/16=100uS
    DIGITAL_OUT &= ~(1<<TX_PIN_A);                   
    //*******************************************************************************
    //******************************** MAIN DELAY ***********************************
    VoidDelay (Sample1Delay); // Main Delay pauza
    //*******************************************************************************
    //****************************** MAIN DELAY PULSE *******************************
    DIGITAL_OUT |= (1<<SAMPLE_PIN_B);               
    VoidDelay (64850); // 65535-64850=685, 685/16=42,8125 uS
    DIGITAL_OUT &= ~(1<<SAMPLE_PIN_B);             
    //*******************************************************************************
    //******************************** EF DELAY *************************************
    VoidDelay (65135); // 65535-65135=400, 400/16=25uS
    //*******************************************************************************
    //****************************** EF DELAY PULSE *********************************
    DIGITAL_OUT |= (1<<SAMPLE_PIN_C);                  
    VoidDelay( 64850); // 65535-64850=685, 685/16=42,8125 uS
    DIGITAL_OUT &= ~(1<<SAMPLE_PIN_C); 
    //******************************************************************************* 
    //******************************** EF+TX DELAY **********************************
    VoidDelay( 64850); // 65535-64850=685, 685/16=42,8125 uS
    //*******************************************************************************
    ReadDelayPot();
    }
Working...
X