2024年5月21日火曜日

備忘録 エアコン工具 ゲージマニホールド構造

エアコン取付工具のゲージマニホールドというのがあります.
これの内部結線構造がどうなっているのかをいつも忘れちゃうんです.
とりわけ圧力計は何処についてるんでしょうねぇ・・・・

その度にnetを探して画像検索とか、使い方を解説したサイトを見る.
でも、そうゆう説明を求めてるわけじゃないんだよなぁ.

わたしが求めるのは、結線図を描いてくれればそれでいい.あとは自分で考えるから.

というわけで、備忘録のためイラストを描きました.
真空ポンプで挙動を確かめてこうゆう結線なのだろうという想像図です.
(あでも、まちがってても責任もたないもん)
とくに左右に凸の常時閉のコネクタは使ったことないのであまり自信ない.
ひら感想:
・圧力計の取り付き方が独特です.外観から想像される取り付き方とイメージがズレてるんだよなぁ.だから、久しぶりに使おうとするといつも悩みます
・中央空間をバルブで閉じることはできません

かしこ

YAMAHA電動車椅子NiMHバッテリー 不揮発メモリ解析(1)

YAMAHAの電動車椅子ユニットのNiMHバッテリー.新品で5万円ぐらいする.300回で劣化.日常使いするモノにしてはコスパ悪いもんです.
少し器用な人ならば、バラしてNiMHだけ交換するのを思いつくことでしょう.そうゆう業者もいます.わたしも自分で交換したことがあります.ただし自分でNiMH交換するのには問題があるんです.

問題とは?
バッテリパックの内部基板がこれです.右上のchipがEEPROMで、型名M24C04です.4kBit I2C.
EEPROMの中に充放電回数などが記憶されていて、寿命判定で充電しなくさせるとか、リフレッシュさせるとか、そうゆう操作を充電器にやらせる判断材料になっています.このせいで、自力でNiMHだけを新品に交換しても寿命を延ばせないんです.

バッテリー交換業者はEEPROMをリセットする手順を知っているのでしょうから業者がNiMH交換するなら問題ないのだと想像します.

netを徘徊してもこのEEPROM reset手順の情報は見当たりません.

そこでEEPROMをハックしてみるかというのがこの投稿の目的です.

ーーーー
M24C04の仕様
4kbit
clock <400kHz

ハッキング方法
M24C04へ通じるI2Cを脇から盗聴したい.

プラン1:
最も簡単なやりかたはこれだけど、STM32内のI2Cが反応してACKを返してバスが衝突するんじゃないかなと思う.
追記:STM32のI2Cは謂わばmaster(clkを出す人)なのでこれ無理なんだわ
プラン2:
STM32内I2Cを使わずに割り込みとport読みでやる方法.SCL周波数がいくらなのか? 割り込みが対応できる速度なのか? それ次第ですね.
プラン3:
かったるいけど堅実なやり方はこれかと.めんどうだけど.
どうしようかなぁ・・・・

SCL,SDAの観測
123の判断材料としてSCL,SDAの波形を知りたい.
↓こんな感じでSCL,SDAを直接観測します.
↓まずはSCL周波数を知りたい.最短28kHzぐらいになってる.意外に遅い.あと5Vスイングしてやがる.
↓これも重要な情報です.I2C規格のSTOP/STARTが映っています.おおよその時間を読むと、
 SCL→STOP 5uSec
 SCL→START 10uSec
これはsoftで処理するにはtiming的に厳しい.(hardwareでなら無問題)
なぜかというと、5uSec間隔でGPIO割り込みが発生するのは短すぎてCPUが取りこぼすだろうから.プラン2は実現が難しそうかなぁ.

プラン1Aを思いついたので、それを試してみます.乞うご期待.

追記:プラン2をpollingのみでやる(割り込み無し)ので上手くできそうな感じがする.HAL driverでGPIOアクセスすると遅いのですが、LL libraryを使うとGPIOアクセスが結構速くなります.

2へ

あでゅ~

2024年5月20日月曜日

つばさの感想

あまり興味がなかったのでヒラ的にはスルー気味だったつばさの党.黒川がNHK党と仲良しだった頃以降しか知らなくて、参政党攻撃に忙しい人々との認識ぐらいしかなかった.タイーホを契機に背景がほじくり返されて、へーっ面白いねと評価しつつある(悪い意味で).

