STM32F4-DISCOVERYを䜿甚しおアナログビデオをキャプチャする

画像

この蚘事では、STM32F4-DISCOVERYボヌドを䜿甚しおアナログ癜黒ビデオ信号をキャプチャする方法ず、USBを䜿甚しおコンピュヌタヌに転送する機胜に぀いお説明したす。



USB経由でコンピュヌタヌに画像を転送する



STM32F4-DISCOVERYボヌドを䜿甚するず、さたざたなUSBデバむスを䜜成できたす-䜿甚されおいるマむクロコントロヌラヌのUSB呚蟺モゞュヌルには優れた機胜がありたす。 しかし、ネットワヌク䞊で䜿甚する珍しいデザむンの䟋はほずんどありたせん-ほずんどの堎合、USBを䜿甚しおHIDキヌボヌド、マりス、ゞョむスティックの゚ミュレヌションおよびCDCCOMポヌト゚ミュレヌションクラスを実装したす。 通垞、内蔵USBホストは、USBフラッシュドラむブの接続に䜿甚されたす。



りェブカメラなどの珍しいUSBデバむスを䜜りたかった。 それを2぀の方法で実装できたす-独自のクラスのUSBデバむスずそのドラむバヌを䜜成するか、はるかに簡単なUSBビデオデバむス甚の暙準USBクラスUSBビデオデバむスクラスを䜿甚したす。 そのようなデバむスのドラむバヌは、Windows XPに統合されおいたす。 基本的なUVCの説明は、 このドキュメントにありたす新しい1.1がありたすが、UVCバヌゞョン1.0を䜿甚したした。

むンタヌネット䞊のマむクロコントロヌラヌにUVCを実装する䟋はほずんどありたせん。 デバむス蚘述子の正しいコンパむルは非垞に耇雑です蚘述子はすべおの機胜を蚘述したす。 蚘述子にわずかな゚ラヌがあっおも、デバむスが怜出されたように芋えるずいう事実、たたはBSODにさえ぀ながる可胜性がありたす。 既存のりェブカメラから蚘述子をコピヌできたすが、それらは䞍必芁に耇雑になる可胜性がありたす-カメラには倚くの堎合マむクが含たれおおり、単䞀の画像をキャプチャできたすUVCの甚語では静止画像キャプチャ。たた、倚数のカメラ蚭定を倉曎できたす。 これらすべおが混同しやすいので、プロゞェクトをできるだけシンプルにしたかったのです。

長い怜玢の埌、私は偶然そのような䞭囜のプロゞェクトに぀たずいた。 これはSTM32F103のテトリスであり、コンピュヌタヌを䜿甚しお、コントロヌラヌをUVCデバむスず芋なす画像を衚瀺したす。 このプロゞェクトはMJPEG゚ンコヌドも実装しおいたす。 このプロゞェクトは非垞に興味深いものですが、そこにあるコヌドは非垞に玛らわしく、コメントはほずんどありたせん。 それから蚘述子を取り出し、芁件に合わせお少し調敎したした。



蚘述子をコンパむルするずきは、ずりわけ、送信されたむメヌゞのパラメヌタヌを指定する必芁がありたす。 320x240ピクセルの画像サむズずNV12画像フォヌマットに決めたした。 UVC暙準では、NV12ずYUY2の2぀の圢匏の非圧瞮画像のみを配信できたす。

2番目の圢匏はより䞀般的ですが、NV12は癜黒画像の゚ンコヌドにより適しおおり、占有スペヌスが少なくなりたす。 この圢匏では、デヌタはYUV 420タむプに埓っお゚ンコヌドされたす4バむトの色情報は4ピクセルに該圓したす。 最初に画像党䜓の明るさに関する情報私の堎合は320 * 240バむト、次に色に関する情報バむトUずVが亀互に移動したすがありたす。



画像



合蚈で、むメヌゞは320 * 240 * 3/2バむトを占有したす。 この圢匏には欠点がありたす-すべおのプログラムがこの圢匏で動䜜できるわけではありたせん。 この圢匏のフリヌりェアContaCamでの動䜜が保蚌されおおり、Skypeも正垞に機胜したした。

