2024年5月7日火曜日

STM32で1bit DAC出力できるかな(1)シグマデルタAD/DA sim

秋月電子でSTM32C011J4M7という8ピンマイコンを売ってます.@140円.
これでも32bitCPUでTIMER, UART, ADC, DMAなどが一通り入ってます.
たった8ピンなので、VDD,VSS,DEBUGに喰われてしまうと4ピンしか余りません.こんなCPUで何ができるのか?

sin波発生器でも作ろうかと思うけど、これにはDACは内蔵してないんですよね.

そこで、1bit DACなら1ピンあれば出力できますから、やってみようかと思います.

シグマデルタADCについては当ブログで解説を書いたことがあります. →こちら
このブロック図で1bit streamが出てくるはずです.Vinは計算で発生させたsin波とします.

Cで計算してみた結果を示します.
 青: Vin sin波の数値をplotしたもの
 赤: out 1bit stream=1bit DAC (PWMになっている)

正しくsin波の1bit streamになっているかどうかを検算するには、赤のバタバタ波形をLPFしてやればOKです.はい、Vinと同様のsin波になりました.なおLPF特性は適当です.

以上で、programによってsin波の1bit streamを得られました.
Cのsourceをこちらに置きます.変数名はブロック図と同じにしてあります.そんなに厄介なことはやってません.

以上はLinux上で計算しましたが、短いsource codeですからSTM32の内部でも同じ計算をできます.
それは何を意味するかというと、
 1)STM32に自力でbit streamを計算させれる
 2)STM32のRAM上にsin1波分の1bit streamを展開できる
 3)DMAでcyclicに同1bit streamをGPIO出力してやれば
 4)STM32は1bit DAC型のsin波発生器になれる
 5)ただし外付けLPFは必要

DMAでどうやってGPIO出力するかはこれから考えます.
memory to peripheralなDMAをTIMERでトリガすれば良いのでなんとかなるかと思うんだが.

追記:STM32C011の仕様を確認しました.GPIOへ向けてDMAする機能は無い模様.外部へserial出力でき、かつDMAも可能なIFは、I2Sだけらしい.192kspsで32bitならば12MHzのbit streamを出力できるはずです.

追記2:STM32F207という大きめのCPUでsin波を出せました.レポは後日.


かしこ

13 件のコメント:

  1. こちら
    >CH32V003というSOP8の32bit RISCV中華マイコン。
    ではなかったのですね・・・
    ※こちらは、まず最初に環境をそろえるのが大変かも。
    まだよく理解してないのですが、「RISC-V」マイコンは、色んな所で出してますが、みーんな、
    ・個別の開発環境が必要
    なのでしょうかね?
    ※まぁ、「ARM」だって、それぞれ個別だから、同じことか。なんか、面倒だな・・・

    返信削除
    返信
    1. そういう意味では、「Arduino」が動けば、それだけでいい
      (実際は、裏で「個別のライブラリ」に、リンクしてるのですが、表からは見えないので無視)
      から、やっぱりお手軽でいいな。

      削除
    2. そうなんです.
      CH32VはArduinoIDEを使いますが、peripheralの細かい設定に手が届かないかもしれなくて、一旦休みとしました.
      STM32はSTM32CubeIDEがしっかりしたlibraryを使えるので頼もしいです.

      CH32Vでもやってみたいものです.

      #I2Sからbit streamのsin波が出ました

      削除
    3. >peripheralの細かい設定に手が届かないかも
      そうそう。例の「Longan Nano」の Arduino も、このあいだ、また見てみたのですが、結局、
      ・何も変わってない(最終更新日が、3年前のまま・・)
      ので、未だに「A/D」「D/A」が、Arduino から使えません(ハードウエアはあるのですが・・・)
      ※Arduino のソース上に、コメントで「後は自分で implement してね」って、書いてある(笑)
      「RISC-V」系は、意外にこういうのが多い。まだまだ「発展途上」です。

      削除
    4. やはりそうゆうのありますか.
      しかしADDA使えないのは宝の持ち腐れ.あんまりじゃ.
      STM32からの脱却はなかなか進まないかも.

      削除
    5. >STM32からの脱却
      「紛(まが)い物」(笑)にさえ気を付ければ、やっぱり、
      ・STM32
      なのかなー、という気はする。
      ※逆に、「自分で標準環境」を、構築して流行らせれば、
      ・有名人になれるチャンス!
      かも知れません。
      (私も、「お金と時間があれば」やりたいけど、両方ともないので・・・)
      「Hiraduino」とか、作ってたりして(笑)今がチャンスです

      削除
    6. 先日のST32F103の偽物は酷くて、TIM割り込みすらbugってるというトンデモないchipのようです.ありゃつかえん、ひー

      Hirapy-pillでも作りましょう.

      削除
    7. アイテンド製STM32F103をもっているのですが大丈夫でしょうか?

      中華の店なので偽か

      削除
    8. packageの刻印は本物っぽいにもかかわらず妙なところが動かないので、1匹いれば30匹の法則はあるかも

      削除
  2. >当ブログで解説を書いたことがあります. →こちら
    アナログアタマなので、2902オペアンプICと555で(秋月価格で合計90円)積分器+D-FF構成の非同期シグマデルタADCをシミュレーションしたことがありますが、S/Hを使うという発想はありませんでした。フロントエンドの積分器のオフセットはそのまま出力に現れるだけで、飽和はしないので動作しそうでした。同期回路にする場合はS/Hを使う方向が自然なんでしょうね。しかし、「差分だからハイパスになるんだよ平坂理論」を非同期回路のどこに適用していいのかわからないー

    返信削除
    返信
    1. S/HはADCだともいえるので、デルタシグマ回路はアナログ回路と離散値回路の中間みたいなもので理解しにくいんですよね.
      最近はあまり使われないかもなスイッチトキャパシタフィルタも連続/離散の中間みたいなもんで面白いけど判りにくいったらないです.

      削除
  3. >当ブログで解説を書いたことがあります
    あ、これもう「8年前」の記事なんだ・・・
    (そりゃぁ、自分も年取るわけだ。しかも、この数日前の記事が「親父が失踪した」と来たもんだ。光陰矢の如し。少年易老學難成 (少年老いやすく学なりがたし)

    返信削除
    返信
    1. 古いですねぇ.
      失業して13年ぐらい経ちました.光陰矢の如し.
      やってるジャンルは中学生の頃と同じですが.

      削除