あの黒川ってオリーブの木の主唱者の1人だったのね.サヨクのこの指止まれシステムだ.その当時から続く人脈的には「れいわ」に連なる.労働組合系とは違うんだろう.

そんなサヨクがどうしてNHK党とつるんでいたのかは不思議だけどな.立花が発明した政党助成金ビジネス(公金チューチューの1形態)が黒川とNHK党の接点だったのかもしれない.というかたぶんそこだろう.

警察がまた面白いんだ.
黒川達をタイーホしたのって、小池からガミガミ言われて渋々やったふりしたんだろうと思ってた.でも実際はそんな手ぬるい状況ではなくて、捜査本部を設置してつばさに出入りしていた業者にまで捜査が及んでいるそうだ.警察はオウムみたいに本気なのか.警察署で暴れたのをすごく怒ってます? あははー

黒川みたいな騒音突撃は、かつては右翼の得意技だった.「竹下登の褒め殺し」とかやってた.中田英寿の「君が代は試合の前に歌うもんじゃない」との発言に猛抗議&猛圧力かけてたのも懐かしい.
それが今じゃ右翼は大人しくなって街宣突撃なんか見なくなったもんだ.秋篠宮、マコーリン、小室Kなんかが皇室内部から皇室破壊してるんじゃさすがの極右もやる気が失せたか? あははー

右翼が去った後によりにもよって「選挙で街宣突撃」やっちまったのがサヨクだったというのがバカすぎて興味深い.かつての右翼の得意技だった「騒音暴力」「猛圧力」という実力行使をサヨクが乗っ取ってしまった.

ヒラ的には諸々の未来をこう予想していた.
 安部暗殺 →真犯人は別にいるだろ →警察無力
 つばさの選挙暴力 →警察は黒川を見逃す →各陣営が自警団結成
 保守もサヨクも実弾攻撃の応酬 →昭和10年代のようなカオスの現出
 皇室の失墜、世継ぎ不在
 サヨク政権 →首相公選制 →ヒットラーみたいな奴の出現 →戦争
そう、カオスだよ、カオスになるんだよ.

ところが今般、警察が黒川と周辺を大弾圧するみたいなので、少しは安全方向に振れたかなとは思う.少しだけどね.岸田みたいなのが総理になるようじゃ大筋ではロクな方向にはならんよ.

警察の捜査が山本太郎まで行ったら面白いけど、マスコミは全員黙るだろうな.マスコミしね.

かしこ

2024年5月19日日曜日

幕張へ

おはよーございます.本日は幕張へ行きます.がんばります.

10:50
湾岸は空いてた。千葉市のかっぱ寿司。
子供に頼まれてぼっち・ざ・ろっく!コラボ商品を注文。たったこれだけで3,000円。バッカたけぇ。くれいじー
先日のロックフェスにボッチちゃんが出場して物販即売り切れなどと賑わっていたそうです。場違いなアニヲタの大量動員でロック関係者の皆様にご迷惑をお掛けしました。この場を借りましてお詫び申し上げそうろう。

11:15
7/11で珈琲。クルマで郊外のコンビニに居ると耐震診断の記憶が蘇る。先日その建築事務所は店じまいしちゃいました。壊れた建物を浴びるほど裏側まで観察できたのは何物にも代え難い経験値でした。

12:30
幕張温泉 湯楽の里
ひと風呂浴びて休憩中。混んでる。男子多い。
空気が澄んでいれば対岸のツリーとか見えるらしいが今日は何も見えない。
サウナは暑さが苦手なのでやめました。
さてとお顔に保湿ローションを塗りましょう。

13:00
micropythonって何なの?
ROMでN88−BASICが立ち上がるPC8801みたいなものですね。PCリモートだけでなく組み込みも出来るのだろうか? いずれにせよ味見する意欲があまりわかない。

13:40
エアコンOFFなのか休憩所が暑くて屋上ヘ逃げてきた。幕張の中層マンション群は変な風景だと思った。

19:00
家からの連絡が、早く帰ってこい→帰ってくるな→帰ってきてよい と2転3転したのに振り回されました.大井で降りて島忠太田千鳥店へ寄って帰宅しました.