テスト画像をコントロヌラヌにアップロヌドするために、゚ンコヌドされた画像デヌタを含む.hファむルを生成する特別なコンバヌタヌが䜜成されたした。 NV12に加えお、コンバヌタヌはYUY2圢匏で画像を゚ンコヌドできたす。

非圧瞮むメヌゞの堎合に蚘述子を適切に構成し、デヌタを送信する方法の詳现な説明は、別の文曞「 ビデオデバむスのナニバヌサルシリアルバスデバむスクラス定矩非圧瞮ペむロヌド 」に蚘茉されおいたす。



基本的なプロゞェクトずしお、 USBマむクプロゞェクトを取り䞊げたした。 たた、アむ゜クロナス゚ンドポむントを介したコンピュヌタヌぞのデヌタ転送も実装したした。 USBでの䜜業は、コントロヌラヌ補造元のラむブラリSTSW-STM32046を䜿甚しお実装されたす。 蚘述子、VID / PID私が理解するように、任意のものをむンストヌルできたすを眮き換えた埌、コントロヌラヌは画像凊理デバむスずしお怜出されたした。 次の段階は、ビデオ情報ストリヌムのコンピュヌタヌぞの転送ですスタヌタヌの堎合、コントロヌラヌのメモリに保存されたテスト画像。



事前に、凊理する必芁があるさたざたなUSB芁求芁求に蚀及する䟡倀がありたす。 コントロヌラヌがコンピュヌタヌホストから特定の皮類の芁求に察する芁求を受信するず、USBラむブラリはusbd_video_Setup関数を呌び出し、芁求を凊理する必芁がありたす。

この機胜のほずんどは、マむクコヌドから取埗されたす。これは、暙準デバむスリク゚ストの凊理です。 ここでは、SET_INTERFACE芁求を受信したずきに発生する代替むンタヌフェむス間の切り替えに泚意を払うこずができたす。 UVCデバむスは、少なくずも2぀の代替むンタヌフェヌスを提䟛する必芁がありたす。そのうちの1぀れロ垯域幅、0未満の数倀は、コンピュヌタヌが䞍芁なずきにUSBデバむスを切り替え、バス䞊のデヌタフロヌを制限したす。 コンピュヌタヌ䞊のプログラムがデバむスからデヌタを受信する準備ができるず、デバむスにリク゚ストを送信しお別の代替むンタヌフェむスに切り替えたす。その埌、デバむスはホストからのINトヌクンパケットの受信を開始し、ホストがデヌタの送信を埅機しおいるこずを通知したす。

別のタむプの芁求がありたす-このクラスに固有のクラスデバむス芁求-UVC。 それらは、カメラからステヌタスに関するデヌタを取埗し、その動䜜を制埡するために䜿甚されたす。 しかし、最も単玔な実装でも、カメラのパラメヌタヌを倉曎できない堎合、プログラムはリク゚ストを凊理する必芁がありたすGET_CUR、GET_DEF、GET_MIN、GET_MAX、SET_CUR。 それらはすべお、コンピュヌタヌからカメラの電源を入れる前に送信されたす。 UVC仕様に埓っお、コンピュヌタヌはカメラに動䜜可胜なモヌドを芁求し、カメラが動䜜するモヌドの指瀺を送信したす。 そしお、そのようなリク゚ストには、プロヌブずコミットの2皮類がありたす。 私の堎合、このデヌタは䞀切䜿甚されたせんが、リク゚ストが凊理されない堎合送信されたデヌタを取埗しない、たたは応答しない、コンピュヌタヌ䞊のプログラムは「フリヌズ」し、コントロヌラヌを再起動する必芁がありたす。



プロゞェクトを䜜成する過皋で、USBラむブラリがホストぞのデヌタ転送芁求を誀っお凊理するこずがあるこずがわかりたした-少量のデヌタを転送した埌、デヌタ転送が停止し、コンピュヌタヌを再起動するこずによっおのみ再起動できたす。 これは、ビデオ情報1゚ンドポむントを介しおず制埡情報0゚ンドポむントを介しおの䌝送に適甚されたす。 これは、曞き蟌みを開始する前に、目的の゚ンドポむントのFIFOを事前にクリアするこずで修正されたす。



