1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
|
unit Unit32;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
Tform32 = class(TForm)
acquisition: TButton;
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
Edit3: TEdit;
Label3: TLabel;
Edit4: TEdit;
Label4: TLabel;
procedure Clock(duree:integer);
procedure acquisitionClick(Sender: TObject);
function AcquisitionData:real;
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Déclarations privées }
public
{ Déclarations publiques }
end;
var
form32: Tform32;
implementation
{$R *.dfm}
var fini:boolean;
//==============================================================================
procedure Tform32.Button1Click(Sender: TObject);
begin
fini:=true; // quitte la lecture
end;
//==============================================================================
procedure Tform32.FormClose(Sender: TObject; var Action: TCloseAction);
begin
fini:=true; // quitte la lecture
end;
//==============================================================================
// ici je simule la lecture de ton canal
// a remplacer par ta procedure et faire un masque au besoin si tu lis un octet plutot qu'un bit
function ReadIOchannel(Channelno:integer):byte;
begin
// a remplacer , je simule la lecture d'un bit
randomize;
result:=random(256);
// affiche la valeur de l'octet
form32.edit4.text:=inttostr(result);
// lecture du bit 0
result:=result and ($01);
end;
//==============================================================================
procedure Tform32.Clock(duree:integer);
Var
F : Int64 ;
Start,Stop : Int64 ;
R:double;
begin
start:=0;
// controle si le pc possede ce type de compteur, sinon utilise le GetTickCount
// initialise valeur de depart
if QueryPerformanceFrequency(F) then QueryPerformanceCounter(Start)
else Start:=GetTickCount;
// rentre dans une boucle d'attente
repeat
if QueryPerformanceFrequency(F) then QueryPerformanceCounter(Stop)
else
begin
F:=1000;
Stop:=GetTickCount;
end;
R:=(Stop-Start)*1000/F; //resultat en ms
application.ProcessMessages;
until R>duree; // quitte au bout de 1 ms
end;
//==============================================================================
function Tform32.AcquisitionData:real;
var FinAcq :boolean;
CompteurActif :boolean;
etat :byte;
Oldetat :byte;
compteur :integer;
NbAqc :integer;
begin
Oldetat:=0;
CompteurActif:=false;
compteur:=0;
NbAqc:=0;
FinAcq:=false;
edit3.text:='';
repeat
// delai de 1 ms, cette "clock" est l'echantillonage du signal
Clock(1);
// lecteure du canal de la carte
etat:=ReadIOchannel(0);
// controle si l'etat lus est different de l'etat precedant,
// si l'etat change j'active ou desactive le compteur
if Oldetat<>Etat then
begin
CompteurActif:=not(CompteurActif);
// ici je desactive le compteur donc l'acquisition est finie.
if CompteurActif=false then FinAcq:=true;
end;
// iniatilise l'etat precedant
Oldetat:=etat;
// compte le nombre d'acquisition entre deux changements d'etat ( donc le nombre de ms)
if CompteurActif then
begin
inc(compteur);
// affiche le nombre de bit a 1 concecutifs
edit3.text:=edit3.text+inttostr(etat);
end;
// variable de controle, je quitte si l'acquisition dure plus de 1 seconde sans changement d'etat
inc(NbAqc);
if (CompteurActif=false) and (NbAqc=1000) then FinAcq:=true;
application.ProcessMessages;
until FinAcq;
// la valeur retournée par cette fonction est le nombre de ms ecoulé entre
// deux changements d'etat donc un demi periode ( si le signal a un rapport
// cyclique de 50 !!) donc je le multipli par deux .
compteur:=compteur*2;
edit2.text:=inttostr(compteur);
// resultat en m/s
result:=250/(compteur);
end;
//==============================================================================
procedure Tform32.acquisitionClick(Sender: TObject);
var V:real;
begin
fini:=false;
repeat
// delai t'attente de 500 ms entre deux lecture de frequence
Clock(500);
V:=AcquisitionData;
edit1.text:=FormatFloat('###.##',v);
application.ProcessMessages;
until fini ;
end;
//==============================================================================
end. |
Partager