温泉で読んだ記事ですが、トラックドライバーの残業上限が年間960時間に制限される2024年問題のせいでヤマト運輸の経営が立ちゆかなくなるのではと心配されてるそうです.アベレージ月80時間働かないと経営崩壊する会社ってのはかな~りハードコアですな.あははー、すげぇ奴らだwww

あでゅ~

2024年5月18日土曜日

選挙watch みんな選挙に行けぇ!とかオレは思わないし言わない

投票率の低さを嘆く人がいる.
政治の暴走を許すのは棄権者が多いから.
選挙に行かなかった人には批判する権利がない.
などなど....

でもねぇ、無党派層が選挙に行かないのを非難する気は俺には全くないんだけどな.

ヒラサカは選挙が大好きですから、選挙当日は開票速報をチェックして「あいつ落ちたかぁ」などと独りで興奮のるつぼと化します.でもそれは俺が選挙ヲタクだからであって、そんな変わった趣味の奴は少ない.

選挙やアニメには没入する一方で、ヒラ的にまるで興味がないのはスポーツ.
 ・プロ野球の日本シリーズがどのチームなのかすら知らない
 ・Jリーグの「第3節」ってなんだ?
 ・五輪なんかコミケの邪魔、五輪しね

政治や政党や選挙に興味がないパンピーの無知識さなんか、ヒラサカのスポーツ無知識みたいな酷さでしょう.
 ・自民党と立憲民主党ぐらいなら知っているかもしれないが、維新が何なのか知らない
 ・自公連立ってなに?
 ・共産と公明の違いも知らない
 ・立憲がほざくおためごかしなんか気づくわけもない
こんな人々が世の中の半分ぐらいなわけです.何の得にもなりゃしないし、楽しくもない政治に関わりたがるわけがない.選挙に行くわけもない.俺がサッカー観戦しないのと同じだ.

低投票率を嘆く人は「それでも行け」と主張するだろうけど、まるで政治知識の無い人に無理矢理させた投票って意味あるのかな?
俺は意味ないと思う.
意味があるとすれば、口当たり良さげな事をほざくお花畑サヨクへの偏向を助長するだけだと思う.たとえば「憲法9条があれば自衛隊は不要」などという共産党の戯言に賛同する票が増える.そうゆう悪しきバイアスしか生まないんじゃなかろうか?

選挙が高投票率のガチ決戦になる場面があるとすれは、独裁者の人殺しを引きずり降ろすときだけかもしれないよ.だが日本でそうゆう場面は生じそうにない.

現実の選挙は、もっと微妙な政治的issueや経済的issueで遂行される.

目先の物価高沈静化のためには円高が有利だが、長期的には円安で貿易収支改善するのは国益だ、というような短期長期の視点次第で結論が逆になるようなissueがある.為替についてマスコミは物価高のdemeritばかりを鼓吹するので、世論は円高を好む.

目先困っている人に補助金を配布するのは善であるかもしれないが、長期的には増税スパイラルになって不景気で全員が不幸になるであろう.古くからある社会主義vs自由主義の相克だ.

こうゆう風なissueはどの選挙にも多かれ少なかれ通底しているのであるが、明確な選挙の争点になることはない.よって自分で政党や候補者を分析しなければ投票先を決められない.しかしそれは政治に興味のない者には酷な作業というものだ.

政治issueを知らない者が投票に参加するものだから、、、自民党にお灸をすえるために立憲に投票するなどと言うアリエナイ現象が生じる.この2つはイスカンダルとガミラスみたいな全く異質な存在であって、二者択一にはなり得ないものなんだよ.それを知らないって事なんだけどな.

結果として民主主義というものは、口当たりの良い政策への合意という形で社会主義化を助長するシステムだと思う.政治issueに疎くて目先優先の人民が招く悪しき結末だ.

だから、扇動されるパンピーによる民主主義に希望を持つことは俺にはできない.
棄権者が半分ぐらいいても仕方ない.
何も知らない者が口を出すくらいなら黙っててくれる方がいい.

かしこ

CH32V003をWCH-LINKEで焼けた件

秋月で売ってるCH32V003というSOP8の32bit RISCV中華マイコン.前回WCH-LINKで焼けなくて死んだ件の続報です.WCH-LINKEで焼けました.
↓これが秋月で売ってるWCH-LINKE.右下に小さくWCH-LINKEとシルク印刷されています.
↓WCH-LINKEに接続する回路はこれです.今回はLチカを試します.
↓回路図はこれだけ.
↓WCH-LINKEの接続箇所.配線は3本です.CPUの電源も拝借します.

