ステップ1:原材料
家の資料から:
1.サイプレスのマイクロコントローラー「CY8C29466-24PXI」およびデバッグボード「PSoCEVAL1 RevE」
2. PSoC MiniProgプログラマーおよびそのためのUSB-miniUSBワイヤ
3.マルチメーターとLCDディスプレイ(デバッグ時に非常に役立ちます)
ステップ2:配線図
最初のステップは、包含回路を把握することでした。 タスクは、電界効果トランジスタの電流-電圧特性を測定することであることを思い出させてください。 すなわち、Is(電流ドレイン-ソース)の電圧Uz(ゲートでの)への依存性。 通常、アナログ-デジタルコンバーターは電圧測定に関連付けられているため、既知の電圧を使用して電流を間接的に測定する回路が必要でした。 そして、少し議論した後、次のスキームが生まれました。
どこで:
Vdd-マイクロコントローラーとボードの供給電圧
R1-ワークロード
Q1-電界効果トランジスタ
DACおよびADCは、それぞれデジタル-アナログおよびアナログ-デジタルコンバーターです。
ステップ3:トランジスタの選択
マニュアルでは、ボードの電圧はVdd = 5Vであり、D / Aコンバーターの動作範囲は約0〜5Vであることがわかりました。 これらのデータに基づいて、トランジスタ(Q1)と動作抵抗(R1)が選択されました。 選択はKP103Mと50オームの抵抗に落ちました。
トランジスタKP103Mの技術的特性:
•トランジスタ構造:pn接合とpチャネル。
•Rsi max-消費電力-120 mW。
•Uzzi ot-トランジスタのカットオフ電圧-ゲートとソース間の電圧:2.8〜7V。
•USI max-最大ドレイン-ソース電圧:10V。
•Ibeg-初期ドレイン電流:3〜12 mA。
•S-スロープ特性:1.3〜4.4 mA / V以上。
•C11i-トランジスタ入力容量-ゲートとソース間の容量:20 pF。
•12-交流入力での短絡時の共通ソースを含む回路のフィードバック容量:8 pF。
•Ksh-トランジスタの雑音指数:1 kHzの周波数で3 dB以下。
市場で半日、以下のアイテムが購入されました。
1.フィールドトランジスタKP103Mおよび50オームの動作抵抗
2.データをコンピューターに転送するのに便利なRS 232ケーブル(RS232-USBを購入したかったのですが、価格が重要な役割を果たし、仮想COMポートでの作業を恐れていました)
ステップ4:マイクロコントローラーのプログラミング。
0.はじめに
PSoC Designer 5.3の環境でのプログラミングは、かなり高いレベルで実行されます(プログラミングを確実に呼び出すことはできませんが、プログラミングとモデリングの間の何かです)。 媒体の主なワークスペースはチップ回路です。 マイクロコントローラモジュールをインストールするための空きブロックが配置されている(そして既に何かを追加している場合、それらは無料ではありません)。 さまざまなDAC、ADC、ディスプレイコントローラー、データトランシーバー、プログラマブルアンプ、タイマー、カウンター、温度センサー(内蔵マイクロ回路を意味する)、ユーザーブロックなどです。 デジタルモジュールはワークスペースの上部にあり、アナログは下部にあります。 作業領域には、アナログモジュールとデジタルモジュールの入力と出力が接続されているバスも含まれており、これらのバスはポート(マイクロコントローラのいわゆるレッグ)に接続されています。 マウスを単に引いてクリックするだけで、任意のモジュールをインストールし、ポートにバインドできます(ただし、モジュールに空き位置がある場合)。
メインの作業タブには、重要なグローバルリソースパネルもあります。 チップの主な動作特性は、動作周波数、電力モード、一部のデジタルおよびアナログブロックの動作に必要な一部のグローバル可変分周器などです。
作業中に変更された赤で強調表示されているプロパティは、赤で強調表示されています。 Ref Muxは、チップのアナログブロックの電圧範囲です。 VCは、マイクロコントローラープロセッサのクロック周波数のシステム分周器であり、デジタルブロックとADC / DACユニットの同期動作に必要です。
1. DAC
最初のステップは、8ビットのD / Aコンバーターを意味するマイクロコントローラー(8ビットのD / Aコンバーターを意味します)にDAC8モジュールをインストールすることでした。 8ビットビットは、電圧変化の最小単位が(Vmax-Vmin)/ 256、この場合は5V / 256であることを意味します。 測定の精度は十分以上です。 DAC出力はAnalogOutBus_0バスに出力されました。 また、バス自体はコントローラーの空きポートの1つに出力され、DACはPort_0_3に出力されます。悲しいことに、スクリーンショットには表示されませんが、そこにあるのは私の言葉です。 したがって、次の図が得られました。
次に、マイクロコントローラとDAC'paを起動するために小さなコードを書く必要がありました。 重要な注意点は、デバイスがCおよびアセンブリをサポートしていることです。
#include <m8c.h> // part specific constants and macros #include "PSoCAPI.h" // PSoC API definitions for all User Modules void main(void) { DAC8_1_Start(DAC8_1_HIGHPOWER); M8C_EnableGInt ; // Uncomment this line to enable Global Interrupts while(1) { DAC8_1_WriteBlind(255);// 0 255 8 0 5 } }
手順2に示す回路に従ってボードを組み立てます。
ファームウェアマイクロコントローラー。 関数DAC8_1_WriteBlind()のさまざまな値について、テスターをデバッグします。 インジケータが適切で線形に依存している場合は、先に進み、DACユニットを扱います。
2. ADC
DAC'omがずっと簡単になったとは言わないでください。 その実装には、マイクロコントローラの最大3つのモジュールが必要でした。 1つ目は、プログラマブルオペアンプであるPGA(プログラマブルゲインアンプ)です。 ゲインにはそれほど必要ではありません(正直なところ、ゲインは1に設定されており、さらに、電源電圧よりも高い電圧を出力することはできません)が、むしろ入力抵抗を大きくする必要があります。 回路内の電流の大きさが測定の精度に影響を与えないようにします。 1つの入り口は地面に固定されており、2番目の入り口はport_0_1に掛けられています。 2番目のモジュールはDACそのものであり、ADCINC12要素の正式名称です。 ビット容量は12ビットで、入力信号の4096量子化ステップです。 DACの入力の1つはPGA出力に接続され、2つ目はデフォルトでグランドに接続されています。 また、同期動作のためのこれらすべてのもの(DAC'kaを含む)は、1つのクロックジェネレーター、またはむしろプロセッサークロック分周器に配置する必要があることに注意してください。 アナログブロックは、SysClock / 8(24MHz / 8)に等しいVC1クロック分周器に配置されます。 上記のすべての形式は、ほぼ次のとおりです。
彼らがまだ何も言っていない最後のモジュールは、ディスプレイを操作するためのインターフェースであるLCDモジュールです。 そして、外部からこれらのモジュールの正しい動作を検証することができないため、ADCとPGAの動作をデバッグするために必要です。 幸いなことに、それは動作中の回路のスペースを占有せず、設定からはたった1つのパラメーター-LCDPortがあり、デバッグボードに既にあるPort_2が必要です。
何かを見逃した場合に備えて、上記のブロックの設定のスクリーンショットを提供します
コードを変更します。
#include <m8c.h> // part specific constants and macros #include "PSoCAPI.h" // PSoC API definitions for all User Modules void main(void) { DAC8_1_Start(DAC8_1_HIGHPOWER); PGA_1_Start(PGA_1_HIGHPOWER); ADCINC12_1_Start(ADCINC12_1_HIGHPOWER); ADCINC12_1_GetSamples(0); // - LCD_Start(); LCD_Position(1,0); // M8C_EnableGInt ; // Uncomment this line to enable Global Interrupts while(1) { DAC8_1_WriteBlind(255);// 0 255 8 0 5 result = ADCINC12_1_iGetData() + 2048; ADCINC12_1_ClearFlag(); LCD_Position(1,0); LCD_PrHexInt(result); } }
印加電圧に応じて、0〜0x0FFFの範囲の数字が画面に表示されました。 すべてが正常に動作しています。 先に進みます。
3. UART
UARTはデータ転送プロトコルです。 RS232インターフェースで最も有名です。 回路にUARTブロックを配置する必要がありました。 UARTモジュールは、RX受信回線用とTX送信回線用の2つのデジタルブロックを占有します。 これらのブロックの出力は、データ転送専用に指定された特定のポートに接続されていました。 終了するにはPort_2_7、入力するにはPort_1_6。 UARTデバイスはVC3 = SysClock / 156クロックで実行する必要があります。これにより、19200のビットレートでデータを送信できます。送信にはUART_1_PutSHexInt()関数が使用されます。
そして最後に、サイクルを無限からしばらく(i <255)に変更しました。 DACに供給される値を変更し、そのたびに新しい電圧を削除することが可能です。
マイクロコントローラーのコードの最終バージョンは次のようになります。
コードの最終バージョン
//---------------------------------------------------------------------------- // C main line //---------------------------------------------------------------------------- #include <m8c.h> // part specific constants and macros #include "PSoCAPI.h" // PSoC API definitions for all User Modules int result; int i; void main(void) { DAC8_1_Start(DAC8_1_HIGHPOWER); PGA_1_Start(PGA_1_HIGHPOWER); ADCINC12_1_Start(ADCINC12_1_HIGHPOWER); ADCINC12_1_GetSamples(0); LCD_Start(); LCD_Position(1,0); UART_1_Start(UART_PARITY_NONE); M8C_EnableGInt ; // Uncomment this line to enable Global Interrupts while(i<255) { DAC8_1_WriteBlind(i); if(ADCINC12_1_fIsDataAvailable() != 0) { result = ADCINC12_1_iGetData() + 2048; ADCINC12_1_ClearFlag(); LCD_Position(1,0); LCD_PrHexInt(result); UART_1_PutSHexInt(result); /* Print result to UART */ i++; } } }
ステップ5:COMポートを盗聴する
データがコンピューターに到着するかどうかを本当に確認する方法は? 最初に、com-portが有効になっていて、コンピューターで動作しているかどうかを確認する必要があります。 Windows 7の場合-> [マイコンピュータ]-> [デバイスマネージャ]を右クリックし、テキストの右側に画像が表示されます。 これが発生しない場合、com-portは無効になっている可能性が高いため、BIOSで有効にする必要があります。
次に、構成する必要があります。
フィールドを公開します
ビット/秒-19200
データビット-8
パリティ-なし
ストップビット-1
フロー制御-なし
HyperTerminalプログラムまたは同様のものをダウンロードします。標準的なものもあるかもしれません。 起動します。 ポートCOM1を選択します。
そして、クレイジーなバイトシーケンスを取得します。
送信機は動作しています。
ステップ6:C#クライアント
VisualStudio C#を起動します。 コンソールアプリケーションを作成します。 そこに2つのクラスを追加します。 1つはComで、もう1つはc Excelで動作します(私はそれらをそれと呼びました)。 Excelを操作するためのライブラリをプロジェクトに追加します([参照設定]-> [参照の追加...]-> [拡張機能]-> [Microsoft.Office.Interop.Excel])。 Hexからintおよびintからcurrentへのすべての変換は、Program.csで行います。
Program.cs
class Program { public static List<double> ConvInToAmp(List<int> input) { List<double> converted = new List<double>(); double stap = 0.00116822; double Vdd = 4.8; double R = 50; for (int i = 0; i < 255; i++) { converted.Add(input[i] * stap); converted[i] = Vdd - converted[i]; converted[i] = converted[i] / R; //Console.WriteLine(converted[i]); } return converted; } public static List<double> CreateVolt() { List<double> volts = new List<double>(); double stap = 0.0188235294117647; for (int i = 0; i < 255; i++) { volts.Add(i*stap); } return volts; } static void Main(string[] args) { Com port = new Com(); port.Strart(); while (!port.Full()) ; port.Stop(); Console.WriteLine("Data transmission complite"); List<int> input = port.GetData(); List<double> converted = ConvInToAmp(input); Console.WriteLine("Conversin complite"); Excel exel = new Excel(CreateVolt(), converted); Console.Read(); } }
Com.cs
class Com { private List<int> values = new List<int>(); private SerialPort port = new SerialPort("COM1", 19200, Parity.None, 8, StopBits.One); private void received(object sender, SerialDataReceivedEventArgs e) { string buf; buf = port.ReadExisting(); while (!String.IsNullOrEmpty(buf)) { string str = buf.Substring(0, 4); int v = Convert.ToInt32(str, 16); buf = buf.Remove(0, 4); Console.WriteLine(v); values.Add(v); } } public void Strart() { Console.WriteLine("Incoming data:"); port.DataReceived += new SerialDataReceivedEventHandler(received); port.Open(); } public void Stop() { port.Close(); } public bool Full() { if (values.Count == 255) return true; else return false; } public List<int> GetData() { return values; } }<source lang="cs">
Excel.cs
class Excel { private List<double> xScale; private List<double> yScale; private Application exApp = new Application(); private Sheets sheets; private Worksheet worksheet; private Range range; public Excel(List<double> x,List<double> y) { xScale = x; yScale = y; exApp.Visible = true; exApp.SheetsInNewWorkbook = 1; exApp.Workbooks.Add(Type.Missing); sheets = exApp.Worksheets; worksheet = (Worksheet)sheets.get_Item(1); for (int i = 1; i < 255; i++) { range = worksheet.get_Range("A" + Convert.ToString(i), "A" + Convert.ToString(i)); range.Value = xScale[i]; range = worksheet.get_Range("B" + Convert.ToString(i), "B" + Convert.ToString(i)); range.Value = yScale[i]; } ChartObjects chartObjs = (ChartObjects)worksheet.ChartObjects(); ChartObject chartObj = chartObjs.Add(150, 20, 700,500); Chart xlChart = chartObj.Chart; xlChart.ChartType = XlChartType.xlXYScatterLinesNoMarkers; //PlotArea. Range xValues = worksheet.Range["A1", "A254"]; Range values = worksheet.Range["B1", "B254"]; SeriesCollection seriesCollection = xlChart.SeriesCollection(); Series series1 = seriesCollection.NewSeries(); series1.MarkerSize = 3; series1.XValues = xValues; series1.Values = values; } } }
すべてが正しく書き込まれて完了した場合、クライアントはデータを受け入れ、最後にExcelでグラフを表示することを書き込みます。