Conception et realisation
d'une camera CCD


Sommaire

  Introduction, objectifs et principes [voir]
  Le CCD Thomson TH7852 [voir]
  Generation des horloges [voir]
  La carte d'alimentation [voir]
  La carte horloge [voir]
  La carte CCD [voir]
  La carte de connexion [voir]
  La carte amplificatrice et CAN [voir]
  La mise au point [voir]
  Le programme d'aquisition [voir]
  Les resultats [voir]
  Liens vers les composants [voir]

Le programme d'aquisition

 

      C'est lui qui gère l'acquisition des pixels et notamment la génération correcte des horloges. Nous avons créé deux applications : Un programme sous DOS qui permet un affichage rapide en assembleur car on peut écrire directement dans la RAM vidéo ce qui nous permet de descendre à 3 images par seconde et un autre sous Windows, plus convivial, mais qui ne permet pas de descendre en dessous d' une image par seconde à cause de l'affichage sous Windows.


      Programmation DOS

Ce programme est réalisé en turbo pascal et en partie en assembleur afin d'optimiser au maximum les performances d'acquisition. Malgré tout cela nous n'avons réussi qu'à descendre à 3 images par seconde. Cela est principalement du à la durée de lecture et d'écriture sur un port qui prendre un temps machine assez important (de l'ordre de 2 microsecondes), cela est principalement du à la vitesse du bus ISA. En sachant qu'il faut 145x4+145x218x7 opérations d'E/S par image on a alors un temps de 444ms environ auquel il faut rajouter les opérations de calcul et de déplacement des registres.

Voici le source du programme :

program dakasition_en_assembler;
uses dos,crt,biblio;

type
DACREG = record
      Rouge, Vert, Bleu : BYTE ;
      end;
DACARRAY = array [0..255] of DACREG;

var i,j:integer; {Compteurs de boucle}
      reg:registers; {Registres pour mode vidéo}
      ref: byte; {Valeur du signal de référence}
      c:byte; {Valeur du signal vidéo}
      b:word;
      y:integer; {Boucle de ligne}
      k,x:integer;
      dacbuf:dacarray; {Palette}
      val:byte;

{Génération du la palette graphique en 255 niveaux de gris}
procedure palette(a:integer);
var b:byte;
      code:integer;
begin
      For i:=0 to 255 do
       begin
      
     Dacbuf[i].bleu:=i;
            Dacbuf[i].vert:=i;
            Dacbuf[i].rouge:=i;
       end;
end;

{Initialisation du mode graphique}
procedure Initialise(buf:Dacarray);
var regs:registers;
begin
      Regs.AX := $1012;
      Regs.BX := 0;
      Regs.CX := 255;
      Regs.ES := seg( Buf );
      Regs.DX := ofs( Buf );
      intr( $10, Regs );
end;

Begin
{Changement du mode vidéo}
ASM {256}
      mov AL,$13
      mov AH,$00
      int $10 END;
      palette(0); {Initialisation de la palette en 255 niveaux de gris}
      initialise(dacbuf); {Initilisation du mode graphique}

{Initialisation de la carte E/S}
asm
      mov ax,0
      mov dx,$301
      out dx,ax end;

