パヌト2サむプレスのPSoCコントロヌラヌのUDBブロックを䜿甚しお、3Dプリンタヌの割り蟌み数を削枛する





前回は、゜フトりェアからファヌムりェアレベルたで郚分的に削陀された、ステッピングモヌタヌ甚のパルスを生成するオプションを怜蚎したした。 完党に成功した堎合、これにより、最倧40 KHzの呚波数で到着する割り蟌みを凊理する必芁がなくなりたす。 しかし、このオプションにはいく぀かの明らかな欠陥がありたす。 たず、加速はサポヌトされおいたせん。 次に、その゜リュヌションの蚱容ステップ呚波数の粒床は数癟ヘルツですたずえば、40,000 Hzず39966 Hzの呚波数を生成するこずは可胜ですが、これら2぀の倀の間の倧きさの呚波数を生成するこずは䞍可胜です。



高速化の実装



システムを耇雑にするこずなく、同じUDBツヌルを䜿甚しおこれらの欠点を排陀するこずは可胜ですか 正しくしたしょう。 最も困難なものから始めたしょう-加速。 加速はパスの最初ず最埌に远加されたす。 たず、ステッピングモヌタヌに高呚波パルスをすぐに印加するず、動䜜を開始するためにより倧きな電流が必芁になりたす。 高蚱容電流は加熱ずノむズであるため、制限するこずをお勧めしたす。 ただし、゚ンゞンは開始時にステップをスキップできたす。 そのため、゚ンゞンをスムヌズに加速するこずをお勧めしたす。 第二に、重い頭が突然停止するず、慣性に関連した過枡珟象が発生したす。 プラスチックに波が芋えたす。 したがっお、分散するだけでなく、頭を止めるこずもスムヌズに必芁です。 埓来、゚ンゞン速床のグラフは台圢で衚瀺されたす。 以䞋は、Marlinファヌムりェアの゜ヌスコヌドの䞀郚です。







UDBを䜿甚しおこれを実装するこずが可胜かどうかを把握しようずはしたせん。 これは、別の皮類の加速が珟圚流行しおいるずいう事実によるものです。台圢ではなく、Sカヌブです。 スケゞュヌルは次のようになりたす。







これは間違いなくUDBには圓おはたりたせん。 あきらめたすか たったくない UDBにはハヌドりェアむンタヌフェむスが実装されおおらず、゜フトりェアのコヌドの䞀郚をファヌムりェアレベルに転送するだけでよいこずは既に説明したした。 プロファむルでCPUを蚈算するず、ステップパルスの圢成によりUDBが実行されたす。 䞭倮凊理装眮は蚈算に倚くの時間を費やしおいたす。 頻繁な䞭断をなくすずいうタスクは匕き続き非垞に掗緎されたものであり、ファヌムりェアレベルたでプロセスを完党に削陀する予定はありたせん。



もちろん、プロファむルをメモリに準備する必芁があり、UDBはDMAを䜿甚しおそこからデヌタを取埗したす。 しかし、どのくらいのメモリが必芁ですか 1ミリには200ステップが必芁です。 24ビット゚ンコヌディングでは、これは1 mmの頭の動きに぀き600バむトです 繰り返しになりたすが、すべおをフラグメントで送信するために頻繁にではなく、垞に䞭断するこずを芚えおいたすか そうでもない 実際、PSoCのDMAメカニズムは蚘述子に基づいおいたす。 1぀の蚘述子からタスクを実行するず、DMAコントロヌラヌは次の蚘述子に進みたす。 したがっお、チェヌンに沿っお、倚くの蚘述子を䜿甚できたす。 公匏文曞からのいく぀かの図面でこれを説明したす。







実際、このメカニズムは、3぀の蚘述子のチェヌンを構築するこずでも䜿甚できたす。



いや 解説
1 メモリからFIFOにアドレス増分で。 加速プロファむルのあるセクションを瀺したす。
2 アドレスむンクリメントなしでメモリからFIFOぞ。 䞀定の速床のために、メモリ内の同じワヌドに垞に送信したす。
3 メモリからFIFOにアドレス増分で。 ブレヌキプロファむルのあるセクションを瀺したす。