ーーーー
これをPCに挿してごにょごにょ動かしたのだけど、、、なんかワケワカメな挙動だったかなぁ...

まず最初にArduinoIDEで焼こうとした時はダメでした.ArduiniIDEがWCH-LINKEを認識してないっぽかった.

そこで、、、裏道を進みます.
WCH-LinkUtility.exeをDLして起動します.たぶんこれ
↓画面で赤線のところは設定するべきかと思います.
↓chip情報を採取できれば接続できたことになるので、「Query Chip Info」を押します.
そしたら、ここで、WCH-LINKEのfirmware updateが始まりました.裏で焼き変えている.不安だぴぃ~
焼き変え終了したら、デバマネにこれが出るようになりました.
 VID:1A86
 PID:8010
再度「Query Chip Info」を押してchip情報が表示されるようになりました.
以上で接続確認できましたので、WCH-LinkUtilityは終了です.

次はArduinoIDEを使います.
CH32V003のlibraryを導入する操作が最初に必要です.ArduinoIDEの設定はこちらを参考にすればいいでしょう.

example sketchからblinkを引用し、port名をPC1に変更.まったくArduinoIDEってのはクソ簡単だわ.
board設定はこんな感じです.
それでは焼きまーす.ポチッとな.
こんなメッセージが出ます.
ちゃんと焼けました.めでたし、めでたし.

Open On-Chip Debugger 0.11.0+dev-02415-gfad123a16-dirty (2023-05-05-13:43)
Info : only one transport option; autoselect 'sdi'
Warn : Transport "sdi" was already selected
Ready for Remote Connections
Info : WCH-LinkE  mode:RV version 2.12 
Info : wlink_init ok
Info : clock speed 6000 kHz
Info : [wch_riscv.cpu.0] datacount=2 progbufsize=8
Info : [wch_riscv.cpu.0] Examined RISC-V core; found 1 harts
Info : [wch_riscv.cpu.0]  XLEN=32, misa=0x40800014
[wch_riscv.cpu.0] Target successfully examined.
Info : starting gdb server for wch_riscv.cpu.0 on 3333
Info : Listening on port 3333 for gdb connections
** Programming Started **
Info : device id = 0xb638abcd
Info : flash size = 16kbytes
** Programming Finished **
** Verify Started **
** Verified OK **

かしこ

秋月電子、週末の24Hデリバリーご苦労さん

土曜日朝10時過ぎ、眠りが浅くなる.自分を含め家族は寝坊で誰も起きない.

玄関がピンポーンと鳴る.佐川急便だ.

出ると巨大な荷物は奥さん宛、小さな箱はオレ宛て.なんか見覚えのある箱だなぁ.

送り主は埼玉県八潮の秋月電子.「うそっ、速い」

メール履歴を見たらこんな流れだった.怒涛の24Hデリバリーだ.
 発注   5月17日(金) 10:43  発送は来週だろうなぁと思ふ
 発送連絡 5月17日(金) 21:03  発送マン残業したのか、ご苦労
 到着   5月18日(土) 10:10  Amazon並み

買ったものリスト:
・WCH-LINKE 750円
・SOP8→DIP変換基板 100円
・NJU77552 80円 →1bitDAC発振器
・STM32C011 140円 →1bitDAC発振器

WCH-LINKEは、中華CPU CH32V003を焼けなかったリベンジのために入手した.あとでレポするね.

合計で1350円+500円送料だったかな.送料を支払うのはもったいないけれど、地下鉄で秋葉原駅まで往復するのに504円かかるので同じなんだよね.

それでは今日もハンダづけマン.

かしこ

選挙watch 目黒区選出都議補選 告示 都民ファ出馬見送り

目黒区選出都議2名の補選が本日告示され、5/26に投票です.(区長選挙に出るため都議を辞めた2名の補選)

当選者2名の枠に5名が立候補しました.
 青木英太  現職区長の息子
 宮本栄   共産党
 西崎つばさ 立憲
 いざわ京子 自民
 須藤健太郎 無所属