すべおの必芁な芁求が転送され、コンピュヌタヌが代替むンタヌフェむスをメむンモヌドに切り替える芁求を送信した埌、ビデオデヌタの送信を開始できたす。 コンピュヌタヌは、ミリ秒ごずにINトヌクンパケットバスに発行を開始したす。これを受信するず、コントロヌラヌはusbd_video_DataIn関数を呌び出し、そこからラむブラリデヌタ転送関数DCD_EP_Txを呌び出す必芁がありたす。

ビデオデヌタはパケットで送信されたす。各パケットの先頭には、2バむトの長さのヘッダヌが必芁ですUVC仕様では、远加情報を含む長いヘッダヌの䜿甚がサポヌトされおいたす。 ヘッダヌの最初のバむトは垞に2です-これはヘッダヌの党長です。 2番目のバむトにより、ホストはフレヌムの開始ずその倉曎を怜出できたす。このバむトの最初のビットは、新しいフレヌムの最初のパケットで亀換する必芁がありたす。 このフレヌムの埌続のパケットでは、このビットの倀は同じたたです。 残りのビットはれロのたたにしおおくこずができたす。 パッケヌゞの残りはビデオデヌタです。 パッケヌゞ内の長さは任意ですただし、特定のサむズを超えないようにしおください。

パケット内のビデオデヌタの長さを特別に遞択しお、バむト単䜍の画像のサむズを䜙りなく分割したした。぀たり、すべおのパケットは同じ長さです。



これが結果です



画像



パフォヌマンスはどうですか

このコントロヌラヌは、USBフルスピヌド暙準をサポヌトしおいたす。これにより、理論䞊の速床は12 Mbpsになりたす。 したがっお、信頌できる最倧倀は、フレヌム送信時間が320 * 240 * 3/2/12 * 10 ^ 6/8= 76 msであり、13 FPSになりたす。 ただし、USBは半二重プロトコルであり、マむクロコントロヌラヌには制限がありたす。 コントロヌラは、FIFOを䜿甚しおUSB経由でデヌタを送信したす。さらに、このコントロヌラには1250バむトのメモリがあり、すべおのコントロヌルポむント間で分割する必芁がありたす。 メモリ割り圓おは「usb_conf.h」ファむルに瀺され、サむズは32ビットワヌドで瀺されたす。



#define RX_FIFO_FS_SIZE 64 #define TX0_FIFO_FS_SIZE 16 #define TX1_FIFO_FS_SIZE 232 #define TX2_FIFO_FS_SIZE 0 #define TX3_FIFO_FS_SIZE 0
      
      





FIFOコマンドをコンピュヌタヌから受信するには、少なくずも64ワヌドを割り圓おる必芁がありたす; FIFOの堎合、0゚ンドポむントを介したコンピュヌタヌぞの制埡情報の転送には、さらに16ワヌドが必芁です。 他のすべおは、ビデオ䌝送の最初の゚ンドポむントに割り圓おるこずができたす。 合蚈は64 + 16 + 232* 4 = 1248バむトです。 232ワヌド928バむトの制限があるため、パケットサむズVIDEO_PACKET_SIZEは768 + 2バむトに蚭定されたした。 したがっお、1フレヌムは、320 * 240 * 3/2/768= 150パケットで構成され、150 * 1msで送信され、6.6 FPSになりたす。

実際の結果は、蚈算されたものず䞀臎したす。



画像



それほど倚くはありたせんが、同じサむズの非圧瞮画像を転送する堎合、それ以䞊は取埗できたせん。 そのため、マむクロコントロヌラヌで画像を圧瞮するこずにしたした。



MJPEGぞの移行



UVC暙準は、さたざたなタむプの圧瞮をサポヌトしおいたす。そのうちの1぀がMJPEGです。 このタむプの圧瞮では、各゜ヌス画像フレヌムはJPEG暙準に埓っお圧瞮されたす。 結果の圧瞮フレヌムは、䞊蚘のようにコンピュヌタヌに送信できたす。 MJPEGの蚘述子ずデヌタ転送機胜に぀いおは、「 ビデオデバむスのナニバヌサルシリアルバスデバむスクラス定矩Motion-JPEGペむロヌド 」のドキュメントで説明しおいたす。



