Arduino初心者熱烈大歓迎質問スレ part25
■ このスレッドは過去ログ倉庫に格納されています
餅突け。 まずは、>>1 を欲嫁。 何をやろうとして何をしてその質問に至ったのか、具体的に、出来れば図表、蛾を添えて詳しく。 >>202 >クロック周波数が最大16MHzしかないので水晶振動器を使いたい そう思った理由を書いてみ クロックを変更せずに解決できる予感がする クロックを変更するとブートローダも改造しないとスケッチが転送できなくなるんじゃなかったっけ? アドバイスありがとうございます。 目的は30Mhzでデータのサンプリングです。アルデュイーノでは最大クロック周波数が16Mhzなので、外部から早い周波数の信号が必要ですよね? そこで、水晶が良いのではないかと思った次第です。 ちなみに、自分は電子工作初心者です。 本職は設備のメカ設計をしております。 プログラミングについても教えて頂けるとありがたいです。 今までは、そこまでサンプリング周波数の高いプログラムを作ったことがなく、delay関数を使って希望のタイミングでサンプリングをしていました。 しかし、高周波サンプリングをする場合、delay以外の命令実行に時間が掛かるとお聞きし、希望の周波数ではサンプリングするのは難しいと聞きました。なので他の命令の有無に関わらず、正確にサンプリングを行えるような関数があれば教えて頂きたいです。 >>210 本当に「正確」にきっちりとやりたいのなら単体DACを備えたシステムを組む必要があるよ。 ちんけなワンチップマイコンひとつでやろうというのは無理。 >>210 どのArduinoか知らないけど、ポピュラーな所で328Pだとして最大動作クロックは20MHz 無理だということはお分かりいただけますかな? 専用のADCチップをお使いください さっきEnergiaを覗いてきたんだけどさ もう一年以上もVer.UPされてないね やっぱARM系は STM32duinoの方が人気があるってことなのかな 30MHzって電波をサンプリングするの? 何がしたいか全然分からん まあ俺も初心者だし何も分からんけど デバイスのデータシート読んでね 使える最大周波数は決まってるから その調子だとDCモーターをGPIOに直付しそうだなw >>215 ああ、あの食パンにいろいろはさんでパックにしたやつな 昔前澤の女が宣伝してたやつ 30MHzサンプリングはマイコンじゃむりだなRF系のデバイスかFPGAが必要 金があるならADCのDSK買えばpcには取り込めるかななにがしたいかしらんけど 何を観測するか知らんけど、30MHzサンプリングだとデジタルオシロの領域だなぁ 対象が電圧だと仮定して、観測した結果を使ってアクションを起こすのでなければ、デジオシをレンタルしたほうが早そうな? 色々と助言頂きありがとうございました。 今さらですが、用途は超高速モーターの回転数サンプリングです。 外注で回転数の表示はしてくださっていますが、出来れば自社で作った基盤でもサンプリングしてみたい、といのが事の発端です。 モーター回転数のサンプリングデータで予知保全 とかもしたいので >>210 実現したいサンプリング周波数の為にはクロックは30MHzが必要とも取れたんですが、 1.観測するのが1/0のデジタルかアナログか 2.周波数 = 観測する信号 or サンプリング or cpuクロック がわからないと arduinoで作ったがもう少しパワーが欲しいと言う話なら、stm32duinoはどうでしょうか、こっちはmax 72MHz >>224 1.観測するのが1/0のデジタルかアナログか 2.周波数 = 観測する信号 or サンプリング or cpuクロック 1.デジタル信号です。 2.モーターの軸を10vに帯電させ一回転ごとに軸と銅線(ブラシ)が接触するように考えております。多分、矩形波のような信号になるのかな? 今持っているのがアルデュイーノunoなので、 出来ればそれでテストしたいです。 水晶使っても無理ですかね? サンプリングじゃなくて割り込み使えば、クリスタル変えなくてもいけます。「avr 周波数カウンタ」で探せば良いかと。 それともモーターからはキレイな矩形波が期待出来ないから、サンプリング周波数を上げてデジタルフィルタ的な事をやろうとしてるのか デジタルならArduinoUNOでも簡単な外付け部品で30MBit/Sでのサンプリングも夢じゃないかも つまり ・外部に30Mhzのクロックを用意 ・クロックを8ビットのシフトレジスタに直結 ・外部のクロックを1/2にしてArduinoを15MHzで駆動 ・命令4サイクル分でIOポートからSRAMに蓄積 >>225 接触子では難しいんじゃ無い?光学エンコーダかマグネットローター+ホール素子でしょ。機構屋さんだよね? そもそも既に回転数の表示が出来てると言う事は、モーター内にセンサが有るのでは? >>225 回転数ならパルスでデジタルだから、今までと話が全く変わるぞ。 例えば120000rpmとしてもパルスはたかだか2kHzで、マイコンにとってはあくびが出るような話なんだけど…。 そのあたり、何が測定したいのか自分で認識できてる? あんたみたいに情報を小出しにしてるとラチあかんわ。 2kHzとかそんな話だとガックシだなw もーちょい ってレベルじゃなく、もっと詳しく書いてほしかったな。 回転数の情報も出てこないしなぁ モーターごときの回転数で30MHzってのがいったいどっから降ってきたのか また永遠の謎で終わるんだろうなあ、毎度のことだが 【質問者心得】 ・スレに一応目を通してから質問しましょう ・回答者はエスパーではありません。状況が分かるように詳しく書きましょう 詳しく書いてくれないと、答える方も困ってしまいます。答えようがないのです 【回答者心得】 ・すぐにググレカスと言う前に「○○でググれカス」って言うような大人の余裕を見せつけてやりましょう ・節度ある初心者さんには、特に優しくね >>234 1回転ごとに検出して30MHzって そんなモーターが存在するの? 信じがたいんだが 予防保全でモーターの振動を測定してるのはだいぶ昔に某大手メーカーで見たことあるけど。 回転数じゃなくて振動を測定したいんじゃないのかな。 回転のムラを測定したいなら30MHzというのも納得いく。 もう一度計算してみたけど、やっぱり167KHzになるな。 だってお題は >>225 >一回転ごとに軸と銅線(ブラシ)が接触する だもの。 >一回転ごとに軸と銅線(ブラシ)が接触するよう こんなことまじめに書いてるお方なんだから、動くもの作れるわけない 終了 減速機歯面の欠けとかを検出して故障前に保全したいって話じゃないのかな。 僕はむしろ、保全現場の人がArduinoに目を付けたのは頼もしく思うけど。 決まって後出し三昧、その挙句質問者はトンズラ なのに必ず、ただ勝手な想像で話を膨らまして遊ぶだけの奴が登場して語り始める 毎度毎度楽しそうだなと思う だからそう言ってるじゃん、楽しそうだなと 何が不満なの? 質問スレには技術者しかいないのが欠点だろうな。 営業板から人を派遣してもらえないだろうか。 >>225 モータ回転数のカウントは今は専用ICでやるのが普通 http://www.zenic.co.jp/products/ic/zen2024f.php また、高速回転する軸を接触式のエンコーダ(?)でパルス検出するのは論外 パルスはノイズだらけになるし、磨耗で直ぐに故障してしまう 通常は磁気や光学などの非接触式エンコーダを使う >>239 昨日、質問をさせてもらったものです。 おっしゃる通り回転数ムラもみれればと考えております。回転数を1/10000の精度で見るために、10ns周期でサンプリング出来ればと構想してます。 ずぶのど素人だけど 回転数はシーケンサーでできると思うよ 保全目的なら 回転数 振動 音の周波数 とか関係してくるだろうから どうしてもArduinoなら それぞれのセンサー取り付けて 表示のLCDつけて データシート通りにプログラムすればいいだけ 難しくない大丈夫 >>254 サンプリング とか 見る とかいうことばがあいまい 最低限として1回転毎の時間を得たい その解像度を10nsにしたい ということと仮定して得た時間のデータをどうしたい? Logを取りたいのかメータ表示で良いのか 規格を超えたときに信号を出すのか? 回転ムラを得たいとして 1/10000というのが 例えば10000回転の時間をチェックできればよいのか、 1/10000回転を個々にデータ取得したいのか そのデータを保存するのか、メータ表示か、規格を、、以下略。 >>257 1/10000回転を個々にデータ取得したいです。 >>258 あと、logをとりたいです。表示は無くても問題ありません。 1回転に1パルスじゃ1/10000回転の個々のデータ見れんだろ それは1回転の時間を10000で割っただけのものに過ぎん 中古のカウンターからGPIB経由でデータ取りにいかせたら?。 横川のTC110あたりで十分。 回転パルスでリセットするカウンタ作って(ここはハードでやる)それの値を取り込めばいいだろうそうすればレート=回転数だ 制度が10nならカウンタのクロックは100MHzだからちょっとしたものだな CPLD+Atmegaでできるかな 回転検出にはホール素子でも使うかな カウンタの桁あふれに注意だな ログ取るなら記憶部もそれなりのものがいる RAMじゃないと間に合わないかな そのさいずは とかいろいろ考えることはあるな >>262 だな 1回転の時間計測したいのに ADCで電圧から得ようとしている 間違った手段を練っても目的に届かないよ ログ採りたいとか言ってるけど 1秒間に1万データ全て残す必要は無くて 最大値と最小値と移動平均を0.5秒毎に更新みたいなもんでいいんじゃね >>254 コイツ、完全にカマッテチャンだろ >目的は30Mhzでデータのサンプリングです。 >10ns周期でサンプリング とか、適当に吹いてるだけw >>254 そろそろマジレスすると モーターの回転数を取得する方法だけど 手段はいくつもあるので参考までに attachInterrupt()を使いモーター1回転毎に割り込みを使う(1回転1パルス前提) モーター用のカウンターを用意 最初にモーター用のカウンターをリセットする 現在のタイマーを取得する micros()関数でμs単位で取得できる(分解性能は4μs) モーター400回のカウントする 400回に達成したらmicros()を使い前回のタイマーからに経過時間を計算する 60,000,000 / 計算した時間(μs) * 400 = RPM 回転数の分解精度を上げる場合はカウント数を増やす 質問者の言う所の10nsの分解精度があるはず また別の手段としてコンペアモジュールを使い400や任意の回数をカウントさせて割り込みを行う手段も有る (あと、arduinoではLチカしかやった事ないので間違ってたらごめん) >>267 方法としてはポピュラーなものだけど >10nsの分解精度があるはず ってのがよくわからないので説明よろしくお願い 質問者ではないですが >>202 この程度の理解度しかないから ほんとの1から教えないと分からないよ多分 こういうひとはいくら教えたって馬耳東風だ 自分勝手に妄想して言い散らすだけ 横から質問です。 外部割込みって、周波数の大きいものはどの程度までカウント可能ですか? あまり速いとHighとLowの区別がつけられなくなると思うんですがその限界は? 連投すみません。 割込みルーチンの処理速度以上に拾っても何もできないから無意味なので そっちがボトルネックってことでいいんでしょうか? arduino ideのコンパイルが毎回遅くて困っているのですが、皆さんは何か工夫して早くしているんですか? >>271 目的が周波数やパルス幅の計測ならプログラムでカウントする事は一般的に行わないです。 タイマーにそういう計測機能が各種あるからそれを使って、 計測が終わったらタイマーに割り込みを発生してもらって、CPUは計測値だけ頂くのです。 AVRのカウンタークロックは最大で1/1システムクロックだから、16MHzなら16MHzです。 ボトルネックは仰る部分にもなりうるのですが、要求仕様によりけりです。 デジタルオシロ(安い奴)のように画面に表示してる部分の前後に表示されていない部分(取りこぼし)がある、 みたいな仕様を許容するなら逃げようはあります。 希に起こる特異な現象を確実に拾い上げる、みたいな用途では問題になりえます。 >>273 内蔵しているgccのスピードなので根本的にはしょうが無いように思いますが、 ライブラリからなんからいちいちフルビルドするのをやめさせるという方向で設定する方法はあるようです。 "arduino gcc 高速化"でググってみるとよいでしょう。 >>268 おそらく質問者は回転数(分or秒)を求める手段として1回転の時間を測りそれを元に計算しようと試みたと思われる 1回転の時間がms単位では回転数の計算に使えない 例>1ms単位なら計算で出せる回転数は1000,500,333,250,200,166・・・回転/秒の刻みでしか計算できない もっと細かな単位(ns)なら細かな回転数を計算出来ると思ったよう思われる 質問者の >おっしゃる通り回転数ムラもみれればと考えております。回転数を1/10000の精度で見るために、10ns周期でサンプリング出来ればと構想してます。 この書き込みを翻訳すると 回転数を確認するために1回転の回るのに掛かる時間を1/100000秒単位で測りたい (1/100000秒は10μsで10000nsなんだけど・・・・) 質問者の言う10nsってのが1回転当たりの時間の刻みの可能性が高いのでそれを求める手段を考えてみた 10nsの分解精度とは・・・ ArduinoUNOには起動後から常に動いてるカウンターが有りmicros()関数でμs単位で取得できる ただしこれは4μs単位で動くらしく(ネット調べ)1μsでは取得できないらしい? 4μsを10nsを直すには1/400にすれば良い事になる つまりモーター400回転時間のμsを400で割れば1回転の時間が10ns刻みで計算出来る事になる >>271 割り込みだと割り込み後の処理によって計測可能な速度が大きく左右されるので具体的な速度は出せません。 UNOだとして単純にカウンターの変数に1足す(インクリメント)するのと数値の比較なら30サイクルから100サイクル程度じゃないでしょうか? アセンブラで詰めればもっと早くなるとは思いますが 16Mhzで100サイクル必要なら最大160KHz程度になりますがもっと少ない可能性があります 今回の質問のようなモーターの周期なら十分に対応可能な速度で動くと思われます また他の人も回答してますがUNOにはハードウェアでパルスなどの入力をカウントする機能が備わってます そちらを使用すればより高い周波数のパルスをカウント出来ます >>274 Each half period of the external clock applied must be longer than one system clock cycle to ensure correct sampling. The external clock must be guaranteed to have less than half the system clock frequency (fExtClk < fclk_I/O/2) given a 50/50% duty cycle. Since the edge detector uses sampling, the maximum frequency of an external clock it can detect is half the sampling frequency (nyquist sampling theorem). However, due to variation of the system clock frequency and duty cycle caused by oscillator source (crystal, resonator, and capacitors) tolerances, it is recommended that maximum frequency of an external clock source is less than fclk_I/O/2.5. An external clock source can not be prescaled. AVR未経験なので間違いの可能性が高いですが、上記の説明を読むと 理想なパルスが入力出来たとしても6.4MHz程のようです 実際の状況ではより低くなると思われます カウンターに非同期モードが有れば16MHzより高速なパルスをカウント出来る可能性も有ります(未確認) 400回の合計を1/400にしたら平均しか出ないんじゃないの? モーターの安定性って早くなったり遅くなったり回転ムラだから そもそもモーターって 一般モーター 8000rpm (133rps) 1周7.5ms 高速モーター 16000rpm (267rps) 1周3.75ms 超高速モーター 300000rpm (5000rps) 1周0.2ms(=200us=200000ns) 仕様として0.5%のふらつき検出でいいような気がするんだけど 4μ毎にしかパルス測れないものを 400回測って1/400しても意味ねーだろ 時間軸の分解能は下がるだろう。量子化の分解能はちょっと上がるかな リトルインディアンだのバルスだの スレチしか居ねーな >>282 アホか 1回に1パルスしか得られないんだぞ? 1回に〇〇パルスという数値が得られるわけでも何でもない >>284 そのパルスの間隔を高精度に測るって話だよ。 モーターからセンサで拾った信号なんてノイズ乗りまくりだぞ、パルス化で位相雑音になってジッタ出るのに10nsの精度なんてあり得ない。仮に精度が出たとして、負荷に繋がってるモーターだよ、その精度で何を見るんだよ。 からかわれてんだよ。 純正Esp32 Wroom 32d DevKitCです Aduino IDEからだと書き込めるけどVSCodeだと、 Connecting......で失敗してしまいます VSCodeでもほかのArduinoだと書き込めます あと、コンパイルの前で 2019-10-31T12:38:52.604Z WARN p.a.h.BoardCloudResolver:64 [cc.arduino.packages.discoverers.serial.SerialDiscovery] Fail to get the Vid Pid information from the builder response code=404 こんなのが出てかなり時間がかかります この2つどうやったら治せますか? 質問者です。 様々な助言ありがとうございます。 理想は20000rpmのモータの回転ばらつきを 0.01%の精度で見れればベストです。つまり20001rpmと20000rpmが 識別できればいいのですが… その場合隣り合うパルス間隔が 20001rpm=333.35rps(pps)→2.99985ms/pulse=2999850ns/pulse 20000rpm=333.33rps(pps)→3.00000ms/pulse=3000000ns/pulse この違いを識別しなければならないと考え 10ns単位でlongの変数へカウントさせ 299985が入っていれば20001rpm 300000が入っていれば20000rpm というアルゴリズムでできればと思っております(100nsでもいけるのかな?) 現実的かどうかは素人なのでわからないですが… 低価格でそれなり分解能(せめて±0.1%)で測れるのであれば この方法にこだわりはありません。 >>290 それって1秒あたりの平均値のRPMじゃダメなの? なんでもいいからやってみなよ やらなきゃ何にも始まらないよ はじめの方でdelayがどうこう言ってたけど そのスケッチ見せてみなよ >>290 奇麗な波形がえられれば20000rpmなんてせいぜい3ms周期だからCPUのスピードから したらどうということはない。 20000prmを1rpmの精度だったら0.01%ではなくて0.005%で150nsだよね。 16MHzクロック(62.5ns)で16ビットカウンタを自走させて1回転ごとの割り込み でカウンタを読み取れば充分のような気がするけどね。 14640rpm以下になるとカウンタがオーバーフローするから回転数によって クロックを下げる必要があるけど。 それよりも >モーターの軸を10vに帯電させ一回転ごとに軸と銅線(ブラシ)が接触するように考えております。 このやりかたで奇麗なパルスが得られるとは思えない。 チャタリングのようなものが盛大にでてフィルタ入れたら何を測ってるのか 分からなくなりそう。 まずはセンサーの再検討が必要と思う。 >>291 Arduinoでやるならがそれがいいとこだね >>293 「充分のような気がする」の根拠が知りたいなあw >>291 平均値は分母をどのぐらいとるかによりますが 1パルス毎で判断するよりリアルタイム性が薄れる(精度が良くない) と思います。 簡易的な方法で良いとは思いますが、 おそらく、10nsの案がダメな場合は精度を犠牲に 平均、もしくはメディアンでみることになろうかと思います。 ふつーホール素子使うよね 回転の検出ってさ それか光 非接触でやらないとな >>296 ホール素子か光で試してみます。 そのセンサーで行えばノイズが乗りにくいという認識であってますでしょうか? ブラシよりはるかにマシだがカウンタに入るまではアナログ回路だってことを忘れんように 個体のバラつきとか全然考えてないだろ スペック上2万rpmで買ってきたモーターは 定格電圧で1割くらい平気で違うぞ、 10v流して21000rpmだったり19000rpmだったりする 個体ごとに10.2vにしたり9.7vにしたり調整が必要なわけね 20000rpmで安定回転させるにはpwmで電源制御する必要がある 電源制御で狙い通りの回転数が得られたとして色んな問題が発生する 例えば 毎周回ばらつきがある 3005us 3001us 3011us 3007us ... 数秒周期でうねりのように加減速する ばらつきを平均化して、うねりをフィードバックでつぶすと 更に安定化できると思う そこいらが理解できたら、DVDドライブやFDD安定走行用ICのほうがはやいじゃんとか 思えてくるんだとおもわれ 質問者のお題では >>222 >色々と助言頂きありがとうございました。 >今さらですが、用途は超高速モーターの回転数サンプリングです。 >外注で回転数の表示はしてくださっていますが、出来れば自社で作った基盤でもサンプリングしてみたい、といのが事の発端です。 だから、必要なデータは取れてるというか、やり方が知りたければその外注に聞けよで終了の案件。 >>299 こんなに回転数に拘るモノなんだから、クローズドループで制御してると言うことになる。外注に作らせたものには回転数が表示されると言ってるでしょ。 モータには既にセンサは内蔵されてるから、センサ出力を分岐させる方法か、外注の制御器にリードアウトをつけてもらうのを検討するのがスジ。 ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる