吸収されたマイクロ波電力の電力計とその開発への参加

読者の皆さん、こんにちは。 私は長い間habrに登録されていましたが、最初の投稿を敢えて発行しませんでした。

本当に面白そうに見えるものを書きたかった。 時間が経ちましたが、アイデアは出ませんでした。

そして先日、最初のプロジェクトの1つで作業を終えた後、ビデオのレビューを行い、デバイスに関する短い記事を書くことになりました。 彼は一人で働いたわけではありませんが、私が完全に「完全に」かかった部分について話します。

最初に、ドライな技術情報を提供します。


画像

吸収マイクロ波電力の電力計M3-114は、220 V、50 Hzの産業用電源ネットワークから、またはスタンドアロンモードで、内部または外部の12 Vバッテリーから電力を供給されたときの、連続およびパルス変調マイクロ波信号の電力の平均値を同軸経路で測定するように設計されています。このデバイスは、4行のテキスト真空発光高輝度ディスプレイを使用しています。 操作のためのデバイスの準備は、操作を簡素化する対話モードで実行されます。 デバイスにはRS-232ポートが装備されているため、コンピューターにデータを出力できます。

動作周波数範囲は0.00〜17.85 GHzです。

1.0μW〜100ワットの平均電力値の測定範囲。

0〜12.05 GHzの周波数で10 mWを超える測定電力の範囲では、電力計の主な誤差の制限は±4%を超えず、12.05 GHz〜17.85 GHzを超える周波数範囲では-±6%です。

電力計のVSWRはもうありません:
0.02〜12.05 GHzの周波数範囲で1.3。
12.05〜17.85 GHzを超える周波数範囲で1.4。

「電気ゼロ」のドリフトを考慮に入れたメーター測定値の不安定性は、40μW/分以下です。

220±22 Vのネットワーク電圧、PPK1-PPK3で作業する場合の周波数50±0.5 Hz、PPK 4で作業する場合-12 VA以下、自律電源から作業する場合15 VA以下で、電力計が消費する電力6 5 VA


今、私たちの前に設定されたタスクに直接渡します


まず、充電器を制御するプログラムを開発する必要がありました。 基本的には、内蔵のアナログ-デジタルコンバーター、バッテリーレベルと充電ボタンを担当する5つのLEDを備えたADUC814マイクロコントローラーで構成されています。 すべてが非常に簡単です。意味の詳細な説明は表示されません。 ADCを中断することでデータを取得し、それをボルトに変換してから、この値を使用して、プログラムが特定の決定を下します。たとえば、どのダイオードを点火するか、重要な充電レベルで何をすべきかなど、充電有効ボタンも監視します。

第二に、これは実際に私にとって最も難しい部分であり、情報処理および表示装置を制御するプログラムを開発する必要がありました。 BOIには、ディスプレイ、キーボード、一対の補助LED、およびこれらすべてを制御するAT89C51RC2マイクロコントローラー(MK_BOI)などのコンポーネントが含まれます。 電力計のすべての主要機能の概要がビデオに示されています。

測定された電力に応じて、4つのコンバーターの1つが電力計に接続されます。 コンバーターからのデータは、Analog DevicesによってA / Dコンバーターに送信され、RS232を介して別のADUC814(MK_ATsP)に送信され、そこで事前処理されます。 プログラム ADCとの直接の処理および通信は、私が開発したものではありません。

RS232を介したMK_ADCは、MK_BOIからいくつかのコマンドの1つを受信します。各コマンドは3バイトで構成され、コマンドを分析し、それに応じてコマンド番号と要求結果の3バイトを送り返します。 これは、コンバーターの数、または、たとえば、さらに数学的処理が行われる測定の結果です。 一部のコマンドは、ゼロ補正またはADCキャリブレーションを担当します。 約8〜9のチームだけを詳しく調べてみると、その点もわかりません。

最後に、機能について少し説明したいと思います。これについては、ビデオで詳しく説明しています。
キーボードボタンの主要部分は2つの機能を実行し、補助LEDにより、2つのモードのみの操作モードでのナビゲートが容易になります。これはメニューモードで、上部ダイオードと動作モードがオン、下部ダイオードがオンです。

メニューを使用して、多くの機能を実行できます

  • ディスプレイの明るさを制御する
  • 測定が行われる周波数範囲を選択します。 選択した範囲に応じて、最終結果に影響する1つまたは別の補正係数が適用されます。 係数は、参照機器との比較によって計算されます。
  • Pの特定の値を設定し、測定値と比較します。 結果はパーセンテージで表示されます。
  • 測定値の範囲を設定します。終了すると、対応する碑文<Pmin、> Pmax

操作モードでは、次のことができます。

  • ゼロ補正とADCキャリブレーションを実行します。
  • 測定値の平均化をオンにするか、オフにします。
  • STOPボタンを押してディスプレイを「フリーズ」します