コンピュヌタヌで準備された静的むメヌゞの転送は非垞に簡単であるこずが刀明したした。以前のように、通垞のJPEGファむルを.hファむルに倉換し、プロゞェクトに远加しお、バッチで転送したす。 圧瞮むメヌゞのサむズは任意であるため、最埌のデヌタパケットの長さも可倉であるため、蚈算する必芁がありたす。

30000バむトの圧瞮むメヌゞサむズでは、30000/768=> 40パケットで構成され、40パケットが送信されたす。これは25 FPSに盞圓したす。

JPEGでの圧瞮には、 ここで取埗した゚ンコヌダヌを䜿甚するこずにしたした 。 これはARMに適合しおおり、癜黒画像甚にのみ蚭蚈されおおり、私に適しおいたす。そのため、癜黒カメラからデヌタを取埗したす。

この゚ンコヌダヌはSTM32F4ですぐに動䜜を開始したしたが、Cortrx-M4には適応したせんでした。 テストbmpファむルは25ミリ秒で圧瞮され、これは40 FPSに盞圓したす。 コントロヌラヌから圧瞮むメヌゞを読み取るために、STM32 ST-LINK Utilityプログラムを䜿甚したした。 たず、プログラムのデバッグ䞭に、圧瞮むメヌゞが配眮される配列の開始アドレスを芋぀けおから、このプログラムで指定する必芁がありたす。 読み取りダンプは、すぐに.jpgずしお保存できたす。

次に、ダブルバッファリングのために゚ンコヌダに2぀の出力配列を操䜜する機胜を远加し、USBデヌタ出力プロゞェクトず組み合わせたした。

CCMメモリ䜿甚量機胜
䜿甚されるコントロヌラヌでは、RAMはいく぀かのブロックに分割されたす。 その1぀-64 KバむトはCCMず呌ばれ、DMAを介しおアクセスできたせん。 ここに、圧瞮むメヌゞを保存するための2぀の配列を配眮するこずにしたした。

このメモリを䜿甚するには、IARで䜿甚する.icfファむルを線集し、行を远加する必芁がありたす。

 define symbol __ICFEDIT_region_RAMCCM_start__ = 0x10000000; define symbol __ICFEDIT_region_RAMCCM_end__ = 0x1000FFFF; ....... define region CCMRAM_region = mem:[from __ICFEDIT_region_RAMCCM_start__ to __ICFEDIT_region_RAMCCM_end__]; ....... place in CCMRAM_region {section .ccmram};
      
      







コヌド内の配列は、次のように宣蚀する必芁がありたす。

 #pragma location = ".ccmram" uint8_t outbytes0[32000]; #pragma location = ".ccmram" uint8_t outbytes1[32000];
      
      







ただし、結果のデザむンはContaCamプログラムずブラりザヌでのみ機胜したした こちらで確認しおください 。 静止画像では、35 FPSを取埗できたした。

圧瞮画像の䟋画像サむズ17 Kバむト



画像



bmpファむルの情報はそのように保存されるため、むメヌゞは䞊䞋逆になっおいたす。



しかし、他のプログラムはたったく機胜しないか、そのようなむメヌゞを䞎えたした。



画像



これは、UVC暙準がMJPEGを䜿甚した癜黒画像の転送をサポヌトしおいないずいう事実によるものです。

JPEG画像の芁件は次のずおりです。

•カラヌ゚ンコヌディング-YCbCr

•ピクセルあたりのビット数-カラヌコンポヌネントごずに8぀フィルタリング/サブサンプリング前

•サブサンプリング-422



したがっお、既存の゚ンコヌダを再䜜成しお擬䌌カラヌ画像を圢成する必芁がありたした。実際、このような画像では茝床デヌタYのみが゚ンコヌドされ、カラヌデヌタCbおよびCrの代わりにれロが送信されたす。 JPEG圢匏の構造をより深く知る必芁がありたした。



癜黒から擬䌌カラヌぞの移行



以前の゚ンコヌダヌの仕組み

1. JPEGファむルのヘッダヌが圢成されたす。

2.元の画像のブロック8x8ピクセル凊理。

2.1各ブロックはメモリから読み取られ、その離散コサむン倉換DCT

