無線電子工学および電気工学の百科事典 LPTポートのもう一つの人生。 パート 2. 無線エレクトロニクスと電気工学の百科事典 LPT ポートで信号を記録するには、1 つのスイッチと 270 オームから 1 kオームの抵抗を持つ 1 つの抵抗で構成される回路 (図 8) を組み立てることをお勧めします。 スイッチ (ボタン) SW1 ~ SW0 がこの位置にあると、上部のすべての接点に論理「0」が表示され、いずれかが閉じられると、対応する接点に論理「7」が表示されます。 ピンは、D2 ~ D9 バス (ピン 378 ~ 15、アドレス &H13) または ERROR、SELECT、PAPER END、ACK、および -BUSY (ピン 12、10、11、379、および XNUMX、アドレス &HXNUMX) に直接接続できます。 。
LPTポートからのデータを表示するには、次のスキームをお勧めします。
公称値が 1 ~ 8 オームの抵抗 R270 ~ R330、任意の LED、たとえば AL307B。 このような回路は電力を必要とせず、とにかくすべてが光ります。 私はすべての信号を自分自身にもたらしました、すべてがすぐに目に見えます。 一般に、valery-us3leh.narod.ru/dlpt.html から LPT 4D HARD Analyzer プログラムをダウンロードすることを強くお勧めします。 ヴァレリー・コフトゥン著。 このプログラムの助けを借りて...一般的に、あなたは自分の目で見るでしょう。 K561LA7 チップ上に方形パルス発生器を組み立ててみましょう。 発電機+5V。 実際には、すべてのデバイスを、たとえば 155、555 シリーズで信号が TTL レベルになるように組み立てる方が便利です。 ロジック「ゼロ」は 0 ~ 0,8V、ログ「ワン」は 2,4 ~ 4,2V。 561 シリーズの利便性は電源の多用途性にあり、+ 3V から + 12V まで同様に動作します。 したがって、超小型回路の選択は好みに応じて変わります。唯一の問題は、+ 5V以下の振幅を持つ方形パルスを取得することです。 単純なパルス発生器の図を図 3 に示します。
ジェネレーター自体は要素 D1.1 ~ D1.3 で組み立てられており、出力パルスの前面をより「美しく」するために要素 D1.4 を使用しただけです。 R1、R2、C1 - 周波数設定要素。 これらの要素のパラメーターを使用すると、生成周波数は約 5 ~ 7 Hz になります。 わかりやすくするために、ジェネレーターの動作は次のグラフの形式で表すことができます。
インバータ出力 D1.4 は、LPT コネクタ (バス D2) のピン 0 に接続されます。 ジェネレーターを使用する前に、D0-D7 バスをデータ受信モードにする必要があります。 これを行うには、37 を &H43A に送信します。
その後、ポート &H378 のポーリングを開始します。
可変 A 254または255のいずれかの値を取ります。なぜですか?
実際には、D0 ~ D7 バスがデータ受信モードに切り替わった後、論理ユニットのレベル (黄色の行) に設定されます。 D0 レベルが D0 バスに現れると、ログ「0」(青い行) - 最初のビットはゼロの値をとり、これは 2 + XNUMX を意味します。1+22+23+24+25+26+27 = 254。 したがって、D0 バス上の信号の変化を追跡できますが、1 秒間の変化の数を数えると、... 正しく、デジタル周波数カウンターが得られます。 知ること 数 入ってくる衝動 毎秒 について言うことができます ヘルツの周波数. ということで、周波数カウンタプログラムです。 フォームには 3 つのボタンとラベルが必要です。 ボタン 1 は周波数メーターを開始、ボタン 2 は停止、ボタン 3 - 終了、ラベル - 周波数を示します。 ******************************************* inpout32.dllを使用している場合 Option Explicit 'ポートアドレスを操作するためのライブラリ宣言 プライベート宣言関数 Inp Lib "inpout32.dll" エイリアス "Inp32" (ByVal PortAddress As Integer) As Integer プライベート宣言サブ Out Lib "inpout32.dll" エイリアス "Out32" (整数としての ByVal PortAddress、整数としての ByVal 値) 'ミリ秒をカウントするためのライブラリ宣言 プライベート宣言関数 GetTickCount Lib "kernel32" () As Long Dim FTV AsLong'システム時間の初期値 Dim STV AsLong'システム時間の終了値 Dim FV As Integer 'FV はポートの初期状態 Dim SV AsInteger'SV-比較可能なポート状態 Dimcntr'パルスカウンター Dim J As Integer 'J=1 カウント可、J=0 カウント不可 Private Sub Command1_Click() Out &H37A, 43 'タイヤ D0 ~ D7 を読み取りモードにします FTV = GetTickCount 'システム時間をミリ秒単位で記憶しました J = 1 'カウント - 許可 FV = Inp(&H378) 'ポートステータスの読み取り SV = FV 'SV = ポート状態 cntr = 0 'ゼロへのカウンター Do While J <> 0 DoEvents STV = GetTickCount '現在のシステム時間を記憶します If STV > FTV + 1000 then FrequencyShow 'XNUMX秒経過したら結果を表示 FV = Inp(&H378) '常にアドレス &H378 をポーリングします If FV <> SV then 'ポートの状態が変化した場合 SV = FV 'SV はポート状態と等しい cntr = cntr +0.5'カウンター+0.5 終了する場合 If J = 0 Then Exit Do 'ユーザーが停止を押した場合 ループ End Subの Private Sub Command2_Click() 'ストップループ 'ユーザーが停止を押した場合 J=0 End Subの Private Sub Command3_Click() J =0'カウント-停止 Out &H37A、0 'D0-D7 バス状態を復元 アンロードしてプログラムを終了 End Subの '周波数表示ルーチン Public SubFrequencyShow() Label1.Caption = Int(cntr) & " Hz" '表示結果 cntr = 0 'ゼロへのカウンター 一時停止 (0.2) ' 遅延。 低周波の測定に必要 FTV = GetTickCount 'システム時間をミリ秒単位で記憶しました End Subの '遅延ルーチン。 通話形式:一時停止(秒数) パブリックサブポーズ(シングルとしての値) 薄暗い開始、終了 開始 = タイマー Do While タイマー < 開始 + 値 DoEvents ループ フィニッシュ=タイマー End Subの ******************************************* dlportio.dllをお使いの方へ Option Explicit 'ポートアドレスを操作するためのライブラリ宣言 プライベート宣言関数 DlPortReadPortUchar Lib "dlportio.dll" (ByVal Port As Long) As Byte プライベート宣言サブ DlPortWritePortUchar Lib "dlportio.dll" (ByVal ポート長、ByVal 値 As Byte) 'ミリ秒をカウントするためのライブラリ宣言 プライベート宣言関数 GetTickCount Lib "kernel32" () As Long Dim FTV AsLong'システム時間の初期値 Dim STV AsLong'システム時間の終了値 Dim FV As Integer 'FV はポートの初期状態 Dim SV AsInteger'SV-比較可能なポート状態 Dim cntr 'パルスカウンター Dim J As Integer 'J=1 カウント可、J=0 カウント不可 Private Sub Command1_Click() DlPortWritePortUchar&H37A、43'D0-D7バスを読み取りモードにします FTV = GetTickCount 'システム時間をミリ秒単位で記憶しました J = 1 'カウント - 許可 FV = DlPortReadPortUchar (&H378) ' ポート状態の読み取り SV = FV 'SV はポート状態と等しい cntr =0'ゼロへのカウンター Do While J <> 0 DoEvents STV = GetTickCount '現在のシステム時間を記憶します If STV > FTV + 1000 then FrequencyShow 'XNUMX秒経過したら結果を表示 FV = DlPortReadPortUchar (&H378) '常にアドレス &H378 をポーリングします If FV <> SV then 'ポートの状態が変化した場合 SV = FV 'SV はポート状態と等しい cntr = cntr +0.5'カウンター+0.5 終了する場合 If J = 0 Then Exit Do 'ユーザーが停止を押した場合 ループ End Subの Private Sub Command2_Click() 'ストップループ 'ユーザーが停止を押した場合 J=0 End Subの Private Sub Command3_Click() J = 0 'カウント - 停止 DlPortWritePortUchar &H37A, 0 ' D0-D7 バス状態を復元します アンロードしてプログラムを終了 End Subの '周波数表示ルーチン Public SubFrequencyShow() Label6.Caption = Int(cntr) & " Hz" '表示結果 cntr = 0 'ゼロへのカウンター 一時停止 (0.2) ' 遅延。 低周波の測定に必要 FTV = GetTickCount 'システム時間をミリ秒単位で記憶しました End Subの '遅延ルーチン。 通話形式:一時停止(秒数) パブリックサブポーズ(シングルとしての値) 薄暗い開始、終了 開始 = タイマー Do While タイマー < 開始 + 値 DoEvents ループ フィニッシュ=タイマー End Subの ******************************************* そして全部? あなたが尋ねる。 はい、それだけです。 これがプログラム全体ですが、何らかの理由で機能します。 Ø ご覧のとおり、コードは異なるライブラリでもほぼ同じです。そのため、次の例では、ライブラリのみを使用したコードを検討します。 ドルポルティオ.DLL 周波数カウンターのプログラム コードを注意深く分析すると、カウンターに 0.5 が追加されていることがわかります。 中央 = 中央 + 0.5, 実際のところ、このプログラム コードはポート状態の 1 から 1 への遷移、および 0 から 0 へのポート状態の遷移を考慮しているため、周波数をカウントするには、1 を加算してから出力する必要があります。 Label1.Caption = Int(cntr) & "hz" または1を追加 中央 = 中央 + 1, そして出力 Label1.Caption = Int(cntr/2) & "hz" これが数学です。 ところで、エンジンの回転軸にセンサーのようなものを取り付けてみたことはありますか。 おそらく、このプログラムの助けを借りて、素晴らしいタコメーター J を手に入れることができるでしょう。 さて、次に進みましょう。 同じパルス発生器を使用し、抵抗器R2またはR1の代わりにサーミスタをはんだ付けします(記事の著者は自動車店に行き、VAZ-30から2101ルーブルで温度センサーを購入しました)。 この温度センサーは温度に応じて抵抗値を変化させます (+3200 で 14 オーム)0+143の温度でCおよび100オーム0C.) 抵抗を変えると、発電機の周波数も変わります。つまり、コンバーターが得られます。 温度-周波数、つまりデジタル温度計。 次のグラフに見られるように、温度に応じた抵抗の変化は直線的には発生しないという事実に注意してください。
したがって、100 パルスが 20 度、110 パルスが 21 度であることをコンピュータに「説明」することは、それほど簡単ではありませんが、それでも可能です。 問題はコードのサイズとアルゴリズムだけです。 抵抗器の代わりにガソリンタンクからの燃料センサーを取り付けると、液面インジケーターが得られます。 次のようにそのようなインジケーターを構築する方が便利です。 1. 空のタンクでパルス周波数を測定します 2. ある程度のボリュームを追加し(どのような階調 - 得たい精度に応じて)、再度周波数を測定します。 3. コンテナの最上部まで同様に続きます。 また、下図の構造を組み立てれば、別の原理で液面計を作ることもできます。
液面が変化すると磁石付きフロートの位置も変化し、対応するリードスイッチが閉(開)します。 薄肉のプラスチックチューブを使用するのが最善です。 このデバイスのスキームは次のとおりです。
このようなデバイスからの情報は、次のアルゴリズムに従って処理できます。
Ø D0 ~ D7 バスを読み取りモードにする必要はなく、これで機能すると反対する人もいるかもしれません。 これに対して私は次のように答えることしかできません。誰が望むとしても、翻訳しないでください。 この件については議論しません。 &H378 ポートがデータ受信モードではなく、使用されているピン (この例では 2 - D0 ) が論理「1」である場合、 ジェネレーターが機能しない。 データ転送モード時の D0-D7 バスの出力電流は CMOS チップ (561LA7) の出力電流より大きいため、電流は発生しません。 もちろん、ピンセットで接点をグランドに短絡すると、電流は十分に流れなくなります。 しかし、追加のコード行を入力して、コンピューター ハードウェアの開発者のアドバイスどおりに実行することは、それほど難しいことではないと私には思えます。 次に、逆のプロセスを考えてみましょう。 コンピューターからデバイスにデータを転送するプロセス。 たとえば、同じパルス発生器の回路を少し変更したものを考えてみましょう。
発電機に電力を供給した後、突然発電機が動作していないことに気づきます。 また、論理レベル「2」が D1.1 要素の入力 1 に現れる場合にのみ機能します。 DlPortWritePortUchar &H378、1 そしてすべてがすぐにうまくいきました。 こちらはコンピューター制御の発電機です。 さて、この発生器はすべて小さいですが、このデバイスに敬意を表する必要があります。非常に多くの電子回路で、基礎として使用されているのはパルス発生器です。 もっと本格的なものをコンピュータに接続してみませんか。 ここにそのようなスキームがあります
このデバイスの入力を任意の出力、たとえば D3 に接続し、GND 入力をコネクタの共通線に接続しますが、+ 12V は別の電源から取得する必要があります。 リレーは自動車に持ち込むことができます。 一般に、要素のすべてのパラメータは完全に異なる場合があります(私は手元にあったものを使用しました) DlPortWritePortUchar &H378, 8 または DlPortWritePortUchar &H378, 9 または DlPortWritePortUchar &H378、10 重要なことは、D3 バスに「1」のログが存在することです。 リレーは機能しますが、それをどう受け取るかはあなた次第です。 一般に、高電圧デバイスを切り替えるときは、(万が一に備えて)ショートやケースの故障から身を守る必要があります。 事故が発生した場合に、素晴らしい LPT ポートが燃え尽きることがないようにするためです。 したがって、このような接続の場合は、フォトカプラなどを介してポートとデバイスのガルバニック絶縁を使用すると便利です。
デバイス内のすべてが「燃え尽きた」場合、光を通して - 残念ながら、電流は流れません、彼らはまだそのようなことを思い付いていません。 ここで第二部は終了です。 第三部はあるのでしょうか - あると思いますが、内容は次のとおりです... 著者: Alexey Klyushnikov、Ivanovo; 出版物: cxem.net 他の記事も見る セクション コンピューター. 読み書き 有用な この記事へのコメント. 科学技術の最新ニュース、新しい電子機器: 昆虫用エアトラップ
01.05.2024 地球磁場に対するスペースデブリの脅威
01.05.2024 バルク物質の固化
30.04.2024
その他の興味深いニュース: ▪ 血液から脳 ▪ 電動スクールバス
無料の技術ライブラリの興味深い資料: ▪ 記事 すべては可能な限り最高の世界で最高のために。 人気の表現 ▪ 記事 サイモンとガーファンクルの曲の 2 つが 74:XNUMX としてリストされているのはなぜですか? 詳細な回答 ▪ 記事 非同期モーター。 無線エレクトロニクスと電気工学の百科事典 ▪ 記事 ADP3301 チップの電圧安定器。 無線エレクトロニクスと電気工学の百科事典 このページのすべての言語 ホームページ | 図書館 | 物品 | サイトマップ | サイトレビュー www.diagram.com.ua |