都民ファは候補者擁立を見送りですって.いつもの伊藤ゆうを出すだろうと思ってたんだけど、見送りは意外でした.先日の東京15区で4位に沈んだのがそんなに痛手だったのか?

都民ファが候補者を出したら 1位 立憲、2位 都民ファ、3位 自民 と予想してたんだけど、出ないんじゃ仕方ない.

先日の目黒区長選では、都民ファを当選させぬために、自民公明立憲が現職の青木英二に組織票を集中させたとヒラサカは推測しています.今回の補選では都民ファが居ないのでその現象は起きないと思います.なので息子の青木英太は落選と予想.

だとすると、順当に組織票で1位 立憲、2位 自民 になる可能性が高いと思います.

この情勢だと投票に行く意味を感じないなぁ.また白票を投じようかな.

かしこ

2024年5月17日金曜日

STM32で1bit DAC出力できるかな(4)完結編 設計資料

秋月でSTM32C011J4M7という8ピンマイコンを買いました.@140円.
これでも32bitCPUでTIMER, UART, ADC, DMAなどが一通り入ってます.
これを使って1bit DAC型のsin波発生器を作りました.USB-C給電です.
ミニマムシステムなのでいろいろな問題を克服できずに終了しました.今回はそんな設計事情をたくさん書いてゆきます.

設計情報詰め合わせをこちらに置きます.
回路図、gerber、3Dプリンタ、写真 などが入っています.


なんで発振器をつくるの?
audio周波数のsin波をいくつも欲しい場合があります.周波数も電圧もアバウトで構いません.そうゆう時は古いスマホを充電して「sin波発生アプリ」でstereo信号を出して使います.わざわざスマホを使うのは面倒なので、小さな発振器が欲しいと思っていました.
↓それで一気に5ヶ作ります.


ピンとRAMとDAC interface
CPUは8pinです.VDD+VSS+programming portで4本確定です.user pinは4本しか残りません.4本にDAC IFをアサインするにはどうすればいいか?

まず考えるのはSPI DACでしょう.接続性は鉄板です.

STM32C011のSPIの仕様はこんな感じです.
 最高bit周波数24MHz
 ヘッダ8bit+データ16bit=24bit
 ゆえにサンプリングレートは24M÷24≒1Msps
1Mspsならばaudio周波数には十分です.

つぎにSTM32C011のRAM容量6kBという制約下でSPIを動かすことを考えます.
やり方は、sine1波分のtableをRAMに用意して、DMAでSPIへ転送します.stack領域などを圧迫しないようにRAMの割り当てを3.6kBにします.
 3.6kB=1800 word(1wordは16bit)
不本意ながら、RAM容量制限のため1800sampleが限度ということです.
1Mspsで1800sampleをグルグル回すと、555HzがDAC出力周波数になります.
もっと低い周波数を欲しければSPI bit周波数を下げる必要があります.こんな計算になります.audio周波数を網羅できそう.合格です.
 SPI bit周波数24MHz →DAC最小周波数555Hz
 SPI bit周波数12MHz →DAC最小周波数278Hz
 SPI bit周波数6MHz  →DAC最小周波数139Hz
 SPI bit周波数3MHz  →DAC最小周波数67Hz
 SPI bit周波数1.5MHz →DAC最小周波数35Hz
 SPI bit周波数750kHz →DAC最小周波数17Hz

ほいだば秋月で売ってるシリアルIF DACを物色してみるなり.
 MCP4921 12bit SPI bit周波数20MHz max
 MCP4922 12bit SPI bit周波数20MHz max
 MCP4725 12bit I2C bit周波数3.4MHz max
 MCP4726 12bit I2C bit周波数3.4MHz max
 PT8211  16bit    bit周波数18MHz max
数100円するわりにSPECがいまいちなんだよなぁ...

SPIやI2CなどのシリアルDACはやめました.

というわけで1bit DACを自作する方向に転換します.
1bit DACですから、余計なヘッダは邪魔ですから、SPIやI2Cは自動的に候補から外れます.
かといって、CPUがGPIOへ出力するのでは速度が足りません.
そこで、IFはI2S一択になります