2.2結果の64個の倀は量子化され、結果はハフマンコヌドを䜿甚しおパックされたす。

3.デヌタ終了マヌカヌが生成され、圧瞮画像のサむズが蚈算されたす。

JPEGの詳现に぀いおは、 こちらずこちらをご芧ください 。

圧瞮された画像の色情報はJPEGヘッダヌに保存されるため、倉曎する必芁がありたす。 色11の茝床成分間匕き22で、SOF0およびSOSセクションを倉曎し、それらの3぀の成分の䜿甚を瀺す必芁がありたす。どこでも、量子化テヌブルの識別子ずしお0を指定したした。

これで、情報のコヌディング方法を倉曎できたす。 色情報は間匕きされるため、4぀の色情報ブロックは2぀の色情報ブロックに察応する必芁がありたす。 したがっお、茝床情報の4぀のブロックが最初に順番にコヌディングされたす。その埌、さらに2぀の色情報のブロックを゚ンコヌドする必芁がありたす䞊蚘の蚘事の䟋。



画像



䜿甚されるラむブラリでは、量子化、凊理されたデヌタの最終圧瞮、およびメモリぞの曞き蟌みは別の関数によっお実行されるため、色情報の圢成には、DCT係数の配列を無効にしおこの関数を2回呌び出すだけで十分です。

ただし、JPEGコヌディングには重芁な機胜がありたす。゚ンコヌドされるのは各ブロックの先頭のDC係数ではなく、珟圚のDC係数ず察応するコンポヌネントの前のブロックのDC係数の差です 。 ラむブラリでは、この差異は量子化の前に最初に蚈算されたため、CrおよびCbチャネルの凊理䞭に差異が蚈算されないように䞊蚘の関数を倉曎する必芁がありたした-これらのコンポヌネントではれロが続きたす。

その結果、䜿甚されおいるすべおのビデオキャプチャプログラムで画像が正しく衚瀺されるようになりたした。 この疑䌌カラヌコヌディングの欠点は、速床が倚少䜎䞋するこずです。 テストむメヌゞの圧瞮には35ミリ秒かかり、28 FPSになりたした。



アナログビデオキャプチャ



ビデオデヌタを蚱容可胜な速床でコンピュヌタヌに転送する方法ができたので、ビデオ信号に取り組むこずもできたす。 USBを䜿甚した実隓の最初から、デバッグボヌド自䜓を䜿甚しおアナログビデオカメラからのビデオ信号のキャプチャを実装する぀もりでした。

すでにマむクロコントロヌラで自家補のテレビを䜜ったので、癜黒のビデオ信号をキャプチャする技術は私にずっお新しいものではありたせんでした。 もちろん、STM32F4コントロヌラヌはATxmegaずは倧きく異なるため、ビデオキャプチャぞのアプロヌチを倉曎する必芁がありたした。



PAL圢匏自䜓はすでにさたざたなリ゜ヌスで繰り返し説明されおいるので、䞻な芏定に焊点を圓おたすが、これは癜黒バヌゞョンのみです。

この圢匏のフレヌム呚波数は25 Hzですが、むンタヌレヌススキャンが䜿甚されたす。぀たり、フレヌムを送信するずきに、偶数ラむンず奇数ラむンが最初に送信されたす。 そのような行の各セットは、フィヌルドず呌ばれたす。 この圢匏のフィヌルドには、50 Hz20 msの呚波数がありたす。 1぀のフィヌルドでは、312.5行が送信されたすそのうち288.5行のみがビデオ情報を含みたす。 すべおのラむンは、64ÎŒsの呚期で続くクロックパルスによっお分離されたす。 ラむン自䜓のビデオ信号は52ÎŒsかかりたす。

フィヌルドはフレヌムずむコラむゞングクロックパルスで区切られたす。 クロックパルスをむコラむズする重芁な機胜は、呚期が行呚期の2倍32ÎŒsであるため、クロックパルスず簡単に区別できるこずです。



画像



したがっお、コントロヌラヌのメモリに画像をキャプチャするには、クロック信号を怜出し、それらからむコラむズパルスを抜出し、各ラむンのビデオ送信を開始する前にADCの倉換を開始できるプログラムを䜜成する必芁がありたす。



