ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • TCD1201 이미지 센서
    LinearImageSensor 2022. 4. 1. 20:27

    TCD1201D 를 이용한 아두이노 

    C코드

    /*
      Linear CCD readout
      lCCD: Toshiba TCD 1201D, 2048 pixel
      Pinmap: 22 DIL
      Chip                               Arduino Pin
        1  :  OS (Output Signal)           A0
        2  :  DOS (Compensation Output)    A1
        3  :  OD (Power +5V)               +5V
        4  :  RS (Reset Gate)              6
        5  :  BT (Boost Pulse)             7
        6  :  P2 (clock Phase 2)           5
        19 :  P1 (clock Phase 1)           4
        21 :  SH (Shift Gate)              3
        all other pins connected to GND    GND
    */
    
    #define OS_PIN A0
    #define DOS_PIN A1
    #define SH_PIN 3
    #define P1_PIN 4
    #define P2_PIN 5
    #define RS_PIN 6
    #define BT_PIN 7
    
    int bt_time = 50; // length of boost
    int rs_time = 50; // length of reset
    int p1_time = 1; // length of P1
    int p2_time = 1; // length of P2
    int sf_time = 1; // shift between BT and RS
    
    int sadc[256];  // signal output values read
    int sdummy1[32];
    int sdummy2[14];
    
    
    void setup() {
      Serial.begin(9600);
      Serial.println("Setup start");
      for (int i=3;i<8;i++) pinMode(i,OUTPUT);
      pinMode(OS_PIN,INPUT);
      pinMode(DOS_PIN,INPUT);
      // take all to LOW
      PORTD = B00000000;
      Serial.println("Setup Complete");
    }
    
    void loop() {
      // do nothing - all done via SerialEvent
      Serial.println("start loop");
      readCCD();
    
      delay(5000);
    }
    
    void readCCD() {
      int dos = 300;
      int dwt = 1;
      int j;
      int val;
      for (int i=0; i<256;i++) sadc[i]=0;
      // start read cycle
      Serial.println("Start read cycle");
      // take all to LOW
      PORTD = B00000000;
      delay(1);
      // set inital state
      //       BRPPSxxx
      //       TS21H
      PORTD = B10011000;  
      delay(1);
      // take BT low
      //       TS21H
      PORTD = B00011000;
      delayMicroseconds(bt_time);
      // take RS high
      //       TS21H
      PORTD = B01011000;
      delayMicroseconds(rs_time);
      // take BT high
      //       TS21H
      PORTD = B11011000;
      delayMicroseconds(bt_time);
      // take RS low
      //       TS21H
      PORTD = B10011000;
      delayMicroseconds(rs_time);
      //
      Serial.println("read dummy output");
      // take gate to low
      //       TS21H
      PORTD = B10010000;
      for (int i=0; i<16;i++){
        // read cylce part 1 (p1=high,p2=low)
        // wait integration time
        delayMicroseconds(dos);
        sdummy1[i*2] = analogRead(DOS_PIN) - analogRead(OS_PIN);
        // p1 high - BT/RS cycle (4 steps)
        PORTD = B00010000;
        delayMicroseconds(bt_time);
        PORTD = B01010000;
        delayMicroseconds(rs_time);
        PORTD = B11010000;
        delayMicroseconds(bt_time);
        PORTD = B10010000;
        delayMicroseconds(rs_time);
        // switch P1/P2 state
        PORTD = B10110000;
        PORTD = B10100000;
    //    PORTD = B10110000; // take p2 high
    //    delayMicroseconds(p2_time);
    //    PORTD = B10100000; // take p1 low
        // read cylce part 2 (p1=low,p2=high)
        // wait integration time
        delayMicroseconds(dos);
        sdummy1[i*2+1] = analogRead(DOS_PIN) - analogRead(OS_PIN);
        // p1 low - BT/RS cycle (4 steps)
        PORTD = B00100000;
        delayMicroseconds(bt_time);
        PORTD = B01100000;
        delayMicroseconds(rs_time);
        PORTD = B11100000;
        delayMicroseconds(bt_time);
        PORTD = B10100000;
        delayMicroseconds(rs_time);
        // switch P1/P2 state
        PORTD = B10110000;
        PORTD = B10010000;
    //    PORTD = B10000000; // take p2 low
    //    delayMicroseconds(p2_time);
    //    PORTD = B10010000; // take p1 high
      }
      for (int i=0; i<32;i++){
        Serial.print(sdummy1[i]);
        Serial.print(" ");
      }
      Serial.println();
      Serial.println("read sensor output");
      for (int i=0; i<1024;i++){
        j = i / 4;
        // read cylce part 1 (p1=high,p2=low)
        // wait integration time
        delayMicroseconds(dos);
        sadc[j] += analogRead(DOS_PIN) - analogRead(OS_PIN);
        // p1 high - BT/RS cycle (4 steps)
        PORTD = B00010000;
        delayMicroseconds(bt_time);
        PORTD = B01010000;
        delayMicroseconds(rs_time);
        PORTD = B11010000;
        delayMicroseconds(bt_time);
        PORTD = B10010000;
        delayMicroseconds(rs_time);
        // switch P1/P2 state
        PORTD = B10110000;
        PORTD = B10100000;
    //    PORTD = B10110000; // take p2 high
    //    delayMicroseconds(p2_time);
    //    PORTD = B10100000; // take p1 low
        // read cylce part 2 (p1=low,p2=high)
        // wait integration time
        delayMicroseconds(dos);
        sadc[j] += analogRead(DOS_PIN) - analogRead(OS_PIN);
        // p1 low - BT/RS cycle (4 steps)
        PORTD = B00100000;
        delayMicroseconds(bt_time);
        PORTD = B01100000;
        delayMicroseconds(rs_time);
        PORTD = B11100000;
        delayMicroseconds(bt_time);
        PORTD = B10100000;
        delayMicroseconds(rs_time);
        // switch P1/P2 state
        PORTD = B10110000;
        PORTD = B10010000;
    //    PORTD = B10000000; // take p2 low
    //    delayMicroseconds(p2_time);
    //    PORTD = B10010000; // take p1 high
      }
      for (int i=0; i<256;i++){
        sadc[i] /= 8;
        Serial.print(sadc[i]);
        Serial.print(" ");
        if ((i%16)==0) Serial.println();
      }
      Serial.println();
      Serial.println("read second dummy output");
      for (int i=0; i<7;i++){
        // read cylce part 1 (p1=high,p2=low)
        // wait integration time
        delayMicroseconds(dos);
        sdummy2[i*2] = analogRead(DOS_PIN) - analogRead(OS_PIN);
        // p1 high - BT/RS cycle (4 steps)
        PORTD = B00010000;
        delayMicroseconds(bt_time);
        PORTD = B01010000;
        delayMicroseconds(rs_time);
        PORTD = B11010000;
        delayMicroseconds(bt_time);
        PORTD = B10010000;
        delayMicroseconds(rs_time);
        // switch P1/P2 state
        PORTD = B10110000;
        PORTD = B10100000;
    //    PORTD = B10110000; // take p2 high
    //    delayMicroseconds(p2_time);
    //    PORTD = B10100000; // take p1 low
        // read cylce part 2 (p1=low,p2=high)
        // wait integration time
        delayMicroseconds(dos);
        sdummy2[i*2+1] = analogRead(DOS_PIN) - analogRead(OS_PIN);
        // p1 low - BT/RS cycle (4 steps)
        PORTD = B00100000;
        delayMicroseconds(bt_time);
        PORTD = B01100000;
        delayMicroseconds(rs_time);
        PORTD = B11100000;
        delayMicroseconds(bt_time);
        PORTD = B10100000;
        delayMicroseconds(rs_time);
        // switch P1/P2 state
        PORTD = B10110000;
        PORTD = B10010000;
    //    PORTD = B10000000; // take p2 low
    //    delayMicroseconds(p2_time);
    //    PORTD = B10010000; // take p1 high
      }
      for (int i=0; i<14;i++){
        Serial.print(sdummy1[i]);
        Serial.print(" ");
      }
      Serial.println();
      Serial.println("read cycle complete");
    }

    PDF 센서 :

    TCD1201D.pdf
    0.40MB

     

    'LinearImageSensor' 카테고리의 다른 글

    TCD1209DG 정보  (0) 2022.04.01
    아두이노 Linear CCD project  (0) 2022.04.01
    TCD1304AP + 아두이노 자료  (0) 2022.04.01
    [비] TCD1201D Code  (0) 2022.04.01
    [비] FCCD 143A PDF 관련 자료 모음  (2) 2022.04.01
Designed by Tistory.