皆さん、こんにちは。
今回はnucleof401reとov7670で動体カメラに挑戦(高FPS化を目指す)してみました。
前々回ほど前にov7670を使って画像取得をしましたが(こちら)

0.5FPS以下であり
これではあまりにも一枚の画像取得に時間をかけ過ぎてしまい、クアッドコプターに積んでもタダのゴミと化してまいます。
そこで、今回はDMA転送で高FPS化を目指し速い動きもしっかり撮らえられるようにしたいと思います。


TIM/DMA転送

今回はov7670から8bitパラレルインタフェースで画像データをPCLKのタイミングで取得するのでTIM/DMAを使ってみました。
 

そもそもTIMとはタイマーの事なのですが イ  ンプットキャプチャ(Input Capture)機能を使う事により設定したトリガが発生すると、その時点でのカウント値をキャプチャレジスタへ格納する事が可能でピリオドを1に設定すれば立ち下がりエッジ毎に設定した入力ポートから指定した配列等に転送可能です。
ですがov7670はHREFがhighの時のみデータが有効でそれ以外は無効データが出力されます。
もっと言うとVSYNCのタイミングでDMA要求をしなければフレームがずれてしまいます。
なので、NANDを使ってHREFがhighでかつPCLKがlowの時だけに0が出力されるように論理回路を組みVSYNCの割り込みでDMA要求をさせるようにしました。
VSYNCの割り込みは最初のタイミングさえ合えばいいので、DMA要求後は割り込みを禁止させます。
また、今回はSPI LCDを使います。
image

こちらもDMA転送でSPI通信をさせました。
タッチパネルの機能等は今回は使いませんが、余裕が出来たら弄ってみたいと思います。

途中、フレームの大きさが合わず画像が壊れてしまったりしてしまいました…

image


しばらくして……………






image

ついにDMAで画像取得に成功しました!
https://youtu.be/_py5fvrtjL0
これなら余裕で動体カメラとして使えそうです

今後はハフ変換等の画像解析のプログラムを組んでいこうと思います。ではまた、

〈追記〉
ov7670のDMA転送プログラムを公開しました。良かったら参考までに…

https://developer.mbed.org/users/tmnt/code/ov7670_dma_nucleo_f4/