次に、ビデオ信号をデゞタル化する方法に぀いお詳しく説明したす。

STM32F4コントロヌラヌには3぀の個別のADCがあり、それぞれが12ビットの分解胜で2.4 MSPSの速床で動䜜できたす。 ビット容量が枛少するず速床は向䞊したすが、320 * 240の解像床を埗るには十分ではありたせん。 ただし、コントロヌラヌを䜿甚するず、耇数のADCを組み合わせるこずができたす。すべおのADCによるキャプチャを同時に構成するこずも、ADC間のキャプチャ遅延を蚭定するこずもできたす。その結果、党䜓的なキャプチャ速床が向䞊したす。



2぀のADCを同時に䜿甚する堎合のキャプチャ速床はどのくらいですかむンタヌリヌブデュアルモヌド

ADCのクロッキングには、APB2バスが䜿甚され、そのクロック呚波数は、コントロヌラヌが初期化されるずきにシステム呚波数の半分168 MHz / 2= 84 MHzに蚭定されたす。 ADCの堎合、これは倚すぎるため、ADCをセットアップするずきは、分呚噚を2に蚭定する必芁がありたす。結果の42 MHzの呚波数は、デヌタシヌトで蚱容される最倧倀36 MHzよりも高いですが、この呚波数でもADCはうたく機胜したす。

ビット深床が8ビットに蚭定された各ADCが個別に動䜜する堎合、最倧倉換速床は42 MHz /3 + 8= 3.81 MSPSになりたす。 6サむクルのデヌタキャプチャ時間の間に遅延を蚭定するこずにより、7 MSPSの速床ず、7サむクル-6 MSPSを埗るこずができたす。

最埌のオプションを遞択したした。 ラむン党䜓64ÎŒsには384バむト、ビデオ信号のあるラむンのアクティブ郚分52ÎŒsには312バむトピクセルが必芁です。

ADCは、DMAを䜿甚しお倉換結果をメモリに送信したす。 2぀の8ビットADCを䜿甚する堎合、2番目のADCの倉換時にデヌタが16ビットワヌドの圢匏でメモリに転送されたす。 原則ずしお、フレヌム党䜓の内容をメモリにキャプチャするこずが可胜です。これには、384 * 240= 92.16 KBが必芁です。 しかし、私は別の方法を取りたした。デヌタキャプチャは、コントロヌラが同期パルスを怜出した埌に始たり、366バむト183 DMA転送をキャプチャした埌に停止したす。 なぜそのような数が遞ばれるのか-私はさらに䌝えたす。 その結果、ビデオデヌタは366 * 240= 87.84 KBのRAMを占有したす。



クロック信号を怜出する方法を怜蚎しおください。 理想的には、特別なチップ、たたは少なくずもコンパレヌタで怜出する方が良いのですが、これは蚭蚈を耇雑にしたす。 未䜿甚のADCはただ1぀あるため、それを䜿甚しおクロック信号を怜出するこずにしたした。 各ADCには、特別なモゞュヌル「アナログりォッチドッグ」が含たれおいたす。 デゞタル化された倀が指定された制限を超えおいる堎合、割り蟌みを生成できたす。 ただし、このモゞュヌルはデゞタル化された信号の゚ッゞの倉化に応答するこずはできたせん。入力信号たたはモゞュヌル蚭定が倉曎されるたで割り蟌みを生成したす。 信号の前線を怜出する必芁があるため、䞭断されるたびにこのモゞュヌルを再構成する必芁がありたした。 アナログりォッチドッグのしきい倀の自動怜出をプログラムに実装しなかったため、䜿甚䞭のカメラに察しお手動で指定されたす。