必要なすべての情報が表示されます。 測定値の値もdBmとdBに変換されますが、ゼロドリフト中にも負の値が発生します。この場合、メッセージErrが表示されます。 パワーをPcの値と比較した結果。 接続された送信機の番号。 STOPボタンが押されたという情報、および特定のコンバーターの可能な測定範囲を終了すると、対応するメッセージも表示されます。

また、周波数補正係数に加えて、特定の測定ごとに個別に計算される動的補正係数も追加します。

それだけです。この投稿が好きな人がいることを望みます。また、批判的な性質のコメントも見たいと思います。 MK_BOIを同様のメモリに置き換えます。これらの32 kBは容量がいっぱいになっているためです。

ご清聴ありがとうございました。



コーディング


長い間おbreakび申し上げます。 コメントには、プログラミングプロセス自体に関する質問がありました。これに関連して、この記事を更新し、ここにコードを追加します。

アルファベットを表示

情報の表示は次のように編成されました。 繰り返されるフレーズのリストがコンパイルされ、それらのためにalphabetLCD.hライブラリが作成されました。

void m3114(); // " -114" void noSignalADC(); // "   " void wait(); // "" void norma(); //  void PPK1(); void PPK2(); void PPK3(); void PPK4(); void prepareToWorkOnPPKEnter(); //           "" void heating(); //  6 ? 34 void ifTNorm(); //  =15-25  ""    "" void Kcoeff(); //   1,000 void preparationOfMeasurement(); //    12 void resetMenuParams(); //     void readyToMeasurement(); //     void menuSet1(); //    ***   ***    ***   void switchOffSVCHAndPressEnter(); // "      void preparationOfMeasurementCorrection0(); //    "0"  void preparationOfMeasurementCooling(); //    30  void preparationOfMeasurementStop32(); //   32 ? 24 void preparationToWork(); //          void hertzType0(); // 0-1 1-4 4-8 8-12 void hertzType1(); // 12-15 15-17.85 void setPCompare(); //  .  ? 1,000 mW void setPCompareChange(); //  .  -    : , void allowenceControlMin(); //   min:  ? , W void allowenceControlMax(); //   max:  ? , W void setAllowenceControlMin(); //  min  -    : , void setAllowenceControlMax(); //  max  -    : , void menuSet2(); //     4 8 16 void brightnessSet(); // 25% 50% 75% 100% void fault(); // !!! void incorrectValue(); //  !   void overload(); // !!!   >    


「alphabetLCD.」の関数の1つを実装する例を示します。

 void noSignalADC() // "   " { writeData('H'); writeData('E'); writeData('T'); writeData(' '); writeData('C'); writeData('B'); writeData(0x99); writeData(0x8D); writeData(0x8E); writeData(' '); writeData('C'); writeData(' '); writeData('A'); writeData(0x90); writeData(0x85); } 

「main.c」に実装された計算の結果を表示する必要がある場合があるため、 externキーワードを使用しました。
 extern bit hertzType; extern float xdata calibrFl; extern unsigned char xdata ppkNumberCh; //   char extern float xdata pCompareFl; extern float xdata pMinFl; //    float extern float xdata pMaxFl; //    float 

メインプログラムに移りましょう

「main.h」のすべての主な機能は次のとおりです。
 void initialization(); void delay(unsigned int); void delay2s(); void zeroCorrection(); void calibration(); void measurement(); //****UART**** void sendData (unsigned char); // send to UART //unsigned char recvData(); // recive from UART void iToA (int , char * ); void getPPKnumber(); //****Keyboard**** void keyboardInit(); void keyboardPolling(); void downZero(); void upCalibr(); void lessAveraging(); void morePC(); void commaStop(); void cancel(); void enter(); void menu(); //****Display**** void dispInit(); void writeCmd(int); void writeData(char); void readBF(); void returnHome(); void clearDisp(); void reloadDisp(); void moreLessCheck(); 

マクロ

ディスプレイのプログラミング、コマンドの呼び出し、行に沿ったカーソルの移動などのために。 アクティブに使用されるマクロ:
 /* __________MAKROS BLOCK__________ */ #define FIRST_LINE 0x80 #define SECOND_LINE 0xC0 #define THIRD_LINE 0x94 #define FOURTH_LINE 0xD4 #define CURSOR_HOME 0x02 #define CLEAR_DISP 0x01 #define DISP_OFF 0x08 #define DISP_ON_CB_OFF 0x0C // Disp ON cursore & blink OFF #define DISP_ON_CB_ON 0x0F #define FIRST_SIMBOL 0xD4 #define SECOND_SIMBOL 0xD5 #define THIRD_SIMBOL 0xD6 #define FOURTH_SIMBOL 0xD7 #define FIFTH_SIMBOL 0xD8 #define SIXTH_SIMBOL 0xD9 /* __________MAKROS BLOCK END__________ */ 