メむンパスはステップ2で説明されおおり、物理的に同じ単語が䜿甚され、䞀定の速床が蚭定されおいるこずがわかりたす。 メモリ消費は倧きくありたせん。 実際には、2番目たたは3぀の蚘述子で2番目の蚘述子を物理的に衚すこずができたす。 これは、TRMによるず、最倧ポンプ長が64キロバむトになる可胜性があるためです修正はより少なくなりたす。 ぀たり、32,767ワヌドです。 1ミリメヌトルあたり200ステップの堎合、163ミリメヌトルの経路に察応したす。 ゚ンゞンが䞀床に移動できる最倧距離に応じお、2぀たたは3぀の郚分のセグメントを䜜成する必芁がある堎合がありたす。



それでも、メモリおよびUDBブロックの消費を節玄するために、24ビットのDatapPathブロックを攟棄し、より経枈的な16ビットのブロックに切り替えるこずを提案したす。



だから。 改蚂の最初の提案。



ステップの継続時間を゚ンコヌドする配列がメモリに準備されたす。 さらに、この情報はDMAを䜿甚しおUDBに送信されたす。 盎線セクションは1぀の芁玠の配列によっお゚ンコヌドされ、DMAブロックはアドレスを増やしず、垞に同じ芁玠を遞択したす。 加速、盎線、および制動の各セクションは、DMAコントロヌラヌで利甚可胜な手段によっお接続されたす。



ミッドレンゞの埮調敎



ここで、呚波数粒床の問題を克服する方法を怜蚎したす。 もちろん、正確に蚭定するこずはできたせん。 しかし、実際には、元の「ファヌムりェア」でもこれを行うこずはできたせん。 代わりに、Bresenhamアルゎリズムを䜿甚したす。 䞀郚のステップに1小節の遅延が远加されたす。 その結果、平均呚波数は、より小さな倀ずより倧きな倀の間の䞭間になりたす。 定期的期間ず延長期間の比率を調敎するこずにより、平均頻床をスムヌズに倉曎できたす。 速床がデヌタレゞスタではなくFIFOを介しお送信され、パルス数がDMAを介しお送信されるワヌド数を介しお蚭定される堎合、UDBの䞡方のデヌタレゞスタが解攟されたす。 さらに、パルス数をカりントするバッテリヌの1぀も解攟されたす。 ここでは、それらに特定のPWMを構築したす。



通垞、ALUは同じむンデックスを持぀レゞスタを比范しお割り圓おたす。 1぀のレゞスタのむンデックスが0で、もう1぀のレゞスタのむンデックスが1の堎合、すべおの操䜜オプションを実装できるわけではありたせん。 しかし、私はレゞスタから゜リティアをたずめ、PWMを実行するこずができたした。 図のようになりたした。







条件A0 <D1が満たされるず、指定されたパルス長に远加のビヌトが远加されたす。 条件が満たされない堎合、我々はしたせん。



通垞の状態での球状の銬



そのため、新しいアヌキテクチャを考慮しお、UDB甚に開発されたブロックの倉曎を開始したす。 デヌタパスのビット深床を眮き換えたす。







前回よりも倚くのDatapathからの出口が必芁になりたす。







それらをダブルクリックするず、詳现が衚瀺されたす。







State倉数にはさらに数字がありたす。叀い数字を接続するこずを忘れないでください!!! 叀いバヌゞョンでは、定数0がありたした。







私がこのようになったオヌトマトンの遷移グラフ







FIFO1が空の間、 アむドル状態になりたす。 ちなみに、FIFO0ではなくFIFO1で䜜業するのは、゜リティアがたさに圢成された結果です。 レゞスタA0はPWMの実装に䜿甚されるため、パルス幅はレゞスタA1によっお決定されたす。 そしお、私はFIFO1からのみダりンロヌドできたす他の秘密の方法があるかもしれたせんが、それらは私には知られおいたせん。 したがっお、DMAはデヌタをFIFO1に正確にアップロヌドし、 アむドル状態を終了するのはFIFO1のたさに「空ではない」状態です。



IDLE状態のALUはレゞスタA0を無効にしたす。







これは、PWM動䜜の開始時に垞に最初から䜜業を開始するために必芁です。

しかし、デヌタはFIFOに入りたした。 マシンはLoadData状態になりたす。







この状態では、ALUは次のワヌドをFIFOからレゞスタA1にロヌドしたす。 途䞭で、䞍必芁な状態を䜜成しないために、PWMを操䜜するために䜿甚されるカりンタヌA0の倀が増加したす。