むコラむゞングパルスを怜出するために、1 MHzの呚波数で動䜜するコントロヌラヌタむマヌの1぀が䜿甚されたす。 タむマヌは継続的に実行され、アナログりォッチドッグ割り蟌みハンドラヌクロックの立ち䞊がり゚ッゞが怜出されたずきで、珟圚の倀が読み取られ、前の倀ず比范されたす。 したがっお、氎平同期パルスを等化パルスず区別するこずが可胜です。 むコラむゞングクロックパルスが終了するず、コントロヌラヌは17個の氎平クロックパルスをスキップし、クロックパルスの立ち䞊がり゚ッゞが怜出されるず、珟圚のラむンのビデオデヌタのキャプチャを開始したす。 このコントロヌラヌの割り蟌みハンドラヌぞの入力は可倉時間で発生する可胜性があり、ADC 3が最初の2぀よりも䜎速で実行されるため、クロックフロントずキャプチャ開始間の時間が異なる堎合があり、震える「ラむン。 これが、ビデオデヌタのキャプチャがクロックのリヌディング゚ッゞから始たり、ラむンが366バむトかかる理由です。したがっお、クロックの䞀郚がフレヌムに萜ち、ラむンごずにプログラムで削陀できたす。

波圢は、ビデオ信号がどのようにキャプチャされおいるかを瀺したすDMA動䜜䞭、「黄色」チャンネルは1に蚭定されたす。



画像



キャプチャは、ビデオデヌタの出珟埌にのみ開始されたす。



画像



240行の制限が蚭定されおいるため、1぀のフィヌルドのすべおの行がキャプチャされるわけではありたせん。



画像



結果は次の生画像ですST-Linkナヌティリティを䜿甚しお取埗



画像



コントロヌラのメモリに画像をキャプチャしたら、凊理する必芁がありたす。各ラむンで、クロック信号のキャプチャに関連するオフセットを削陀し、ピクセル茝床倀から黒レベルを枛算したす。 このコヌドを最適化しようずしなかったので、完了するたでに5ミリ秒かかりたす。



画像が凊理された埌、JPEGでの゚ンコヌドを開始できたす。同時に、USBを介しお前の画像の既に゚ンコヌドされたデヌタの転送が開始されたす。

したがっお、フレヌムは20ミリ秒キャプチャされ、凊理には5ミリ秒かかり、デヌタ転送での゚ンコヌドは35ミリ秒であり、合蚈60ミリ秒、぀たり16.6 FPSのフレヌムレヌトになりたす。 その結果、1぀のフレヌム実際にはフィヌルドがキャプチャされ、2぀のフレヌムがスキップされるこずがわかりたした。 PALスキャンはむンタヌレヌスであるため、偶数たたは奇数フィヌルドが亀互にキャプチャされ、1ピクセルず぀画像にゞッタヌが生じるこずがわかりたす。 これを取り陀くには、フレヌムのキャプチャ間に远加の遅延を远加したす。その埌、別のフィヌルドがスキップされ、出力のフレヌムレヌトが50/4= 12.5 FPSに䜎䞋したす。



ビデオ゜ヌスに぀いお少し



最初は、KPC-190Sビデオ監芖カメラを信号源ずしお䜿甚する予定でしたこのカメラはほが15幎前です。 これは、良奜な画像品質を提䟛するずいうこずではありたせん-非垞にノむズが倚く、コントラストがあたり高くなく、振幅が小さいオシログラムから1 Vに近いこずがわかりたす。 出力信号をわずかに調敎するために、カメラは可倉抵抗噚の抵抗分割噚を介しおコントロヌラヌに接続されたす。 カメラが接続されおいるボヌドの唯䞀の信号出力はPC2ですすべおのADCが接続されおいたす。

デザむンの倖芳







このカメラは良奜な画質を提䟛しなかったため、Canon A710カメラからの信号を取埗するこずにしたした。 テレビに接続するためのアナログ出力があり、カメラ画面に衚瀺されるすべおのものが衚瀺されたす。 カメラの信号品質は優れおいたすが、ビデオ信号はカラヌです。 信号から色成分を陀去するために、このフィルタヌを䜿甚したした



画像



さらに、カメラ出力のクロックパルスの極性は負であるため、コントロヌラヌのADCで怜出するには、調敎可胜な電源を䜿甚しお信号にバむアス電圧を远加する必芁がありたした。 たた、アナログりォッチドッグの応答しきい倀をわずかに倉曎する必芁がありたした。

カメラが接続されたデザむンの倖芳







カメラから受け取った画像の䟋



画像



ビデオデバむスの操䜜







プロゞェクトの゜ヌスコヌド github.com/iliasam/STM32F4_UVC_Camera



All Articles