2019年3月18日月曜日

STM32F4のADCでインジェクション

 STM32F4のADCで、レギュラで1chをサンプリングしながら、途中でインジェクションの変換を行ってみた。

 DACから適当にノコギリ波を出して、それをADCでサンプリング。


 青がADCの計測値、赤がDACとADCの差、横軸がミリ秒。

 DACとADCは100kSPSで変換。
 DAC/ADCを開始してから20msec後にソフトウェアでインジェクションを開始。

 インジェクションで変換したあとは誤差が大きくなっているが、これはインジェクションによってADCとDACのタイミングがずれたことによる影響だと思われる。

 ちゃんと値を計算すればいいんだけど、面倒なので、とりあえず動いてるっぽいね~ってことで。。

 インジェクションに複数の変換を指定した場合、InjectedDiscontinuousConvModeがENABLEなら1回のトリガ毎に1個の変換が行われ、DISABLEなら1回のトリガごとにすべての変換が行われる。
 インジェクションの結果はhadcx.Instance->JDRyに保存される。


 インジェクションをタイマでトリガしたいと思っていたけど、うまく動いていない。汎用タイマがもう1個あれば動きそうな気もするが、そもそも今回使いたかった用途はソフトウェアで開始してもいいので、タイマを使う必要がない。というか、よく考えたらインジェクションとか使わなくてもいいんじゃね、とか思ってるわけで。。


 インジェクションを使う際の注意点を挙げるとすれば、サンプリング期間や変換期間の見積もりを正確に行っておかないと、レギュラ変換に影響が出ること、レギュラ変換中にインジェクションを行うとレギュラ変換のタイミングが動くので、高速に変化する信号を計測するのには向かないこと、あたりだろうか。
 インジェクションを自動にしておけば規則的な周期で変換されるが、それならレギュラでいいじゃん、という話になる。

***

 CubeMXを久しぶりにアップデート。前回メジャーアップデートが出て少し経ったあたりでアップデートしたので、今回はマイナーアップデート。現在5.1.0。
 繰り返しジェネレートを行うとリンカスクリプトが空ファいるになる、みたいなバグがありそう。
 途中でELFは作れるのに書き込んでも動かない、よくよく調べてみるとHEXの中身がない、みたいな感じで、makefileしらべたりいろいろして時間を食ってしまった。
 「HEXファイルは存在していて、書き込みも正常で、でもファームウェアの書き込みはできていなくて、HEXファイルがおかしい」みたいな現象は前にもあった気がする。覚えてないけど。

 リンカスクリプトを削除してジェネレートすれば正常なファイルが出てくるので、リンカが空なら削除して再生成、が対症療法かな。
 自分でLDを書き換えていたらそれも消えるけど、そもそもCubeMXは毎回LDを上書きするので、自分で書き換えるなら別ファイルにする必要があるし、そうなれば元のLDが壊れても関係ないし。

 CMSIS RTOS APIのV2なるものがあるらしくて、ちらっとリファレンス読んだら面白そうだし、V1との互換性もある程度あるとのことなので、V2を使ってみたいんだけど、CubeMXではV2が選択できない。どうやって使うんだろう?

/****
 SLATSの軌道遷移が終わって、軌道保持運用になったっぽいですね(JAXAプレスリリース情報)。完全回帰軌道で1ヶ月、その後1週間毎に高度を変えて9月頃に180km、というスケジュールらしいので、また夏頃にでも高度プロットやります。今見ても面白くないだろうし。
*/

0 件のコメント:

コメントを投稿