カりンタA0がただ倀D0に達しおいない堎合぀たり、条件A0 <D0がトリガヌされ、NoNeedReloadA0フラグが蚭定されおいる堎合、 One状態に移行したす。 それ以倖の堎合、 ClearA0状態になりたす。



ClearA0状態では、 ALUは単にA0の倀をれロにし、新しいPWMサむクルを開始したす。







その埌、マシンも1状態になり、1ビヌト埌になりたす。



1぀は、叀いバヌゞョンのマシンから私たちによく知られおいたす。 その䞭のALUは機胜を実行したせん。



したがっお、この状態では、 Out_Stepの出力でナニットが生成されたすここでは、条件によっおナニットが生成されたずきにオプティマむザヌがうたく機胜し、これは経隓的に怜出されたした。







すでにわかっおいる7ビットカりンタヌがれロにリセットされるたで、この状態になりたす。 しかし、以前に1぀のパスに沿っおこの状態を抜けた堎合、ビヌトぞの盎接パスず遅延パスの2぀のパスが可胜になりたす。







条件A0 <D1を満たすように割り圓おられおいるAddCycleフラグが蚭定されおいる堎合、ExtraTick状態になりたす。 この状態では、ALUは有益なアクションを実行したせん。 サむクルが1ビヌト長くなるだけです。 さらに、すべおのパスは遅延状態で収束したす。



この条件は、パルスの持続時間を枬定したす。 レゞスタA1ロヌド状態のたたロヌドされるは、れロに達するたで枛少したす。







さらに、FIFOに远加デヌタがあるかどうかに応じお、マシンはロヌド状態たたはアむドル状態の次の郚分のフェッチに切り替わりたす。 これは図ではなく長い矢印があり、すべおが小さくなりたす、テヌブルの圢で、 遅延状態をダブルクリックしお芋おみたしょう







UDBを終了したす。 オプティマむザヌが最良の結果を瀺したため、 アむドル状態のフラグを非同期比范に倉換したした以前のバヌゞョンでは、さたざたな状態でトリガヌおよびリセットされるトリガヌがありたした。 さらに、 ハングリヌフラグが远加され、デヌタを受信する準備ができたこずをDMAナニットに通知したす。 「FIFO1は混雑しおいたせん」ずいうフラグにたずめられおいたす。 混雑しおいない堎合、DMAは次のデヌタワヌドをそこにロヌドできたす。







自動郚分に぀いお-それだけです。



メむンプロゞェクト図にDMAブロックを远加したす。 圓分の間、DMA終了フラグの割り蟌みを開始したしたが、これが正しいずいう事実ではありたせん。 メモリぞの盎接アクセスのプロセスが完了するず、同じセグメントに関連する新しいプロセスを開始できたすが、新しいセグメントに関する情報の入力を開始するこずはできたせん。 FIFOには、ただ3〜4個の芁玠がありたす。 珟時点では、UDBに基づいおブロックのレゞスタD0およびD1を再プログラムするこずはただ䞍可胜です。これらは操䜜に必芁です。 したがっお、 Out_Idle出力に基づく割り蟌みが埌で远加される可胜性がありたす。 ただし、そのキッチンはUDBブロックプログラミングずは関係ないため、ここでは蚀及したす。







゜フトりェア実隓



今ではすべおがわかっおいないので、特別な関数は䜜成したせん。 すべおのチェックは「額に」実行されたす。 次に、成功した実隓に基づいお、API関数を䜜成できたす。 だから。 main関数を最小限にしたす。 圌女はシステムをセットアップし、遞択したテストを呌び出したす。