プロセッサレッグの構成

 * __________PINS BLOCK__________ */ sbit E = P3^4; sbit RS = P3^6; sbit RW = P3^5; sbit workLed = P3^2; sbit menuLed = P3^3; sbit enterBut = P1^6; sbit cancelBut = P1^5; sbit uartPC = P3^7; /* __________PINS BLOCK END__________ */ 

変数の説明

 /* __________VARIABLES BLOCK__________ */ unsigned char keyPressed = 0; // key pressed value bit keyFlag = 0; // software flag unsigned char xdata uartDataRecv = 0; //     unsigned char xdata uartDataSend = 0; //     char xdata uartRecvCount = 0; //      bit menuFlag = 0; //    ,  1 -  ,  0 -  char xdata move = 1; //     bit signalFlag = 0; //          char xdata enterFlag = 0; //     char xdata cancelFlag = 0; //     bit modeFlag = 0; //       bit brightnessFlag = 0; // ,       char xdata brightnessMove = 1; //       char xdata brightnessSetFlag = 0; //   ,    bit hertzFlag = 0; // ,       char xdata hertzSetFlag = 0; char xdata menuStep = 0; //   char xdata hertzMove = 1; //       bit hertzType; //     bit compareFlag; //     char xdata compareFlagEnter = 0; //      char xdata compareFlagCancel = 0; //      char xdata moreLess = 0x30; //       char xdata moreLessFlag = 0; //       bit moreFlag = 0; //  1    moreLess -= 2 bit lessFlag = 0; //  1    moreLess +=2 char xdata wattFlag = 0; //      bit commaFlag = 0; //            unsigned char xdata pCompare[10] = 0; //    float xdata pCompareFl = 1.0; //float xdata pCompareFlTemp = 1.0; //        . // ,   !!! bit controlFlag = 0; //     char xdata controlFlagEnter = 0; //      char xdata controlFlagCancel = 0; //      unsigned char xdata pMin[10]; //   min unsigned char xdata pMax[10]; //   max float xdata pMinFl = 0; //    float float xdata pMaxFl = 0; //    float bit pMinFlag = 0; //      min bit pMaxFlag = 0; //      max unsigned char xdata zeroCoef1 = 50; //    50 - 200 unsigned char xdata zeroCoef2 = 30; //    50 - 200 unsigned char xdata zeroCoef3 = 30; //    50 - 200 unsigned char xdata zeroCoef4 = 100; //    50 - 200 unsigned long xdata zero; //     unsigned char xdata calibrCoef1 = 50; //   50 - 200 unsigned char xdata calibrCoef2 = 30; //   50 - 200 unsigned char xdata calibrCoef3 = 30; //   50 - 200 unsigned char xdata calibrCoef4 = 100; //   50 - 200 unsigned long xdata calibr; //      float xdata calibrFl; //      unsigned int xdata PPK1CalibrPower; //     1   unsigned long xdata PPK23CalibrPower; //     1 - 2   unsigned long xdata PPK4CalibrPower; //     4   float xdata PPK1CalibrStandart; //       (0,5 - 1,5) float xdata PPK2CalibrStandart; //       (0,5 - 1,5) float xdata PPK3CalibrStandart; //       (0,5 - 1,5) float xdata PPK4CalibrStandart; //       (0,5 - 1,5) unsigned char xdata uartData[10]; //          unsigned char xdata ppkNumberCh; //   char float xdata measurementResult = 0; //    bit averagingFlag = 0; //   bit averaging4 = 0; //   4- bit averaging8 = 0; //   8- char xdata averagingMove = 1; //      float idata hertzRate = 1; //      6() * 4() = 24  float idata dynamicRate = 1; //    //   4() * 4() = 16  char idata stop = 0; //   1       ,  0    char idata pc = 0; //       //bit key = 0; xdata union { unsigned long bytes; unsigned char byteArr[4]; } byteUnion; /* __________VARIABLES BLOCK END__________ */ 

中断

 /* __________INTERUPTS BLOCK__________ */ void keyboard_interrupt() interrupt 7 using 1 { IEN1 &= ~(1<<0); //   keyFlag = 0; keyPressed = KBF; /* save pressed key */ keyFlag = 1; /* set the software flag */ KBF = 0x00; /* clear keyboard flags */ delay(50000); // 50 mc IEN1 |= 0x01; //   } void serial_IT(void) interrupt 4 { if (RI == 1) { uartDataRecv = SBUF; uartData[uartRecvCount] = uartDataRecv; ++uartRecvCount; } RI = 0; } /* __________INTERUPTS BLOCK END__________ */ 


続行する必要があります...

Source: https://habr.com/ru/post/J214291/


All Articles