I2SはDACのIFに使われるもので、STM32シリーズにはなぜか必ず載ってます.I2Sは簡単な3線IFです.SPIと似てます.hardware的にはSPIをちょちょいと改造して実現しているみたいよ.
 LRCK:サンプル周波数.LchRchの切り替えもします
 BCK:16bitモードならばLRCKの32倍周波数
 DATA:シリアルPCMデータ
ここではDATAをPWMとして利用するので、LRCKとBCKは使いません.DATAをLPFするとsin波になります.

3.6kB=28800bitのsine tableとI2Sの組み合わせで実現できるDAC出力周波数を計算します.audio周波数を網羅できそう.合格です.
 I2S Fs 192kHz bit rate 6144kHz →DAC最小周波数213Hz
 
I2S Fs 96kHz  bit rate 3072kHz →DAC最小周波数107Hz
 I2S Fs 48kHz  bit rate 1536kHz →DAC最小周波数53Hz
 I2S Fs 32kHz  bit rate 1024kHz →DAC最小周波数36Hz
 I2S Fs 16kHz  bit rate 512kHz  →DAC最小周波数18Hz


1bit DAC streamの作り方
1bit streamとは、たとえばこの図のようなものです.sin波をPWMで表現したものです.ここでは、CPU内部で数値生成したsin波を元に、PWMに変換する作業になります.
変換作業は技術的にはデルタシグマ変調というものです.デルタシグマの解説はこちらに書きました.
↓天下り的ですが、こうゆうブロック図でsin波→PWM変換できます.
ここでやるsine→PWM変換をこのように定義します.
 ・1波分のPWMデータを生成するのが目的
 ・1波を28800bitとする  (sin波周波数に応じて短くすることもある)
 ・1波分を3.6kBのRAMに書き込む (DMA都合でuint16とする)
 ・float sin()でsineを発生させる
 ・sin(x)のxのstepは、2π/28800 radianである

こうして生成したPWMデータをI2Sで出力すると何Hzのsin波になるのか?
 ・I2SのFs=192kHzとすると、
 ・PWM bit rate=192kHz*32=6144kHz
 ・28800bitで一巡するので、6144k/28800=213Hz

STM32 firmwareのsource codeはこうなってます.変数名はブロック図記載の通りにしてありますので、気長に理解してください.
// sine table
float v2d=0, outd=1;
uint32_t val=0; // 32bit serial to parallel work area
int k=0;
for(int i=0; i<=28800-1; i++){
  // delta sigma operation
  float vin = sinf ( 2 * PI * i / 28800);  sine生成
  float dac = 1.1f * outd;
  float v1 = vin - dac;
  float v2 = v1 + v2d;
  int out = sign(v2);      sign():正なら+1、負なら-1
  v2d = v2;   遅延
  outd = out;   遅延

  // put sine buffer
  int dig = i % 16;
  int out_ = out==1 ? 1 : 0;
  val = val | (out_ << dig);
  if(dig==15) {
    h_bufSin[k++] = val;  16bitに区切ってRAMにストア
    val = 0;
  }
}

以上のようにしてデルタシグマ変調で生成したPWMをフーリエ変換してみました.
左端のpeakがsin波です.それ以外の右側全部がノイズです.LPFでノイズをcutすればsin波だけを残せます.1bit DACの完成です.
ここでノイズをよーく見ると、高域に偏っています.これがデルタシグマ変調の恩恵であるところの「ノイズシェイピング」です.量子化ノイズを減らす効果があります.


回路図
改修がありますがそれは後で説明します.
USB-Cで給電.CPUは3.3V.push SWは周波数変更.LPF cut-offは20kHzぐらい.


プリント基板
57x29mm もっと小さく作りたかったけど.....
A面 パターンカットあり
B面 ジャンパーあり


3Dプリンタで作るケース
2枚貝型ケース.62x34x15mm
ネジ穴は設けてないので接着で対応する前提.わたしはホットメルトが好きです.


周波数変更方法
push SWを押す毎にcyclicに周波数を変更します.周波数は飛び飛びの値です.
下記tableに14種類の{ ①sin波周波数、②I2S Fs、③sin tableのbit数 }が記載されています.③に応じてsin tableを再計算し、②をI2Sに設定し、③をDMAの長さに設定します.
uint32_t   h_freqTable[]={
  18,    I2S_AUDIOFREQ_16K,  16*1800,
  36,    I2S_AUDIOFREQ_32K,  16*1800,
  53,    I2S_AUDIOFREQ_48K,  16*1800,
  107,   I2S_AUDIOFREQ_96K,  16*1800,
  213,   I2S_AUDIOFREQ_192K, 16*1800,
  333,   I2S_AUDIOFREQ_192K, 16*1152,
  500,   I2S_AUDIOFREQ_192K, 16*768,
  1000,  I2S_AUDIOFREQ_192K, 16*384,
  2000,  I2S_AUDIOFREQ_192K, 16*192,
  3310,  I2S_AUDIOFREQ_192K, 16*116,
  5052,  I2S_AUDIOFREQ_192K, 16*76,
  10105, I2S_AUDIOFREQ_192K, 16*38,
  19200, I2S_AUDIOFREQ_192K, 16*20,
  24000, I2S_AUDIOFREQ_192K, 16*16  };


周波数精度
sin波周波数はピッタリ理論値にはならず、数%誤差ります.原因は2つ.
1)RC発振器誤差
部品点数削減のためXtalを省いています.STM32の内蔵RC発振器を使って源発振clk (48MHz)を得ています.RC発振器は数%ズレています.
2)I2S Fs誤差
192kHz,96kHz,48kHz,32kHz,16kHzを作るためにSTM32内蔵PLLで源発振clkを掛けたり割ったりします.整数の掛け算割り算では必ずしもFsとピッタリにならず、数%ズレます.


source code
STM32CubeMXが生成したsource codeを変更します.
変更したfileはmain.cとstm32c0xx_it.cです.
新規追加fileはh_1bit_dac.cとh_1bit_dac.hです.

STM32CubeIDEは1.15.0を使っています.

STM32C011の出荷時設定のままだとI2Sが動きません.reset pin=I2Sと衝突しているからです.回避するためにoption byteの変更が必要です.→こちらを参照

main.c
初期化の後に追記.
h_freq_init();   sine tableを計算
HAL_I2S_Transmit_DMA(......);  I2SをDMA modeで起動

stm32c0xx_it.c
外部pin割り込みハンドラに追記します.
push SWが押されたら割り込みがかかるので周波数を変更します.
void EXTI4_15_IRQHandler(void) {
  HAL_I2S_DeInit(&hi2s1);   I2Sを停める
  h_freq_init();   sine table再計算
  HAL_I2S_Init(&hi2s1);  I2Sを再設定
  HAL_I2S_Transmit_DMA(......);   I2SをDMAモードで再起動
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_14);
}

h_1bit_dac.c、h_1bit_dac.h
sine tableを計算する関数h_freq_init()が記載されています.
sin→PWM変換と周波数tableを実装してあります.


push SWチャタリング防止回路
netで見つけた回路で良さそうに動いてます.
要は0.1u+100Ωで平滑化してるってことで.


sin波形
ミニマム構成ゆえに問題はあります.
↓18kHz (I2S Fs=192kHz) 滑らか
↓500Hz (I2S Fs=192kHz) 滑らか
↓200Hz (I2S Fs=192kHz) 滑らか

↓100Hz (I2S Fs=96kHz) 少しバサつき
↓54Hz (I2S Fs=48kHz) バサつき
↓36Hz (I2S Fs=32kHz) バサつき
↓17Hz (I2S Fs=16kHz) バサバサ
問題点は、Fsが低くなるにつれて波形がバサバサになってゆくところです.
この原因は、LPFをFs=192kHzに最適化したためです.Fs=16kHzにもなるとPWMの不要帯域をカットしきれなくてバサバサになってしまいます.本当はLPFもFsに応じて切り替えなくちゃいけないのだけど、CPUのpinが余ってないので無理です.
CPU内部RAMが64kBぐらいあれば、sine tableを長大にできるのでFs=192kHzでsin波=20Hzぐらいまで下げられるんですがね.
ミニマムシステムゆえに許してくれ.


基板改修
OPAMP電源を3.3V→5Vに変えています.
OPAMPには3.3V rail to railが必要です.
秋月で売られているNJU77552なら3.3V電源のままで動きます.
しかし秋月で売られているNJM2746Mだと5V電源にしないと動きません.
NJM2746Mは入力についてはrail to railでないので、電源を5Vにして逃げます.
↓A面でパターンカット.
↓B面でジャンパー(A面から透視図)


かしこ