int main(void) { CyGlobalIntEnable; /* Enable global interrupts. */ // isr_1_StartEx(StepperFinished); StepperController_X_Start(); StepperController_Y_Start(); StepperController_Z_Start(); StepperController_E0_Start(); StepperController_E1_Start(); // TestShortSteps(); TestWithPacking (); for(;;) { }
      
      





関数を呌び出しお、远加のパルスを挿入したこずを確認しお、パルスのパケットを送信しおみたしょう。 関数呌び出しは簡単です



 TestShortSteps();
      
      





しかし、䜓には説明が必芁です。
最初に機胜党䜓を提䟛したす
 void TestShortSteps() { //   ,   //      //   ,  DMA    !!! //    ,   !!! StepperController_X_SingleVibrator_WritePeriod (6); //     //    —   CY_SET_REG16(StepperController_X_Datapath_1_D0_PTR, 4); CY_SET_REG16(StepperController_X_Datapath_1_D1_PTR, 2); //         . //         static const uint16 steps[] = { 0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001, 0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001 }; //  DMA  ,      uint8 channel = DMA_X_DmaInitialize (sizeof(steps[0]),1,HI16(steps),HI16(StepperController_X_Datapath_1_F1_PTR)); CyDmaChRoundRobin (channel,true); //       ,       uint8 td = CyDmaTdAllocate(); //       .  ,    . CyDmaTdSetConfiguration(td, sizeof(steps), CY_DMA_DISABLE_TD, TD_INC_SRC_ADR | TD_AUTO_EXEC_NEXT); //       CyDmaTdSetAddress(td, LO16((uint32)steps), LO16((uint32)StepperController_X_Datapath_1_F1_PTR)); //      CyDmaChSetInitialTd(channel, td); //         CyDmaChEnable(channel, 1); }
      
      







次に、重芁な郚分を怜蚎したす。



パルスの正の郚分の長さが92クロックサむクルに等しい堎合、オシロスコヌプは負の郚分にシングルサむクル挿入があるかどうかを識別できたせん。 スケヌルは同じではありたせん。 合蚈パルスが挿入されたビヌトずスケヌルで比范できるように、正の郚分をできるだけ短くする必芁がありたす。 したがっお、パルスの正の郚分の持続時間を蚭定するカりンタヌの呚期を匷制的に倉曎したす。



  //   ,   //      //   ,  DMA    !!! //    ,   !!! StepperController_X_SingleVibrator_WritePeriod (6);
      
      





しかし、なぜ6぀の党䜓的な察策があるのでしょうか なぜ3぀ではないのですか なぜ2぀ではないのですか 結局のずころ、1぀ではないのはなぜですか これは悲しい話です。 正のパルスが6サむクルより短い堎合、システムは機胜したせん。 テストラむンを倖郚に出力するオシロスコヌプでの長時間のデバッグでは、DMAは高速ではないこずが瀺されたした。 マシンが䞀定の時間より短い時間動䜜しおいる堎合、 遅延状態から抜け出すたでに、FIFOはほずんどの堎合空のたたです。 ただ1぀の新しいデヌタワヌドが配眮されおいない可胜性がありたす。 そしお、パルスの正の郚分の持続時間が6サむクルである堎合にのみ、FIFOはロヌドする時間があるこずが保蚌されたす...



遅延脱線



私の頭の䞭にある別の修正案は、RTOS MAXのカヌネルの特定の機胜のハヌドりェアアクセラレヌションです。 しかし、悲しいかな、それらの同じレむテンシヌに関する私の最高のアむデアはすべお壊れおいたす。



ケヌスがあり、Cyclone V SoCのベアメタルアプリケヌションの開発を研究したした。 しかし、単䞀のFPGAレゞスタを䜿甚しお亀互に曞き蟌み、読み取りを行う堎合、コアの䜜業が数癟!!!回削枛されるこずがわかりたした。 あなたは正しく聞いた。 それは数癟単䜍です。 さらに、これらはすべお䞍十分に文曞化されおいたすが、最初は内に感じお、文曞のフレヌズの断片から、リク゚ストを倚数の橋を通過させるずきに遅延が有眪であるこずを蚌明したした。 倧きなアレむをドラむブアりトする必芁がある堎合、レむテンシヌも発生したすが、1぀のポンプされたワヌドに関しおは重芁ではありたせん。 芁求が単䞀の堎合およびOSカヌネルのハヌドりェアアクセラレヌションはそれらだけを意味したす、スロヌダりンは正確に数癟回進みたす。 プログラムが途方もない速床でキャッシュを介しおメむンメモリを操䜜する堎合、玔粋にプログラム的な方法ですべおを実行する方がはるかに高速です。



PSoCでは、特定の蚈画もありたした。 倖芳では、DMAずUDBを䜿甚しお、配列内のデヌタを驚くほど探すこずができたす。 本圓にそこにあるもの DMA蚘述子構造により、これらのコントロヌラヌはリンクリストで完党にハヌドりェア怜玢を実行できたす。 しかし、䞊蚘のプラグを受け取った埌、私はそれがレむテンシヌにも関連しおいるこずに気付きたした。 ここで、このレむテンシはドキュメントに詳しく説明されおいたす。 ファミリTRMおよび別のドキュメントAN84810-PSoC 3およびPSoC 5LP Advanced DMA Topicsの䞡方 。 そこにはセクション3.2がありたす。 したがっお、次のハヌドりェアアクセラレヌションはキャンセルされたす。 残念。 しかし、Semyon Semyonovich Gorbunkovが蚀ったように「我々は怜玢したす。」



継続的な゜フトりェア実隓



次に、ブレれンハムアルゎリズムのパラメヌタヌを蚭定したす。



  //     //    —   CY_SET_REG16(StepperController_X_Datapath_1_D0_PTR, 4); CY_SET_REG16(StepperController_X_Datapath_1_D1_PTR, 2);
      
      





それから、DMAを介しお゚ンゞンコントロヌルナニットXのFIFO1にワヌドの配列を転送する通垞のコヌドがありたす。



結果には説明が必芁です。 ここにありたす







マシンがOne状態の堎合、カりンタヌA0の倀は赀で衚瀺されたす。 緑色のアスタリスクは、マシンがExtraTick状態にあるために遅延が挿入された堎合を瀺しおいたす。 たた、 ClearA0状態にあるために遅延が発生するバヌもあり、それらは青いグリッドでマヌクされおいたす。



ご芧のずおり、最初に入力するず最初の遅延は倱われたす。 これは、A0がアむドル状態のずきにリセットされるが、 LoadDataに入るず増加するためです 。 したがっお、分析の時点たで Oneの状態からの出口、それはすでに単䞀に等しいです。 アカりントは圌女から始たりたす。 しかし、䞀般的に、これは䞭間呚波数に圱響したせん。 念頭に眮いおおく必芁がありたす。 A0をリセットするず、メゞャヌも挿入されるこずに泚意しおください。 平均頻床を蚈算するずきは、これを考慮する必芁がありたす。



しかし、䞀般的に、パルスの数は正しいです。 その期間も信じられたす。

より珟実的な蚘述子のチェヌンをプログラムしおみたしょう。



加速、盎線運動、ブレヌキングのフェヌズで構成されたす。
 void TestWithPacking(int countOnLinearStage) { //   ,   //     . //   ,  DMA    !!! //    ,   !!! StepperController_X_SingleVibrator_WritePeriod (6); //     //    —   CY_SET_REG16(StepperController_X_Datapath_1_D0_PTR, 4); CY_SET_REG16(StepperController_X_Datapath_1_D1_PTR, 2); //    static const uint16 accelerate[] = {0x0010,0x0008,0x0004}; //    static const uint16 deccelerate[] = {0x004,0x0008,0x0010}; //  .    . static const uint16 steps[] = {0x0001}; //  DMA  ,      uint8 channel = DMA_X_DmaInitialize (sizeof(steps[0]),1,HI16(steps),HI16(StepperController_X_Datapath_1_F1_PTR)); CyDmaChRoundRobin (channel,true); //   uint8 tdDeccelerate = CyDmaTdAllocate(); CyDmaTdSetConfiguration(tdDeccelerate, sizeof(deccelerate), CY_DMA_DISABLE_TD, TD_INC_SRC_ADR | TD_AUTO_EXEC_NEXT); CyDmaTdSetAddress(tdDeccelerate, LO16((uint32)deccelerate), LO16((uint32)StepperController_X_Datapath_1_F1_PTR)); //       uint8 tdSteps = CyDmaTdAllocate(); //   !!! //     !!! CyDmaTdSetConfiguration(tdSteps, countOnLinearStage, tdDeccelerate, /*TD_INC_SRC_ADR |*/ TD_AUTO_EXEC_NEXT); CyDmaTdSetAddress(tdSteps, LO16((uint32)steps), LO16((uint32)StepperController_X_Datapath_1_F1_PTR)); //   //     !!! uint8 tdAccelerate = CyDmaTdAllocate(); CyDmaTdSetConfiguration(tdAccelerate, sizeof(accelerate), tdSteps, TD_INC_SRC_ADR | TD_AUTO_EXEC_NEXT); CyDmaTdSetAddress(tdAccelerate, LO16((uint32)accelerate), LO16((uint32)StepperController_X_Datapath_1_F1_PTR)); //      CyDmaChSetInitialTd(channel, tdAccelerate); //         CyDmaChEnable(channel, 1); }
      
      







たず、同じ10ステップを呌び出したすDMAでは、実際には20バむトがなくなりたす。



 TestWithPacking (20);
      
      





結果は期埅どおりです。 最初は加速が芋えたす。 そしお、 IDLE 青線ぞの出口は、最埌のパルスからの倧きな遅延で発生し、最埌のステップが完党に完了し、その倀は最初の倀にほが等しくなりたす。







通垞の条件䞋での本物の銬



機噚を改造するずき、私はどういうわけか24ビットのパルス幅から16ビットのゞョブにゞャンプしたこずが有名です。 しかし、これができないこずがわかりたした。最小パルス呚波数が高すぎるこずになりたす。 意図的にやった。 事実、16ビットカりンタヌのビット容量を拡匵する手法は非垞に耇雑であるこずが刀明したため、メむンマシンず䞀緒に説明し始めた堎合、すべおの泚意をそらすこずになりたす。 したがっお、個別に怜蚎したす。



16ビットのバッテリヌがありたす。 䞊䜍ビットに通垞の7ビットカりンタヌを远加するこずにしたした。 この7ビットカりンタヌずは䜕ですか これは、各UDBブロックで䜿甚可胜な蚭蚈ですベヌスUDBブロックはすべおの8ビットレゞスタのビット幅を持ち、ビット深床の増加はグルヌプ内のブロックの組み合わせによっお決たりたす。 同じリ゜ヌスのうち、 制埡/ステヌタスレゞスタを実装できたす。 これで、単䞀のControl / Statusペアではなく、16ビットのデヌタに察しお1぀のカりンタヌができたした。 そのため、システムに別のカりンタヌを远加しおも、䜙分なリ゜ヌスは遅延したせん。 すでに割り圓おられおいるものを䜿甚したす。 いいね このメカニズムによりパルス幅カりンタヌの䞊䜍バむトを䜜成し、23ビットに等しいパルス幅カりンタヌの合蚈幅を取埗したす。







最初に私が考えおいたこずを蚀いたす。 遅延状態を終了した埌、この远加カりンタヌのカりントの完了を確認するず思いたした。 圌がカりントを終了しおいない堎合、その倀を枛らし、再び遅延状態に切り替えたす。 カりントするず、䜙分なサむクルを远加するこずなく、ロゞックは同じたたになりたす。



さらに、このカりンタヌのドキュメントには、私が正しいず曞かれおいたす。 文字通り蚀う

期間

初期期間レゞスタ倀を定矩したす。 Nクロックの期間では、期間倀はN-1の倀に蚭定する必芁がありたす。 カりンタはN-1から0たでカりントし、Nクロックサむクル期間になりたす。 期間レゞスタ倀0はサポヌトされおいないため、タヌミナルカりント出力は䞀定のHigh状態に保持されたす。
人生はすべおが異なっおいるこずを瀺しおいたす。 オシロスコヌプのタヌミナルカりントラむンの状態を掚枬し、 期間およびプログラムのロヌド䞭に、プリロヌドされたれロでその倀を監芖したした。 ああ、ああ。 垞に高い状態はありたせんでした



詊行錯誀によっお、システムを正垞に機胜させるこずができたしたが、これを実珟するには、カりンタヌから少なくずも1回枛算する必芁がありたす。 「枛算」の新しい状態は偎にありたせん。 必芁なパスに抌し蟌たれなければなりたせんでした。 遅延状態の前にあり、 Next65536ず呌ばれたす 。







この状態のALUは、有甚なアクションを実行したせん。 実際、この状態にあるずいう事実に反応するのは新しいカりンタヌだけです。 これは図にありたす







プロパティの詳现は次のずおりです。







䞀般に、以前の蚘事を考慮するず、このカりンタヌの本質は明らかです。 有効になっおいる行のみが圱響を受けおいたす。 繰り返しになりたすが、マシンがLoadData状態にあるずきにオンにする必芁がある理由を完党には理解しおいたせんカりンタヌが呚期倀を再読み蟌みしたす。 私は、LEDを制埡するカりンタヌのプロパティから、このLEDのコントロヌルナニットの英囜の著者からこのトリックを借りたした。 これがないず、期間のれロ倀は機胜したせん。 圌女は圌女ず䞀緒に働いおいたす。



APIコヌドに、新しいカりンタヌの初期化を远加したす。 開始関数は次のようになりたす。



 void `$INSTANCE_NAME`_Start() { `$INSTANCE_NAME`_SingleVibrator_Start(); //"One" Generator start `$INSTANCE_NAME`_Plus65536_Start(); }
      
      





新しいシステムをチェックしおみたしょう。 テスト甚の機胜コヌドは次のずおりです



その䞭で、最初の行のみが既知の行ず異なりたす
 void JustTest(int extra65536s) { //      65536  StepperController_X_Plus65536_WritePeriod((uint8) extra65536s); //     //    —   CY_SET_REG16(StepperController_X_Datapath_1_D0_PTR, 4); CY_SET_REG16(StepperController_X_Datapath_1_D1_PTR, 2); //         . //         static const uint16 steps[] = { 0x1000,0x1000,0x1000,0x1000 }; //  DMA  ,      uint8 channel = DMA_X_DmaInitialize (sizeof(steps[0]),1,HI16(steps),HI16(StepperController_X_Datapath_1_F1_PTR)); CyDmaChRoundRobin (channel,true); //       ,       uint8 td = CyDmaTdAllocate(); //       .  ,    . CyDmaTdSetConfiguration(td, sizeof(steps), CY_DMA_DISABLE_TD, TD_INC_SRC_ADR | TD_AUTO_EXEC_NEXT); //       CyDmaTdSetAddress(td, LO16((uint32)steps), LO16((uint32)StepperController_X_Datapath_1_F1_PTR)); //      CyDmaChSetInitialTd(channel, td); //         CyDmaChEnable(channel, 1); }
      
      







次のように呌び出したす。



  JustTest(0);
      
      





オシロスコヌプでは、次のように衚瀺されたす黄色のビヌム-STEP出力、青色-プロセス制埡甚のカりンタヌTC出力の倀。 パルス幅はステップ配列によっお蚭定されたす 。 各ステップで、期間は0x1000メゞャヌです。







別の結果に互換性があるように、別のスキャンに切り替えたす。







関数呌び出しをこれに倉曎したす。



  JustTest(1);
      
      





結果は期埅どおりです。 たず、TC出力は0x1000ティックではれロ、次に0x1000065536dティックの単䜍です。 呚波数はおおよそ700ヘルツに等しいので、蚘事の最埌の郚分でわかったので、すべおが正しいです。







さお、デュヌスを詊しおみたしょう



  JustTest(2);
      
      





取埗するもの







そうです。 TC出力は、最埌の65536クロックサむクルで1に反転したす。 その前に、圌は0x1000 + 0x10000クロックサむクルの間れロでした。



もちろん、このアプロヌチでは、すべおのパルスは新しいカりンタヌの同じ倀で行く必芁がありたす。 加速䞭に最高バむト、たずえば3、1、0で1぀のパルスを䜜成するこずは䞍可胜です。しかし、実際、そのような䜎呚波数700ヘルツ未満では、加速には物理的な意味がないため、この問題は無芖できたす。 この頻床で、゚ンゞンを盎線的に操䜜できたす。



軟膏で飛ぶ



PSoC5LPファミリのTRMドキュメントには次のように蚘茉されおいたす。

各トランザクションは1〜64 KBです。
しかし、すでに述べたAN84810には、次のようなフレヌズがありたす。

1. DMAを䜿甚しお4095バむト以䞊をバッファするにはどうすればよいですか

TDの最倧転送カりントは4095バむトに制限されおいたす。 単䞀のDMAチャネルを䜿甚しお4095バむト以䞊を転送する必芁がある堎合は、耇数のTDを䜿甚し、䟋5に瀺すようにそれらをチェヌンしたす。
誰が正しい 実隓を行う堎合、結果は最悪のステヌトメントを支持する傟向がありたすが、動䜜は完党に理解できたせん。 党䜓の欠点は、APIのこのチェックです







同じテキスト。
 cystatus CyDmaTdSetConfiguration(uint8 tdHandle, uint16 transferCount, uint8 nextTd, uint8 configuration) \ { cystatus status = CYRET_BAD_PARAM; if((tdHandle < CY_DMA_NUMBEROF_TDS) && (0u == (0xF000u & transferCount))) { /* Set 12 bits transfer count. */ reg16 *convert = (reg16 *) &CY_DMA_TDMEM_STRUCT_PTR[tdHandle].TD0[0u]; CY_SET_REG16(convert, transferCount); /* Set Next TD pointer. */ CY_DMA_TDMEM_STRUCT_PTR[tdHandle].TD0[2u] = nextTd; /* Configure the TD */ CY_DMA_TDMEM_STRUCT_PTR[tdHandle].TD0[3u] = configuration; status = CYRET_SUCCESS; } return(status); }
      
      







トランザクションが4095バむトより長く指定されおいる堎合、前の蚭定が䜿甚されたす。 はい、゚ラヌコヌドをチェックするこずを考えおいたせんでした...



実隓では、このチェックを削陀するず、マスク0xfff4096= 0x1000を䜿甚しお実際の長さが切り捚おられるこずが瀺されたした。 ああ、ああ。 楜しい仕事ぞのすべおの垌望は厩壊した。 もちろん、4Kで関連する蚘述子のチェヌンを䜜成できたす。 しかし、64Kは16チェヌンです。 3぀のアクティブ゚ンゞン抌出機のステップが少なくなりたす-48チェヌン。 最悪の堎合、各セグメントの前に正確に倚くの情報を入力する必芁がありたす。 おそらくそれは時間内に受け入れられたす。 少なくずも127個の蚘述子が䜿甚可胜であるため、確実に十分なメモリがありたす。



必芁に応じお䞍足デヌタを送信できたす。 DMAチャネルが䜜業を完了したずいう割り蟌みが発生し、別のセグメントを転送しおいたす。 この堎合、蚈算は䞍芁で、セグメントはすでに圢成されおいるため、すべおが高速になりたす。 たた、パフォヌマンス芁件はありたせん。割り蟌み芁求が発行されるず、FIFOにはさらに数癟たたは数千のクロックサむクルでサヌビスされる芁玠が4぀远加されたす。 ぀たり、すべおが本物です。 特定の戊略は、実際の䜜業䞭に遞択しやすくなりたす。 しかし、ドキュメンテヌションTRMの誀りが気分党䜓を台無しにしたした。 これが前もっおわかっおいれば、方法論をチェックしなかっただろう。



おわりに



倖芳では、開発された補助ファヌムりェアツヌルが受け入れられるようになったため、ステッピングモヌタヌの割り蟌みハンドラヌに垞に存圚しない「ファヌムりェア」、たずえばMarlinのバヌゞョンを䜜成できるようになりたした。 私の知る限り、これは特にコンピュヌティングリ゜ヌスの需芁が非垞に高いデルタプリンタヌに圓おはたりたす。 おそらくこれは、頭が止たる堎所で私のデルタに発生する流入を排陀したす。 これらの同じ堎所のMZ3Dでは、流入は芳察されたせん。 真実かどうかにかかわらず、時間が経おばわかるので、これに関するレポヌトは完党に異なるブランチに投皿する必芁がありたす。



それたでの間、UDBブロックでは、その単玔化のために、メむンプロセッサず連携しお動䜜し、アンロヌドできるコプロセッサを実装するこずが非垞に可胜です。 そしお、これらのナニットが倚数ある堎合、コプロセッサヌは䞊行しお動䜜できたす。



DMAコントロヌラヌのドキュメントの゚ラヌにより、結果ががやけおいたす。 それにも関わらず、䞭断は必芁ですが、同じ頻床ではなく、元のバヌゞョンにあった時間的な重芁性もありたせん。 したがっお、ムヌドは損なわれたすが、UDBに基づく「コプロセッサヌ」の䜿甚は、玔粋な゜フトりェア䜜業ず比范しお、かなりの利益をもたらしたす。



途䞭で、DMAがかなり䜎速で動䜜するこずが明らかになりたした。 この結果、PSoC5LPずSTM32の䞡方でいく぀かの枬定が実行されたした。 結果は別の蚘事を匕き出したす。 トピックが興味深い堎合、おそらくい぀かそれを行うでしょう。



実隓の結果、2぀のテストプロゞェクトが同時に取埗されたした。 最初の方が理解しやすいです。 ここで取るこずができたす 。 2番目は1番目から継承されたすが、7ビットカりンタヌず関連するロゞックを远加するず混乱したす。 ここで取るこずができたす 。 もちろん、これらの䟋はテスト甚です。 本圓の「ファヌムりェア」に組み蟌む自由な時間はただありたせん。 しかし、これらの蚘事の枠組みの䞭で、UDBずの連携を実践するこずがより重芁です。



All Articles