2024年11月10日日曜日

STM32 ADCのinjection modeは地球を救うか

STM32ポエムです.

ADCをTIMでトリガしてDMAで動かしています.DMAはリングバッファに積んでゆきます.リングバッファが満杯になると割り込みがかかりますので処理します.

ここで、リングバッファが満杯になるには1秒かかります.

一方で、JUST NOWにAD変換したい時もあります.しかし勝手に動いているADCは最悪1秒待たせるかもしれません.これは困った.

こりゃsystemが成立しないなぁと気付き、STM32を2つ搭載して、
 1)DMAで動くADC
 2)ソフトでトリガするADC
の役割分担させるしかないなと思いました.めんどくさい.

なのですが、、、ふと思いついたwordがありました.ADCの設定に「injection mode」という謎の言葉があったんです.一定周期で廻っているADCに割り込み変換させられるんじゃないだろうか? すなわち、1と2を両立できるかもしれない.

AN3116がADCを解説しています.
The injected group has priority over the regular channel group. It interrupts the conversion of the current channel in the regular channel group.
つまり、injected(2)はregular(1)よりも高優先度でAD変換するというわけです.なんか期待通り.これは朗報.CPUを2個使わなくても済むかもしれない.

というわけで、STM32 ADC injectionを試してみるのです.うまくいくかな.

締め切り日は近い・・・

追記:injectionは使えませんでした、あぅぅぅ
理由:16ch scan conversionをやってます.しかしinjectionは最大で4ch scanしか出来ません.死にました.

追記2:DMA pointerを知る手段があるとかなんとか・・・マジなの? 器用すぎるだろ
__HAL_DMA_GET_COUNTER(__HANDLE__)
↑こんな器用なdefineがあります.bufferの残量が返されるらしい.

追記3:試したところ、bufferの残り量を採取出来ているようです.hdma_adc1はADCに紐づけたDMAのハンドラです.ADC1のハンドラでは動きませんでした.
int rem = __HAL_DMA_GET_COUNTER(&hdma_adc1);

かしこ

13 件のコメント:

  1. >16ch scan conversionをやってます
    そうだったんですか・・・・これ、普通の企業案件だったら、最初から、
    ・無難に「2chip or 4chip」で、分担処理
    させてるんだろうな。。。。
    ※他の要件が厳しそうだから、これを「1chip」でやるとか、別な要件
    (「価格重視」とか)でもない限りは、変に冒険しないだろうな・・・・
    (私が過去に居た設計部門は、「自分で考えるな」が、モットーだったから、回路なんて
    みんな「どこかのコピペ」で、こういう冒険は「許されません」でしたね。なんかあったら、
    ・オリジナル(回路)の所為に出来る
    ・あるいは「チップ(メーカー)の所為」にする
    とかの、「逃げが出来無い」ことは、「絶対禁止」でした(笑)

    ある意味、とても「羨ましい」です

    返信削除
    返信
    1. 多ch ADC chipって制御が面倒で捨てましたー!
      アーキテクチャはわたしが勝手に決めるのでもうCPUをフル活用したるわーというヤケです
      1ch試作の次は16ch試作となるとアーキテクチャがガラポンでやんす
      新幹線は16両編成なのですごいなぁなどとイミフな感想を持つこのごろ

      削除
    2. >1ch試作の次は16ch試作
      え‘、じゃぁ、逆に、
      ・ch毎に、「CPU一つ」
      なんですか・・・・逆になんかスゴイなw
      (これも、企業案件なら「C/Pが悪い」で、「却下」ですね・・・・
      「1chip 多チャンネル」も「1chip 1ch × マルチCPU」も、両方とも、何故か、
      「ふつーはやらない(笑)」ですね・・・だいたい、その中間で「妥協」になる。)

      >アーキテクチャはわたしが勝手に決める
      なんか、これぞ
      ・趣味と実益を兼ねる
      感じでいいなぁ・・・・何でもやり放題(笑)

      削除
    3. CPU16個でもダメ言われなかったでしょうけど、同期運転とか面倒なのでCPU1個に集約しましたが、メモリサイズやUSB転送レートなど確認事項は多々あり3weeksぐらい足踏みして現在に至る....

      削除
    4. >CPU1個に集約
      「16ch 入力」って、ありましたっけ??
      と思って、STM32H723 のデータシート見たら、
      ・2×16-bit ADC, up to 18 channels
      ってありますね・・・・(しかも、各チャネル毎に、タイマーが割り付け出来る、って書いてある・・・・なんか、もうこれだけで「脳が溶けて」くる・・・)
      チップの用途に、「モータ制御」「PLC (の中身として使える?と言う意味か)」
      ってあるから、まぁ、「そういう用途」を、想定してんでしょうけど。

      削除
    5. なので、CPUをADCとして使うのもある意味で便利っちゃべんりなもんで

      削除
    6. 読者
      新幹線は16両にモーターがついているので小さいモータを16両につける 欧州のユーローライナーは でかい馬力の機関車のモーターで ひっぱっているそうな 行きと帰りがあるから 先頭車両とお尻の車両にモーターがついているのかな? 鉄道よく知らないので嘘かもです

      削除
    7. 鉄の人曰く、動力不在のいわゆる客車は静かでよろしいんだそうで

      たまに通勤電車で、床下のコンプレッサーか何かが爆発しそうな音立てます あれはなんなのだ?

      削除
    8. 読者 いつも東海道線は運転席の前のレールを見ていたのだけれど 他の車両はモーターがうるさいことにきづく 車掌と運転手はうるさくないようにできているのですねえ

      削除
    9. 国鉄車両騒音デカイです

      削除
    10. 読者
      まだ国鉄時代車両が残存しているのですね
      みんなタイかシンガポール送りになったかと思ってました ディーゼルだろうけど

      削除
    11. 国鉄と営団地下鉄で行こう!

      削除