{Boucle principal d'aquisition}
repeat
asm
      mov y,145 {La variable y correspond à une ligne}
      @labelo: {Boucle de lecture rapide de la matrice avant aquisition}
      mov ax,10
      mov dx,$301
      out dx,ax {Génération des phases ÆP et ÆM}
      mov ax,0
      mov dx,$301
      out dx,ax {Mise à zéro des phases ÆP et ÆM}
      dec y; jnz
      @labelo
      mov y,145
      @labely: {Boucle d'aquisition pour chaque ligne}
      mov ax,2
      mov dx,$301
      out dx,ax {Génération de ÆM}
      mov ax,0
      mov dx,$301
      out dx,ax {Mise à zéro de ÆM}
      mov cx,218
      @labelx: {Boucle d'aquisition pour chaque pixel}
      mov ax,16
      mov dx,$301
      out dx,ax {Génération de Start Convert}
      mov ax,0
      mov dx,$301
      out dx,ax {Mise à zéro de Start Convert}
      mov dx,$305
      in al,dx; {Lecture des données du CAN pour signal de référence}
      mov ref,al
      mov ax,16
      mov dx,$301
      out dx,ax {Mise a l'état haut de Start Convert}
      mov ax,20
      mov dx,$301
      out dx,ax {Génération de ÆL}
      mov ax,4
      mov dx,$301
      out dx,ax {Mise à zéro de Start Convert}
      mov dx,$305
      in al,dx {Lecture des données du CAN pour signal vidéo}
      mov bl,ref
      sub al,bl {Calcul de la valeur du pixel (signal vidéo-référence)}
      mov c,al
      shr c,2 {Division par 4 de la valeur car affichage en 64 niveaux}
      mov ax,$a000 {Adresse de la mémoire vidéo}
      mov es,ax
      mov ax,y
      mov dx,320 {Décalage d'une ligne}
      mul dx
      add ax,cx {Décalage d'une colonne}
      mov di,ax
      mov ah,c
      mov [es:di],ah {Ecriture du pixel dans la mémoire vidéo}
      loop
      @labelx
      dec y
      jnz @labely
      end;
until keypressed; {Retour au mode vidéo initial}

asm
      mov ax,$03
      int 10h
end;

End.

Ce programme nous affiche l'image à l'écran comme celle-ci :



Image de Matthieu prise avec la caméra

      Programmation Windows

      Le programme sous Windows à été réalisé sous DELPHI. Le programme sous Windows est plus convivial. De plus, nous avons ajouter un certain nombre d'éléments permettant notamment le filtrage des images en temps réel. Nous avons donc ajouter le calcul de l'histogramme qui permet un centrage dynamique de l'image, c'est à dire le calcul du temps d'intégration adéquat. Dans ce principe de centrage dynamique de l'histogramme, on agit sur le temps d'intégration de la matrice en continue afin que le maximum de pixels soient autour de la valeur 127 (car nous avons un CAN 8 bits), ainsi si nous avons un temps de pose trop faible l'histogramme sera décalé vers 0 et si nous sommes en surexposition ou en limite de saturation l'histogramme tendra vers 255.
Le but étant de réagir au plus vite lors que l'on bouge la caméra, pour cela on augmente (ou diminue) le temps d'intégration proportionnellement au décalage de l'histogramme par rapport à 127. Les résultats sont assez surprenants.

De plus, les filtres classiques ont été implémentés comme le filtre passe-bas, passe-haut, Laplacien et les filtres d'érosion et de dilatation. Ceci agissent en temps réel et peuvent avoir des application dans une chaîne de industrielle à titre de vérification de pièces.



Interface du logiciel d'acquisition sous Windows



      Le programme permet aussi de choisir le temps de pose manuellement, de gérer la durée des signaux d'horloges et enregistrer les images sous le format BMP. Une autre partie du programme permet de tester le bon fonctionnement de la carte Entrées/Sorties.
Ainsi, le programme nous signale lorsque celle-ci n'est pas branchée correctement ou n'est pas branché. Pour réaliser ce contrôle, nous utilisons le port 302h en lecture que nous avons configuré à 127 par des jumpers, ainsi le programme teste s'il y a 127 sur ce port, dans le cas contraire, s'il trouve 0 c'est que la carte n'est pas alimentée et s'il trouve 255 c'est que la carte n'est pas reliée à l'ordinateur.



Mode d'emploi

1. Mettre la carte décodage dans le PC.
2. Connecter le câble de 15cm (SUB-D15) du boîtier d'horloge vers la tête de la camera
3. Brancher le boîtier d'alimentation et vérifier que celui-ci est bien éteint avant toute connexion
4. Connecter le câble (SUB-D25 mâle/femelle) du boîtier horloge au boîtier d'alimentation
5. Connecter le câble (SUB-D25 mâle/mâle câble FX) de la carte décodages d'adresse (dans le PC) au boîtier d'alimentation.
6. Attention : il faut toujours allumer l'interrupteur de la carte d'alimentation (Interrupteur de gauche) avant d'allumer celui de la carte E/S (interrupteur de droite)
7. Mettre sous tension le boîtier d'alimentation (interrupteur de gauche), une LED verte doit alors s'allumer
8. Mettre sous tension la carte E/S (interrupteur de droite) l'autre LED verte s'allume
9. Lancer le programme d'acquisition
10. Si le programme indique que la carte PIO ne fonctionne pas correctement, il faut vérifier la connexion de la carte de décodage d'adresse. Pour cela il faut mettre hors tension la carte E/S et relancer le programme. Si le programme indique que la carte PIO n'est pas branchée cela veut dire que la carte décodage d'adresse fonctionne.
11. Retirer le cache de la caméra
12. Cliquer sur l'interrupteur pour lancer l'acquisition
13. Attention le programme fonctionne uniquement sous Windows 98
14. Eteindre d'abord la carte E/S avant la carte alimentation au risque de griller une bascule 3 états





Copyright © 2001 http://www.astrosurf.com/april