48時間以内の記事は
で表示されます

続11ーPWM
TRさん,忘れてました。
プルアップしてましたね。
今日はできないのですが,
明日,モーター回して見ます。
****追記****
猛牛ロックさんおおっしゃる通りでした。
ただ,直してしまうと,きっと,ワンクロック多くなりますかね。
プルアップしてましたね。
今日はできないのですが,
明日,モーター回して見ます。
****追記****
猛牛ロックさんおおっしゃる通りでした。
ただ,直してしまうと,きっと,ワンクロック多くなりますかね。
Re: 続11ーPWM

まず、X9Cですけど、普通、プログラムを組む際はタイムチャート(ここではAC TIMING DIAGRAM)を見ます。
青線を見ればわかるように、INCピンはノーマル(操作外)ではHIGHになっています。
次にCSをLOWにしていますけど、まぁ、この状態が今回のノーマル状態に相当します。
そして、赤線部で、↓となってストローブです。黄色部で、定位置のHIGHに戻します。
このようにアイドルHIGHとするように書かれているので、そのままプログラムしただけです。
※別に「逆では動作しない」、と言っている訳では無いですよ。「保証されていない」という事です。
AD5220に関しても同じ事で、タイミング図で、元々HIGHになっています。
ただし、AD5220のほうは後方の黄緑線の部分ではCLKピンがLOWです。これは普通、「どちらでも構わない」と
いう事を意味します。
そして、もう一つ、ノーマルHIGHを感じたのはその上の手動の回路図です。
みればわかるように、プルアップ=ノーマルHIGHです。
まぁ、こちらのデバイスも私のプログラムが普通です。=データシートのままです。
※その図で分かるようにAD5220の方はCSをLOW固定で使って問題無い筈です。
X9Cもそれが原因で抵抗値がおかしい、とは思っていません。
で、なぜ、INCピン(CLKピン)は平常時がHIGHと言っているのに、LOW出力で初期化するのでしょうか?
抵抗値にかんしてはX9Cが±20%、AD5220が±30%なので、「8.5kΩ」や「約90kΩ」範囲内です。
ワイパー抵抗に関してはどう考えてもおかしい数値です。
データシートでは、両者ともに、40Ω(max100Ω)です。実際の数値(AD5220のグラフ)を見ても25〜60Ωです。
> うまく言えないけど、計算する部門と、可変抵抗部分、
> 電源を入れるコツは、計算部門に最初に電源を入れると、動作は問題なかったと思います。
> 電源ONで、一瞬、大きな電流が流れてしまいました。
> LEDで確認していました。これは仕方がないかな〜。
その辺りの感覚は重要です。でも「仕方がないかな〜」と言っていては駄目ですよ。
ちゃんと起動時のシーケンスを考えるべきでしょう。
ただ、それ以前にこのデバイスがこのまま使えるものかどうかの判断をするのが先だと思っています。
使えないデバイスの為にシーケンスを考えても仕方が無いことですから。
<追記します>
> ただ,直してしまうと,きっと,ワンクロック多くなりますかね。
ワンクロック多くなるとも言えません。
つまり、PICがLOW出力で初期化される場合は、その時にデバイスにクロックが入るかどうかは未知数です。
電源が入る直前にCLKピンの電圧がHIGHの範囲を彷徨っていたらクロックが入る可能性が高くなります。
また、その時にワイパーがどちらに動くかも未知数です。
で、実際に動かす命令を入れた際に、最初の1回目はワイパーは動きません。おおよそ初期化(CLKピンをHIGH)する動きになります。
※デジタルポテンショデバイスの方がPICよりも早く起動した場合、電源ノイズによって、フローティング状態のCLKピンを何度も
上下させる可能性もあります。なので、TRさんが行っていたプルアップ抵抗をつける、というのも悪くは無い提案です。
でも、起動時間を待ったのちに、ワイパー位置が最上段にあると仮定して、最下段までさげてから、位置を0にすれば間違いないと思います。
更に、その後にワイパー部を繋ぐ、というシーケンスも必要なのかもしれません。
Re: 続11ーPWM
maboさん、おはようございます。
物には何でも仕掛けがありますよね。
工作室売店の専門家が言った言葉をもう一度再掲します。
工作室売店の記事 ↓
「抵抗値もばらつきがある。5kΩの物を購入しても4〜6kΩにばらつく。このばらつきは分圧の時には気にならなくなります。」
http://iizukakuromaguro.sakura.ne.jp/216_digitalPOT/216_digitalPOT.html
上記文章を見ると、
実験しないといけないんだけど、分圧して使うなら、使い物になるように読めます。
自分は、思い切って、ML4の可変抵抗を外して、抵抗を計測してみますよ。
追記
可変抵抗器ですが5kでした。
x9cも5220も該当なし。諦めます。
物には何でも仕掛けがありますよね。
工作室売店の専門家が言った言葉をもう一度再掲します。
工作室売店の記事 ↓
「抵抗値もばらつきがある。5kΩの物を購入しても4〜6kΩにばらつく。このばらつきは分圧の時には気にならなくなります。」
http://iizukakuromaguro.sakura.ne.jp/216_digitalPOT/216_digitalPOT.html
上記文章を見ると、
実験しないといけないんだけど、分圧して使うなら、使い物になるように読めます。
自分は、思い切って、ML4の可変抵抗を外して、抵抗を計測してみますよ。
追記
可変抵抗器ですが5kでした。
x9cも5220も該当なし。諦めます。
Re: 続11ーPWM
> TRさん
> 抵抗値もばらつきがある。5kΩの物を購入しても4〜6kΩにばらつく。このばらつきは分圧の時には気にならなくなります
これまでも、私はそういった事を何度も説明してきました。ぱっと見返しても、
No.1592
No.1602
No.1612
No.1644
No.1656
あたりはそれに絡む事柄です。(直接は関係ないものも含んでいますけど)
で、本来「気にならなくなる」筈なのに、そのように動いていないようなので、本当かどうか?(ちゃんと動いているのか)を
分圧が崩れないように「何も付けずに」、「電圧」を測ってくれという事も何度も言ったと思います。
> 上記文章を見ると、
> 実験しないといけないんだけど、分圧して使うなら、使い物になるように読めます。
自分の思い込みで解釈しないでください。
どこにもそんなことは言っていません。飯塚さんもそんなことを言われたら困ってしまうでしょう。
それは、「抵抗値が幾つであれ、電圧は比例関係になるから分圧で使うならあまり関係ない」、という事です。
例えれば、PICにボリュームをつけて、ADC入力で利用したりしますけど、その際のボリュームの抵抗値が異なるものを使っても、
(同じ特性のものなら)抵抗値は関係ない、という意味です。
> 自分は、思い切って、ML4の可変抵抗を外して、抵抗を計測してみますよ。
何故、それが出るのでしょうか?
「分圧で使用するなら抵抗値はあまり関係ない」と言っているのを見て、その抵抗値を計測してみる、という行動に繋がるのがよく判りません。
抵抗を測る自体は悪い事では無いので構いませんけど。
> 可変抵抗器ですが5kでした。
> x9cも5220も該当なし。諦めます
この結論もよく判りません。上述のように、分圧利用なら抵抗値はあまり関係ありません。
5kΩでも10kΩでもほぼ同じ動作になります。
抵抗器=可変電流として利用されているのなら、10kΩデバイスで、その範囲で動かせばいい話です。(ワイパー移動=分解能は半分になりますけど)
※※※※※※※※※※※※※※※
私も、すき好んで否定的な事ばかり言っているわけではありません。
勿論、私のいった事で、TRさんが気分を害されることも、多々あったでしょう。
それを承知で、指摘するのは良い状態では無いと感じています。
なので、しばらく静観させてもらう事にします。
> 抵抗値もばらつきがある。5kΩの物を購入しても4〜6kΩにばらつく。このばらつきは分圧の時には気にならなくなります
これまでも、私はそういった事を何度も説明してきました。ぱっと見返しても、
No.1592
No.1602
No.1612
No.1644
No.1656
あたりはそれに絡む事柄です。(直接は関係ないものも含んでいますけど)
で、本来「気にならなくなる」筈なのに、そのように動いていないようなので、本当かどうか?(ちゃんと動いているのか)を
分圧が崩れないように「何も付けずに」、「電圧」を測ってくれという事も何度も言ったと思います。
> 上記文章を見ると、
> 実験しないといけないんだけど、分圧して使うなら、使い物になるように読めます。
自分の思い込みで解釈しないでください。
どこにもそんなことは言っていません。飯塚さんもそんなことを言われたら困ってしまうでしょう。
それは、「抵抗値が幾つであれ、電圧は比例関係になるから分圧で使うならあまり関係ない」、という事です。
例えれば、PICにボリュームをつけて、ADC入力で利用したりしますけど、その際のボリュームの抵抗値が異なるものを使っても、
(同じ特性のものなら)抵抗値は関係ない、という意味です。
> 自分は、思い切って、ML4の可変抵抗を外して、抵抗を計測してみますよ。
何故、それが出るのでしょうか?
「分圧で使用するなら抵抗値はあまり関係ない」と言っているのを見て、その抵抗値を計測してみる、という行動に繋がるのがよく判りません。
抵抗を測る自体は悪い事では無いので構いませんけど。
> 可変抵抗器ですが5kでした。
> x9cも5220も該当なし。諦めます
この結論もよく判りません。上述のように、分圧利用なら抵抗値はあまり関係ありません。
5kΩでも10kΩでもほぼ同じ動作になります。
抵抗器=可変電流として利用されているのなら、10kΩデバイスで、その範囲で動かせばいい話です。(ワイパー移動=分解能は半分になりますけど)
※※※※※※※※※※※※※※※
私も、すき好んで否定的な事ばかり言っているわけではありません。
勿論、私のいった事で、TRさんが気分を害されることも、多々あったでしょう。
それを承知で、指摘するのは良い状態では無いと感じています。
なので、しばらく静観させてもらう事にします。
Re: 続11ーPWM
プログラムを作っていただき、感謝申し上げます。
自分は、そう思っています。
猛牛ロックさんは、色々と言われていますが、自分は、多分半分も分かっていないと思います。
そう思ってください。
また、掲示板でのやり取りは、相手側に、自分が思った通りに伝わりづらいとも思います。
可変抵抗器換装の件ですが、ついていたものは5kなんですよ、ML4にくっついている状態だと1kでした。
多分何かの原因があると思います。
そこで、10kの可変抵抗器をつけたら、弊害や故障につながることが気になったので、
やめようかと考えました。
そういった心配が100%ないなら、続けて行こうかと思います。
それから、x9cは壊れていて、電圧などは計測できな状態で来ていましたよ。
***********
maboさんへ、
デジタルポテンションの方は、拙い自分ですが、一緒に進む気持ちでいます。
また、できるものなら、自分も理解したいと思っていますので、引き続きよろしくお願いします。
自分は、そう思っています。
猛牛ロックさんは、色々と言われていますが、自分は、多分半分も分かっていないと思います。
そう思ってください。
また、掲示板でのやり取りは、相手側に、自分が思った通りに伝わりづらいとも思います。
可変抵抗器換装の件ですが、ついていたものは5kなんですよ、ML4にくっついている状態だと1kでした。
多分何かの原因があると思います。
そこで、10kの可変抵抗器をつけたら、弊害や故障につながることが気になったので、
やめようかと考えました。
そういった心配が100%ないなら、続けて行こうかと思います。
それから、x9cは壊れていて、電圧などは計測できな状態で来ていましたよ。
***********
maboさんへ、
デジタルポテンションの方は、拙い自分ですが、一緒に進む気持ちでいます。
また、できるものなら、自分も理解したいと思っていますので、引き続きよろしくお願いします。
Re: 続11ーPWM
猛牛ロックさん,TRさん,こんばんは。
猛牛ロックさん,16F88の件はご提案ありがとうございます。
私も,そろそろかな,なんて思いますが,HP上には,88の情報まだ,あるようなので,ちょと考えるんですが,
潮時ですね。
代替えですが,性能もさることながら,値段も大きいですね。
ちなみに秋月では,88は,270円でした。
値段考えると,一番安い,16F1827あたりかななんて思います。
TRさん,今晩,PWMコントローラーのボリュームを,
AD5220に置き換えて,モーター回してみました。
結論から言うと,モーターをコントロールすることは,
可能でした。
ただ,実際使うとなると,猛牛ロックさんがおっしゃったように,シーケンスをいろいろ考えるようでしょうね。
いろいろやってみて,手強い感じしてます。
おかしな動作が,いくつかありました。
一番端のポジションから,一つずワイパーを動かして行きました。
本来なら,回転数は,ワイパーを一定の方向に動かすにつれて,
上がる動作の傾向,あるいは,下がる動作の傾向を続けるはずですが,
他のポジションでは,回転数が下がるのに,ある特定のポジションでは,
回転数が上がる,次のポジションでは,また下がる,という現象がみられました。
何回か実験して,毎回同じ場所でおきますので,
プログラムの問題よりはハードの特性のような気がしますが,
キー判定で割り込み使ってますので,割り込みの影響もあるのか,
この辺はちょっとわかりません。
これ,抵抗値の誤差と同じで,ワイパーの動作に使ってる,
FET?トランジスタ?ダイオード?の特性の違いなのかなと
思いました。
それと,実際にモーターを回すと,ノイズが出てくるのか,
AD5220の電源を入れてから,モーターの電源いれると,
誤動作が多い感じです。
モーター電源ON→AD5220 ON→PIC ON
の順番の方がいいようです。
もうちょっといじって見ます。
猛牛ロックさん,16F88の件はご提案ありがとうございます。
私も,そろそろかな,なんて思いますが,HP上には,88の情報まだ,あるようなので,ちょと考えるんですが,
潮時ですね。
代替えですが,性能もさることながら,値段も大きいですね。
ちなみに秋月では,88は,270円でした。
値段考えると,一番安い,16F1827あたりかななんて思います。
TRさん,今晩,PWMコントローラーのボリュームを,
AD5220に置き換えて,モーター回してみました。
結論から言うと,モーターをコントロールすることは,
可能でした。
ただ,実際使うとなると,猛牛ロックさんがおっしゃったように,シーケンスをいろいろ考えるようでしょうね。
いろいろやってみて,手強い感じしてます。
おかしな動作が,いくつかありました。
一番端のポジションから,一つずワイパーを動かして行きました。
本来なら,回転数は,ワイパーを一定の方向に動かすにつれて,
上がる動作の傾向,あるいは,下がる動作の傾向を続けるはずですが,
他のポジションでは,回転数が下がるのに,ある特定のポジションでは,
回転数が上がる,次のポジションでは,また下がる,という現象がみられました。
何回か実験して,毎回同じ場所でおきますので,
プログラムの問題よりはハードの特性のような気がしますが,
キー判定で割り込み使ってますので,割り込みの影響もあるのか,
この辺はちょっとわかりません。
これ,抵抗値の誤差と同じで,ワイパーの動作に使ってる,
FET?トランジスタ?ダイオード?の特性の違いなのかなと
思いました。
それと,実際にモーターを回すと,ノイズが出てくるのか,
AD5220の電源を入れてから,モーターの電源いれると,
誤動作が多い感じです。
モーター電源ON→AD5220 ON→PIC ON
の順番の方がいいようです。
もうちょっといじって見ます。
Re: 続11ーPWM

>TRさん,今晩,PWMコントローラーのボリュームを,
AD5220に置き換えて,モーター回してみました。
結論から言うと,モーターをコントロールすることは,
可能でした。
ただ,実際使うとなると,猛牛ロックさんがおっしゃったように,シーケンスをいろいろ考えるようでしょうね。
いろいろやってみて,手強い感じしてます。
〇シーケンスという単語ですが、制御する順番でしょうか、そうなら、必要と自分も実験時に思いました。
>おかしな動作が,いくつかありました。
一番端のポジションから,一つずワイパーを動かして行きました。
本来なら,回転数は,ワイパーを一定の方向に動かすにつれて,
上がる動作の傾向,あるいは,下がる動作の傾向を続けるはずですが,
他のポジションでは,回転数が下がるのに,ある特定のポジションでは,
回転数が上がる,次のポジションでは,また下がる,という現象がみられました。
何回か実験して,毎回同じ場所でおきますので,
〇自分のx9cはそういった事はありませんでした。
>プログラムの問題よりはハードの特性のような気がしますが,
キー判定で割り込み使ってますので,割り込みの影響もあるのか,
この辺はちょっとわかりません。
〇キー判定って何ですか?
>これ,抵抗値の誤差と同じで,ワイパーの動作に使ってる,
FET?トランジスタ?ダイオード?の特性の違いなのかなと
思いました。
それと,実際にモーターを回すと,ノイズが出てくるのか,
AD5220の電源を入れてから,モーターの電源いれると,
誤動作が多い感じです。
モーター電源ON→AD5220 ON→PIC ON
の順番の方がいいようです。
〇
自分が実験時に思っていた順番と真逆です。
理由
x9c全体をONにすると、一瞬、モニター用LEDが発光した。
LEDの発光具合だけを見ると動作は安定していました。
いろんなものがあるので、不具合個所を見つけるのは大変ですよね。
自分の時は、
以下の単純な実験方法でした。その時は、電圧値(104mV〜4.5V)、
抵抗値(210Ω〜8.5kΩ))。
動作はスムースでした。ただし、x9cは、電源部をONにし、次に可変抵抗部分に電源を入れました。
No1584で、一度電圧値を報告(157mV~4.5V)しましたが、メモを見ると104mV~4.5V
でした。
実験方法
VR〜PIC〜x9c〜LED
測定箇所は、写真を参照してください。
*
最後に一点確認させてください。
5220のプログラムは、No1671をそのまま使っていますか?
それと、自分の実験方法では気になる動作はなかったのでしょうか?
*5220の絶対定格を見ると、「Bx~Wx プラスマイナス20mA」となっているので、
5220なら、発光LED(約10mAに抑えて)を使っても壊れないと思います。
今後について
・追加のx9cが来たらもう一度テストをします。
・自分は、デジタルポテンションをやめるつもりです。
既存可変抵抗は、東京コスモス製で5kが使われていました。
ML4につい状態では、抵抗値は1kでした。
抵抗値に差があるのは、何かの理由があると思います。
x9cも5220も5kはないんです。交換をして、弊害や故障が怖くなりました。
で、なんですが、
maboさんが言っていた言葉を思い出しました。
違う方法で可変抵抗と同様な動作をする方法も考えていると。
参考URLなどありましたら、方法を含めて教えて下さい。
No1633にそれらしき写真が見えます!!!
Re: 続11ーPWM
TRさん,猛牛ロックさんおはようございます。
TRさん,プログラムですが,猛牛ロックさんやTRさんお使いの一部分を使ってます。
動作を確認したかったので,タクトスイッチを使って,ワイパーをup,down,するプログラムを作りました。
今日もいろいろ動かしましたが,今日は,
モーター電源ON→→ PIC ON → AD5220(PICの電源ONの一秒以内)
がほぼ100%近くコントロールできました。
一秒以内というのは,PICでAD5220の初期化1秒程度まっています。
それと,クロックの発生で,0→1を続けて行うので,
念のため LATABits.RA0 とかいう表記を使いました。
次のページに頭にあった構想の絵掲載します。
私の頭にあったもので,HPはあるかどうか不明です。
それと,TRさんの実験方法ですが,あれこれいえるほど知識ないのですが,
気になるのは,SECさんの基盤お使いのことです。
安定した動作等になるまでは,破損してもいい環境での実験の方がいいかと思いました。
今回のユーチューブの動画は,SECさんの基盤やSSとは接続していません。
TRさん,プログラムですが,猛牛ロックさんやTRさんお使いの一部分を使ってます。
動作を確認したかったので,タクトスイッチを使って,ワイパーをup,down,するプログラムを作りました。
今日もいろいろ動かしましたが,今日は,
モーター電源ON→→ PIC ON → AD5220(PICの電源ONの一秒以内)
がほぼ100%近くコントロールできました。
一秒以内というのは,PICでAD5220の初期化1秒程度まっています。
それと,クロックの発生で,0→1を続けて行うので,
念のため LATABits.RA0 とかいう表記を使いました。
次のページに頭にあった構想の絵掲載します。
私の頭にあったもので,HPはあるかどうか不明です。
それと,TRさんの実験方法ですが,あれこれいえるほど知識ないのですが,
気になるのは,SECさんの基盤お使いのことです。
安定した動作等になるまでは,破損してもいい環境での実験の方がいいかと思いました。
今回のユーチューブの動画は,SECさんの基盤やSSとは接続していません。
Re: 続11ーPWM

X9C や AD5220を パクっただけです。
このデコーダIC(秋月)を使うと3本の線で,8個のトランジスター等のコントロールができるようです。
複数個つかって,コントロールするには,4本の線が必要に
なりますが,
18ピンか20ピンのPICを使うと,3個のデコーダコントロールできますので,
24個の抵抗を操作できそうです。
ただ,使う物の電気的な特性等について,知識が,かなり少ない状態ですので,
実験でのトライアンドエラーになるかなあ,と思います。
***追記です。****
よく分からないのですが,個人的には,5kΩのところに,
10kΩの抵抗使っても大きな危険はないような気がしてます。
この逆だと,ちょっと怖い感じです。
Re: 続11ーPWM
maboさん、こんにちは。
プログラムを変更されたということですが、大分進んでいるようだし、モーターが回って良かったですね。
>モーター電源ON→→ PIC ON → AD5220(PICの電源ONの一秒以内)
picと5220の電源は、同じと思いますが、picがONして、1秒以内に、5220がONさせる方法?
プログラム変更に
必要な時間を書いたのかな?
どのようにしましたか?
プログラムを教えて下さい。
何処でLATAですが、確か、inkやudに係るプログラムでわ、当初から使っていましたよ。
>デコーダIC(秋月)
情報有り難うございます。
リレーの代わりですね。リレーより安くて良さそう。
ところで、
可変抵抗の分圧としての機能はどうするのだろ?
例えば、最上段のトランジスタをONの時
A~ワイパーの抵抗は0、ワイパー~Bは、その間の合成抵抗値となる。
VRの場合、A~ワイパー間に抵抗値があると思います。
その違いはどうしたらよいか?
分かりませんか。
実は、ちょっと前から、考えていましたが、分かりませんでした
>安定した動作等になるまでは,破損してもいい環境での実験
今ゎ、再雇用の激安サラリーなので、安全第一で、進めます。
アドバイス、有り難うございます。
そうだ
5220は分圧して使っているのですか?
ワイパーの先にFETのゲートとつながっているのか?
プログラムを変更されたということですが、大分進んでいるようだし、モーターが回って良かったですね。
>モーター電源ON→→ PIC ON → AD5220(PICの電源ONの一秒以内)
picと5220の電源は、同じと思いますが、picがONして、1秒以内に、5220がONさせる方法?
プログラム変更に
必要な時間を書いたのかな?
どのようにしましたか?
プログラムを教えて下さい。
何処でLATAですが、確か、inkやudに係るプログラムでわ、当初から使っていましたよ。
>デコーダIC(秋月)
情報有り難うございます。
リレーの代わりですね。リレーより安くて良さそう。
ところで、
可変抵抗の分圧としての機能はどうするのだろ?
例えば、最上段のトランジスタをONの時
A~ワイパーの抵抗は0、ワイパー~Bは、その間の合成抵抗値となる。
VRの場合、A~ワイパー間に抵抗値があると思います。
その違いはどうしたらよいか?
分かりませんか。
実は、ちょっと前から、考えていましたが、分かりませんでした
>安定した動作等になるまでは,破損してもいい環境での実験
今ゎ、再雇用の激安サラリーなので、安全第一で、進めます。
アドバイス、有り難うございます。
そうだ
5220は分圧して使っているのですか?
ワイパーの先にFETのゲートとつながっているのか?
Re: 続11ーPWM

前掲の絵間違いありましたので,再掲します。
細かいことは,やってみないと分からないかなあ。
プログラムですが,キー判定に up down の部分絡ませた
だけです。
ADC等は省きました。
それと,UP.DOWN のサブ関数,0〜128 こえても,
動作できるようにしてます。
あまりあまり褒めた物ではありませんが,下記がそれです。
88破損させてしまたので,手持ちの1827です。
***追記***
ブレッドボードでの作成なので,PIC AD5220 PWMコントローラー,全部,別電源にしてます。
//***************************************
// PIC16F1827 Configuration Bit Settings
//
// 'C' source line config statements
//
// 2019-6-15 dejitaru_UP_DW
//
//LCDピンアサイン
// LCD_RS RA7
// LCD_EN RA6
// LCD_D4 RB7
// LCD_D5 RB6
// LCD_D6 RB5
// LCD_D7 RB4
//
//input キー
//TEN_UP RB2
//TEN_DW RA4
//ONE_UP RB1
//ONE_DW
//
// CONFIG1
#pragma config FOSC = INTOSC // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin)
#pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = ON // Power-up Timer Enable (PWRT disabled)
#pragma config MCLRE = OFF // MCLR Pin Function Select (MCLR/VPP pin function is digital input)
#pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config CPD = OFF // Data Memory Code Protection (Data memory code protection is disabled)
#pragma config BOREN = OFF // Brown-out Reset Enable (Brown-out Reset disabled)
#pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = ON // Internal/External Switchover (Internal/External Switchover mode is enabled)
#pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled)
// CONFIG2
#pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off)
#pragma config PLLEN = OFF // PLL Enable (4x PLL disabled)
#pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
#pragma config BORV = HI // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config LVP = OFF // Low-Voltage Programming Enable (Low-voltage programming enabled)
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
#include <xc.h>
#include <stdlib.h>
#include "skSD1602LCD.h"
#define _XTAL_FREQ 8000000
#define TEN_UP RB2
#define ONE_UP RB1
#define TEN_DW RA4
#define ONE_DW RA3
#define CLK LATAbits.LATA1//AD5220コントロール
#define U_D LATAbits.LATA2//AD5220 アップダウン
#define FALSE 0
#define TRUE 1
//変数宣言
int count;
int WP_POSITION;
long pwmOnTimeCounter;
long pwmPeriodCounter;
long CONTROL_MODE_EXTERNAL_PWM_LOW;
unsigned int dutyCycle;
unsigned int lcd_dutyCycle;
unsigned char bGotPwmPulse;
volatile char str[7];
volatile int TEN_KEY_UP;
volatile int TEN_KEY_DW;
volatile int ONE_KEY_UP;
volatile int ONE_KEY_DW;
volatile int TEN_KEY_UP_COUNT;
volatile int TEN_KEY_DW_COUNT;
volatile int ONE_KEY_UP_COUNT;
volatile int ONE_KEY_DW_COUNT;
int WP_POSITION=64;
//関数宣言
void main(void);
static void interrupt warikomi(void) ;
void lcd_hyouji(void);
void wp_TEN_UP(void);
void wp_TEN_DW(void);
void wp_ONE_UP(void);
void wp_ONE_DW(void);
void syokika(void);
/*******************************************************************************
* メインの処理 *
*******************************************************************************/
void main(void)
{
int i ;
char s[17] ;
char mes[6]= {0xbd,0xc0,0xb0,0xc4,0x00} ; // "スタート"文字のカタカナデータ
//static unsigned char buff[12];
OSCCON = 0b01110010 ; // 内部クロックは8MHzとする
__delay_ms(500);
__delay_ms(500);
ANSELA = 0b00000000 ; // 全てデジタルI/Oとする
ANSELB = 0b00000000 ; // 全てデジタルI/Oとする
TRISA = 0b00111000 ; // ピン(RA)は出力に割当てる(RA5.4.3は入力)
TRISB = 0b00000110 ; // RB1.2は 入力 他は全ては出力
PORTA = 0b00111110 ; // RA出力ピンの初期化
PORTB = 0b00000110 ; // RB出力ピンの初期化
TEN_KEY_UP=FALSE;
TEN_KEY_DW=FALSE;
ONE_KEY_UP=FALSE;
ONE_KEY_UP=FALSE;
TMR0=157;
TMR0IF=0;
OPTION_REG=0b000000101;//2019-5-29変更
TMR0IE = 1;//タイマー0割り込み発生許可
GIE= 1;//割り込み全体の許可
__delay_ms(500);
__delay_ms(500);
lcd_init( ) ;//LCD初期化処理
syokika( );//5220初期化処理wpをA端子側に
i = 0 ;
while(1) {
lcd_setCursor(0,0) ;
lcd_puts("wp-POSITION:");
lcd_setCursor(0,1) ;
lcd_puts("ohom:");
lcd_hyouji( );
__delay_ms(500) ; // 1秒後に繰り返す
if(TEN_KEY_UP==TRUE && TEN_UP==1){
wp_TEN_UP( );
lcd_hyouji( );
TEN_KEY_UP=FALSE;
}
if(ONE_KEY_UP==TRUE && ONE_UP==1){
wp_ONE_UP( );
lcd_hyouji( );
ONE_KEY_UP=FALSE;
}
if(TEN_KEY_DW==TRUE && TEN_DW==1){
wp_TEN_DW( );
lcd_hyouji( );
TEN_KEY_DW=FALSE;
}
if(ONE_KEY_DW==TRUE && ONE_DW==1){
wp_ONE_DW( );
lcd_hyouji( );
ONE_KEY_DW=FALSE;
}
}
}
static void interrupt warikomi(void) {//割り込み処理
//***********TIMER0割り込み処理****************
if(TMR0IF==1){
TMR0=157;
if(TEN_UP==0){TEN_KEY_UP_COUNT++;}
else{ TEN_KEY_UP_COUNT = 0;}
if(TEN_KEY_UP_COUNT>=10){TEN_KEY_UP_COUNT=9;}
if(TEN_KEY_UP_COUNT==8){TEN_KEY_UP=TRUE;}
if(TEN_DW==0){TEN_KEY_DW_COUNT++;}
else{ TEN_KEY_DW_COUNT = 0;}
if(TEN_KEY_DW_COUNT>=10){TEN_KEY_DW_COUNT=9;}
if(TEN_KEY_DW_COUNT==8){TEN_KEY_DW=TRUE;}
if(ONE_UP==0){ONE_KEY_UP_COUNT++;}
else{ ONE_KEY_UP_COUNT = 0;}
if(ONE_KEY_UP_COUNT>=10){ONE_KEY_UP_COUNT=9;}
if(ONE_KEY_UP_COUNT==8){ONE_KEY_UP=TRUE;}
if(ONE_DW==0){ONE_KEY_DW_COUNT++;}
else{ ONE_KEY_DW_COUNT = 0;}
if(ONE_KEY_DW_COUNT>=10){ONE_KEY_DW_COUNT=9;}
if(ONE_KEY_DW_COUNT==8){ONE_KEY_DW=TRUE;}
TMR0IF = 0;
}
}
void lcd_hyouji(void){
unsigned char buff[12];
itoa((char *)buff, WP_POSITION,10) ;
lcd_setCursor(13, 0);
lcd_puts(" ");
lcd_setCursor(13, 0);
lcd_puts(buff);
itoa((char *)buff, WP_POSITION*0.78,10) ;
lcd_setCursor(13, 1);
lcd_puts(" ");
lcd_setCursor(13, 1);
lcd_puts(buff);
}
void syokika(void){
int i;
for(i=0;i<66;i++){
wp_ONE_DW( );
__delay_ms(2);
}
}
void wp_TEN_UP(void){
int i;
for(i=0;i<10;i++){
wp_ONE_UP( );
}
}
void wp_TEN_DW(void){
int i;
for(i=0;i<10;i++){
wp_ONE_DW( );
}
}
void wp_ONE_UP(void){
if( WP_POSITION<=128){ WP_POSITION++;}
else{ WP_POSITION=129;}
U_D = 1;
//asm("nop");
CLK = 0;
// asm("nop");
CLK = 1;
}
void wp_ONE_DW(void){
if( WP_POSITION>0){ WP_POSITION--;}
else{ WP_POSITION=0;};
//WP_POSITION--;
U_D = 0;
//asm("nop");
CLK = 0;
//asm("nop");
CLK = 1;
}
Re: 続11ーPWM

頂いた写真をもとに、直感を頼りに、実験しました。
仕掛けが何とか分かりました。
短絡箇所は1か所だけなんですね。
そうすると、Rh~Rw間、Rw~Rl間を分圧できました。
初物です。直感頼りでした(笑い
デコーダICって初めて見ました、リレー代わりになりますね!!
Trは、トランジスタアレイを使えば済みませね。
あと、秋月のCD74HC238Eは、使いこなせたら、本当に、
可変抵抗器の代わりになりそうですね。
データシートを見始めました。
>このデコーダIC(秋月)を使うと3本の線で,8個のトランジスター等のコントロールができるようです。
これですが、データシートを見ると、6端子を操作しないと、出力端子を特定できないのではないでしょうか?
***********
プログラムを見ました。
やはり人の作ったプログラムは、作成者独特の変数表現や関数表現があって、なかなか理解が進みません。
ちょっと目を引いたのは、タイマー0割込み。
タイマー0をつかって、カウントさせ、カウントアップしたときに、
インターラップ関数をさせるという仕掛けですね、参考書を見直しました。
折に触れ何度も見て覚えるって感じです。
で、
>モーター電源ON→→ PIC ON → AD5220(PICの電源ONの一秒以内)
この、PICの電源ONの1秒以内に、AD5220が起動させるという仕掛ですが、
インターラップ関数に、f(TEN_UP==0){TEN_KEY_UP_COUNT++;} このような、等々の書き込みがあるので、
RB2がLになったら、、、ボタンが押されたという感じかな、
こういった、インターラップ関数が終えて、下記のdelay__ms(500)2回が利いて、
5220が動作開始っていうことになるのでしょうか?
記
TMR0=157;
TMR0IF=0;
OPTION_REG=0b000000101;//2019-5-29変更
TMR0IE = 1;//タイマー0割り込み発生許可
GIE= 1;//割り込み全体の許可
__delay_ms(500);
__delay_ms(500);
**************
可変抵抗をx9Cに換装の件
maboさんも、大丈夫そうといって話してくれるので、
手もちの可変抵抗器2個(10kと100k)をつかって、分圧によりPICに電圧を印可させ、
ADコンバートさせて、LEDを発光させてみました。
問題なさそうでした。
この方法(x9c)も引き続き検討してみます。
Re: 続11ーPWM

TRさん,割り込みの処理は難しいことはしていません。
TIMER0で,4つのキーが押されたことを調べているだけです。
チャタリングがあるので,タイマー0で割り込んで,8回押された状態が確認できたら,押されたと判断してます。
そして,メインの方で,割り込みの方で,押されたと判断されて,なおかつタクトスイッチが,離された時に,タクトスイッチが押されたと最終的判断をして,押された処理をしてます。
それから,エンコーダICですが,一個だけ使うなら,
赤枠部分は,直接グランドと5Vに固定しておけばよく,
PICから,3本の線で,青枠の信号を送れば,
緑枠内のように,8個のうち1個を変更できます。
ただ,複数個使うときは,全部をLにする場合もでてくるので,
黄色部分の1本を使って,全部をLにする必要がでてくるので,
全部でPICから,4本の線を使います。
18ピンのPICを使うと,4×3の12ピンで,3×8で24個のトランジスタ等のコントロールが可能です。
最大使えば16ピン使う32個のコントロールできますが,
88だと出力に使えるのが,最大15ピンですね。
めいっぱい使ってしまうと他のことができないので,12ピン位かなと思います。
または,もっとコントロールしたいのであれば,
足の多いのでしょうね。
***追記***
プログラムの方は,あまり細かくみないでください。
とりあえず動いたというもので,
細かいこと猛牛ロックさんのようにはかんがえていません。
細部にこだわると,多分,初期化の処理の後で,
割り込みの許可でしょうね。
Re: 続11ーPWM
>チャタリングがあるので,タイマー0で割り込んで,8回押された状態が確認できたら,押されたと判断してます。
そういった理由ですか、チャタリング対策も大変ですね。
>モーター電源ON→→ PIC ON → AD5220(PICの電源ONの一秒以内)
1秒以内に5220を動作せせるプログラムは、__delay_ms(500);__delay_ms(500);
この2行で操作しているのでしょうか?
***************
5220は、うまく回っていますが、
ローパスフィルターを使っていますか?
実験方法
◯SEC→ローパスフィルター→PICAD変換→X9C→コントローラー→適当なDCモーター
***************
>ただ,複数個使うときは,全部をLにする場合もでてくるので,
了解です。
サンキュウデス。
そういった理由ですか、チャタリング対策も大変ですね。
>モーター電源ON→→ PIC ON → AD5220(PICの電源ONの一秒以内)
1秒以内に5220を動作せせるプログラムは、__delay_ms(500);__delay_ms(500);
この2行で操作しているのでしょうか?
***************
5220は、うまく回っていますが、
ローパスフィルターを使っていますか?
実験方法
◯SEC→ローパスフィルター→PICAD変換→X9C→コントローラー→適当なDCモーター
***************
>ただ,複数個使うときは,全部をLにする場合もでてくるので,
了解です。
サンキュウデス。
Re: 続11ーPWM
maboさん、おはようございます。
新しい試み
5220の方、モノタロウに注文しました。
22日は到着予定です。
で、maboさんから教わった方法を活用して以下の方法で実験してみます。
どうでしょうか
DC5V電源〜VR〜PIC(ADコンバート値を8分割)〜〜CD74HC238E(抵抗器8個による分圧)〜発光LED
成功したら、
SEC基板〜ローパス(PWM基本周波数200Hz=カットオフ周波数)〜PIC(ADコンバート値を8分割)〜〜CD74HC238E+Tr(抵抗器8個による分圧し、ML4の可変抵抗を換装)〜ML4
新しい試み
5220の方、モノタロウに注文しました。
22日は到着予定です。
で、maboさんから教わった方法を活用して以下の方法で実験してみます。
どうでしょうか
DC5V電源〜VR〜PIC(ADコンバート値を8分割)〜〜CD74HC238E(抵抗器8個による分圧)〜発光LED
成功したら、
SEC基板〜ローパス(PWM基本周波数200Hz=カットオフ周波数)〜PIC(ADコンバート値を8分割)〜〜CD74HC238E+Tr(抵抗器8個による分圧し、ML4の可変抵抗を換装)〜ML4
Re: 続11ーPWM
TRさん,猛牛ロックさん,こんにちは。
>5220は、うまく回っていますが、
>ローパスフィルターを使っていますか?
いえ,外部のPWMの信号はいれてないので,ローパスフィルターは,使ってません。
中華製PWMコントローラーのボリュームを,AD5220に置き換えただけです。
PIC→→AD5220→→中華製コントローラ→→モーター
の配置です。
私が掲載した,写真ですが,ワイパーの部分に,抵抗入れておいた方がいいかもですね。
一番端に移動させたとき,短絡することになるので,
抵抗入れておいた方が安全かもですね。
TRさん,モノタロウ,いい値段しますね。
約,倍ぐらいかなあ。
>1秒以内に5220を動作せせるプログラムは、__delay_ms(500);__delay_ms(500);
>この2行で操作しているのでしょうか?
一応,そのつもりで,念のため2カ所にdelay_msいれました。
きいているかどうかは?ですけど。
>5220は、うまく回っていますが、
>ローパスフィルターを使っていますか?
いえ,外部のPWMの信号はいれてないので,ローパスフィルターは,使ってません。
中華製PWMコントローラーのボリュームを,AD5220に置き換えただけです。
PIC→→AD5220→→中華製コントローラ→→モーター
の配置です。
私が掲載した,写真ですが,ワイパーの部分に,抵抗入れておいた方がいいかもですね。
一番端に移動させたとき,短絡することになるので,
抵抗入れておいた方が安全かもですね。
TRさん,モノタロウ,いい値段しますね。
約,倍ぐらいかなあ。
>1秒以内に5220を動作せせるプログラムは、__delay_ms(500);__delay_ms(500);
>この2行で操作しているのでしょうか?
一応,そのつもりで,念のため2カ所にdelay_msいれました。
きいているかどうかは?ですけど。
Re: 続10 PWM
> posについて、ネット検索しましたが、分かりませんでした。難しく感じました
ただの変数名です。a,b,c等と同じです。
が、一応、x9c_valのvalはvalue(値)から来ています。posもPOSITION(位置)です。
そんな感じで何となく頭に浮かんだのを付けているだけです。
> __delay_us(500);
> が無い点が気になります。
> 抵抗値変更に要する時間が有るのと無いのでは、差がでると推測します。
どのプログラムの事でしょうか?今まではどれも入れていると思うのですけど。(X9Cに関して)
ただの変数名です。a,b,c等と同じです。
が、一応、x9c_valのvalはvalue(値)から来ています。posもPOSITION(位置)です。
そんな感じで何となく頭に浮かんだのを付けているだけです。
> __delay_us(500);
> が無い点が気になります。
> 抵抗値変更に要する時間が有るのと無いのでは、差がでると推測します。
どのプログラムの事でしょうか?今まではどれも入れていると思うのですけど。(X9Cに関して)
Re: 続10 PWM
>ただの変数名です。a,b,c等と同じです。
が、一応、x9c_valのvalはvalue(値)から来ています。posもPOSITION(位置)です。
そんな感じで何となく頭に浮かんだのを付けているだけです。
ということは、外部変数を1行追加して以下の通りとなりますか?
//外部変数
volatile unsigned char MD5220_val = 64; //電源ON時ワイパ中間位置
volatile unsigned char pos;
次に、デバイスの初期化は、以下の通りでよろしいわけですよね。
//デバイス初期化関数
void MD5220(unsigned char pos) {
int t = pos - MD5220_val;
if (t > 0)ud = 1;
else {
ud = 0;
t = -t;
}
while (t) {
clk = 0;
clk = 1;
t--;
}
MD5220_val=pos;
}
大事なので、何回か、500待つということは聞き直していました。
掲示板でのやり取りは難しい。
話戻りますが、
x9cの運転プログラムは、主にNo1515です。
ベースは、ここから始まっています。
whileの中に500待つといった内容がありません。
以下抜粋
x9c_init();
while(1){
static unsigned int adc[4]={0};
static char num=0;
unsigned int target=0;
adc[(++num)&3]=adconv();
for(char i=0;i<4;i++)target+=adc[i];
target/=40.9;
if(target>x9c_val)x9c_up();
else if(target<x9c_val)x9c_down();
_delay_ms(1);
}
}
Re: 続10 PWM
TRさん,猛牛ロックさん,こんばんは。
草刈りで,少々,ばて気味です
TRさん,500がないということですけど,
下記の部分,
if(target>x9c_val)x9c_up();
else if(target<x9c_val)x9c_down();
_delay_ms(1);
}
で,サブ関数,x9c_up() と x9c_down()を呼んでいます。
500は,x9c_up() と x9c_down() の中にあると思いますが,
ちょっと,確かめでみてください。
5220とIRF740(CNC 3040 のモータードライバーに使われているFET)がX9Cより先に届きました。
疲れているので,のんびり行きます。
草刈りで,少々,ばて気味です
TRさん,500がないということですけど,
下記の部分,
if(target>x9c_val)x9c_up();
else if(target<x9c_val)x9c_down();
_delay_ms(1);
}
で,サブ関数,x9c_up() と x9c_down()を呼んでいます。
500は,x9c_up() と x9c_down() の中にあると思いますが,
ちょっと,確かめでみてください。
5220とIRF740(CNC 3040 のモータードライバーに使われているFET)がX9Cより先に届きました。
疲れているので,のんびり行きます。
Re: 続10 PWM
No1515では、↓のようになっています。
void x9c_dowm(void){
ud=0;
inc=0;
__delay_us(1);
inc=1;
if(x9c_val>0)x9c_val--;
//次の上げ下げは500us空ける
}
//以降なので、500は待ちません。
5220の初期化関数が自分的にはしっくり来ていません。
ゆっくりと考えてください。
void x9c_dowm(void){
ud=0;
inc=0;
__delay_us(1);
inc=1;
if(x9c_val>0)x9c_val--;
//次の上げ下げは500us空ける
}
//以降なので、500は待ちません。
5220の初期化関数が自分的にはしっくり来ていません。
ゆっくりと考えてください。
Re: 続10 PWM
> volatile unsigned char pos;
posは外部変数ではありません。
> //デバイス初期化関数
> void AD5220(unsigned char pos) {
このAD5220関数の「引数」です。
この位置へ移動しろ、という目標位置です。
AD5220(10);の10がposです。
なので、他の関数から操作するものではありません。
(この関数自体は初期化専用関数でもありません。初期化に利用しているだけです。)
実際の初期化は
AD5220_val=70;
while(AD5220_val)AD5220_down;
の方が確実です。
> whileの中に500待つといった内容がありません。
そこでは倍の1000us=1msになっています。
なので、当然動作が被ることはありません。
<追記します>
目標位置と現在のワイパー位置と差があれば、UPやDOWNをするわけですけど、目標位置に既にいる場合は何もしない訳です。
一方で、一定の間隔(ここでは1ms)でサンプリングをしたいので、サンプリング間隔で回して、UPやDOWN関数の方では
500usは取っていません。勿論、UPやDOWNをした際には2us程度増えますけど、それは無視しています。
※UPやDOWN関数内(の最期)に__delay_us(500);をいれてしまうと、
if(target>x9c_val)x9c_up();
else if(target<x9c_val)x9c_down();
__delay_ms(1);
}
の部分を下記のようにしなければならないので、余計解りにくくなります。
if(target>x9c_val)x9c_up();
else if(target<x9c_val)x9c_down();
else __delay_us(500);//動かさない時も同じだけ休む。実際には502usの方がより近い値
__delay_us(500);
}
更に追記。
何故か、AD5220→MD5220となって進行していました。
なので、その部分を直しました。
posは外部変数ではありません。
> //デバイス初期化関数
> void AD5220(unsigned char pos) {
このAD5220関数の「引数」です。
この位置へ移動しろ、という目標位置です。
AD5220(10);の10がposです。
なので、他の関数から操作するものではありません。
(この関数自体は初期化専用関数でもありません。初期化に利用しているだけです。)
実際の初期化は
AD5220_val=70;
while(AD5220_val)AD5220_down;
の方が確実です。
> whileの中に500待つといった内容がありません。
そこでは倍の1000us=1msになっています。
なので、当然動作が被ることはありません。
<追記します>
目標位置と現在のワイパー位置と差があれば、UPやDOWNをするわけですけど、目標位置に既にいる場合は何もしない訳です。
一方で、一定の間隔(ここでは1ms)でサンプリングをしたいので、サンプリング間隔で回して、UPやDOWN関数の方では
500usは取っていません。勿論、UPやDOWNをした際には2us程度増えますけど、それは無視しています。
※UPやDOWN関数内(の最期)に__delay_us(500);をいれてしまうと、
if(target>x9c_val)x9c_up();
else if(target<x9c_val)x9c_down();
__delay_ms(1);
}
の部分を下記のようにしなければならないので、余計解りにくくなります。
if(target>x9c_val)x9c_up();
else if(target<x9c_val)x9c_down();
else __delay_us(500);//動かさない時も同じだけ休む。実際には502usの方がより近い値
__delay_us(500);
}
更に追記。
何故か、AD5220→MD5220となって進行していました。
なので、その部分を直しました。
Re: 続10 PWM
AD5220について
>実際の初期化は
AD5220_val=70;
while(AD5220_val)AD5220_down;
の方が確実です。
このかきかたでは、初期化関数は、下記の通りと読めますが、OKでしょうか?
確認したいと思います。
記
//デバイス初期化関数
AD5220_val=70;
while(AD5220_val)AD5220_down;
またこの変更に伴って、既存外部変数
//外部変数
volatile unsigned char MD5220_val = 64; //電源ON時ワイパ中間位置
これは、そのまま残すのでしょうか?
x9cについて
>一方で、一定の間隔(ここでは1ms)でサンプリングをしたいので、
サンプリング後にUP/DOWNするわけですが、UP/DOWNに必要な時間を1msとしています。
1msではなく,100ns〜500nsではまずいのでしょうか?
抵抗値変換に必要な時間を超えてまで待つ理由は何かあるのでしょうか?
必要以上に待つように見えてしまいますが。
それとも、解釈が違うのでしょうか。
>実際の初期化は
AD5220_val=70;
while(AD5220_val)AD5220_down;
の方が確実です。
このかきかたでは、初期化関数は、下記の通りと読めますが、OKでしょうか?
確認したいと思います。
記
//デバイス初期化関数
AD5220_val=70;
while(AD5220_val)AD5220_down;
またこの変更に伴って、既存外部変数
//外部変数
volatile unsigned char MD5220_val = 64; //電源ON時ワイパ中間位置
これは、そのまま残すのでしょうか?
x9cについて
>一方で、一定の間隔(ここでは1ms)でサンプリングをしたいので、
サンプリング後にUP/DOWNするわけですが、UP/DOWNに必要な時間を1msとしています。
1msではなく,100ns〜500nsではまずいのでしょうか?
抵抗値変換に必要な時間を超えてまで待つ理由は何かあるのでしょうか?
必要以上に待つように見えてしまいますが。
それとも、解釈が違うのでしょうか。
Re: 続10 PWM
AD5220の初期化に関してですけど、パワーオンで、ワイパー位置は64です。
でも、PICが同時起動するとして、CLKはその直前はフローティング=HかLかは判らない訳です。
で、もし、Hだった後にPICのピンの初期化で、.
> PORTA = 0x00; //全てLo
> PORTB = 0x00; //全てLo
> ANSELA = 0b00000000; //全てデジタルI/Oとする
> ANSELB = 0b00001000; // SEC基板~ローパス経由でアナログ化信号をRB3でIN
> // 入出力設定
> TRISA = 0b00000000; // RA全て出力
> TRISB = 0b00001000; //RB3 ADC用入力端子
とすると、LOW出力になる訳で、その時に1クロック入ってしまうことになります。
勿論、ここで、ちゃんとPORT操作で、CLKピンをHIGHにしてから出力にすれば大丈夫なのですけど、
何かの拍子に、また全てLOWにされてしまう可能性があります。
そういった事を考慮すれば、無駄な作業もしておいた方が良い、という事です。
初期化「関数」にしてほしいなら
void AD5220_init(void){
__delay_ms(1);
AD5220_val=70;
while(AD5220_val)AD5220_down;
}
と言った所でしょうか。
外部変数の宣言は勿論残します。
サンプリングに関しては考え方が違います。
MACHからのPWM周期を考慮して、サンプリング個数とサンプリング間隔を決めます。
(アナログ取得なら)
逆に言えば、サンプリング個数と間隔からMACHのPWM周期を決めても良いです。
で、サンプリング間隔は500us以上にしておいた方が賢明、ということです。
実際にはtyp100us程度なので、150usでも問題は無いと思います。
でも、PICが同時起動するとして、CLKはその直前はフローティング=HかLかは判らない訳です。
で、もし、Hだった後にPICのピンの初期化で、.
> PORTA = 0x00; //全てLo
> PORTB = 0x00; //全てLo
> ANSELA = 0b00000000; //全てデジタルI/Oとする
> ANSELB = 0b00001000; // SEC基板~ローパス経由でアナログ化信号をRB3でIN
> // 入出力設定
> TRISA = 0b00000000; // RA全て出力
> TRISB = 0b00001000; //RB3 ADC用入力端子
とすると、LOW出力になる訳で、その時に1クロック入ってしまうことになります。
勿論、ここで、ちゃんとPORT操作で、CLKピンをHIGHにしてから出力にすれば大丈夫なのですけど、
何かの拍子に、また全てLOWにされてしまう可能性があります。
そういった事を考慮すれば、無駄な作業もしておいた方が良い、という事です。
初期化「関数」にしてほしいなら
void AD5220_init(void){
__delay_ms(1);
AD5220_val=70;
while(AD5220_val)AD5220_down;
}
と言った所でしょうか。
外部変数の宣言は勿論残します。
サンプリングに関しては考え方が違います。
MACHからのPWM周期を考慮して、サンプリング個数とサンプリング間隔を決めます。
(アナログ取得なら)
逆に言えば、サンプリング個数と間隔からMACHのPWM周期を決めても良いです。
で、サンプリング間隔は500us以上にしておいた方が賢明、ということです。
実際にはtyp100us程度なので、150usでも問題は無いと思います。
Re: 続10 PWM
>初期化「関数」にしてほしいなら
void AD5220_init(void){
__delay_ms(1);
AD5220_val=70;
while(AD5220_val)AD5220_down;
}
と言った所でしょうか。
ありがとうございます。
これでいってみます。
>MACHからのPWM周期を考慮して、サンプリング個数とサンプリング間隔を決めます(アナログ取得なら)
そうでしたか、
今回は、MACHのPWM基本周波数100Hzを基本としていたと思います。
実際のMACHは、100Hzにしてスタートします。
**************
maboさんへ、
AD5220到着ということで、ゆっくりでいいですから、結果をご披露してください。
Re: 続10 PWM
みんなで共通理解を図りたいと思います。
AD5220運転用プログラム
//RB3が汎用出力14番_SEC基板ポート2のSL-18の1番ピン(出力端子)を入力端子として受ける
//UDピンをRA0へ繋ぐ
//INCピンをRA1へ繋ぐ
//CSはGNDに繋ぐ
//PIC16F1827 Configuration Bit Settings
// CONFIG1
略
#include <xc.h>
// クロック周波数指定
// (__delay_ms()関数が必要としているため)
#define _XTAL_FREQ
#define clk LATA1
#define ud LATA0
// プロトタイプ宣言
unsigned int adconv(void); //アナログ値の変換関数
//外部変数
volatile unsigned char AD5220_val = 64; //パワーオンで、ワイパー位置は64
//U/D_up関数
void AD5220_up(void) {
ud = 1;
clk = 0;
clk = 1;
if (AD5220_val < 127)AD5220_val++;
}
//U/Ddown関数
void AD5220_down(void) {
ud = 0;
clk = 0;
clk = 1;
if (AD5220_val > 0)AD5220_val--;
}
//デバイス初期化関数
void AD5220_init(void) {
__delay_ms(1);
AD5220_val = 70;
while (AD5220_val)AD5220_down;
}
//メイン関数
void main() {
OPTION_REGbits.nWPUEN = 0; //内部プルアップ有効
OSCCON =
PORTA = 0x00; //全てLo
PORTB = 0x00; //全てLo
ANSELA = 0b00000000; //全てデジタルI/Oとする
ANSELB = 0b00001000; // SEC基板~ローパス経由でアナログ化信号をRB3でIN
// 入出力設定
TRISA = 0b00000000; // RA全て出力
TRISB = 0b00001000; //RB3 ADC用入力端子
// ADコンバータ設定
ADCON0 = 0b00100101; // アナログ変換情報設定(RB3から読込む)
ADCON1 = 0b11010000; // 読取値は右寄せ、A/D変換クロックはFOSC/16、VDDをリファレンスとする
while (1) {
static unsigned int adc[32] = {0};
static char num = 0;
unsigned int target = 0;
adc[(++num)&31] = adconv(); // アナログ値の変換関数呼び出しと配列によりAD変換値を平準化
for (char i = 0; i < 32; i++)target += adc[i];
target = target >> 8;
if (target > AD5220_val) {
AD5220_up();
} else if (target < AD5220_val) {
AD5220_down(); //U/Ddown関数呼び出し
}
}
}
// アナログ値の変換関数
unsigned int adconv() {
GO_nDONE = 1; // アナログ値読取り開始指示
while (GO_nDONE); // 読取り完了まで待つ
return ADRES;
}
AD5220運転用プログラム
//RB3が汎用出力14番_SEC基板ポート2のSL-18の1番ピン(出力端子)を入力端子として受ける
//UDピンをRA0へ繋ぐ
//INCピンをRA1へ繋ぐ
//CSはGNDに繋ぐ
//PIC16F1827 Configuration Bit Settings
// CONFIG1
略
#include <xc.h>
// クロック周波数指定
// (__delay_ms()関数が必要としているため)
#define _XTAL_FREQ
#define clk LATA1
#define ud LATA0
// プロトタイプ宣言
unsigned int adconv(void); //アナログ値の変換関数
//外部変数
volatile unsigned char AD5220_val = 64; //パワーオンで、ワイパー位置は64
//U/D_up関数
void AD5220_up(void) {
ud = 1;
clk = 0;
clk = 1;
if (AD5220_val < 127)AD5220_val++;
}
//U/Ddown関数
void AD5220_down(void) {
ud = 0;
clk = 0;
clk = 1;
if (AD5220_val > 0)AD5220_val--;
}
//デバイス初期化関数
void AD5220_init(void) {
__delay_ms(1);
AD5220_val = 70;
while (AD5220_val)AD5220_down;
}
//メイン関数
void main() {
OPTION_REGbits.nWPUEN = 0; //内部プルアップ有効
OSCCON =
PORTA = 0x00; //全てLo
PORTB = 0x00; //全てLo
ANSELA = 0b00000000; //全てデジタルI/Oとする
ANSELB = 0b00001000; // SEC基板~ローパス経由でアナログ化信号をRB3でIN
// 入出力設定
TRISA = 0b00000000; // RA全て出力
TRISB = 0b00001000; //RB3 ADC用入力端子
// ADコンバータ設定
ADCON0 = 0b00100101; // アナログ変換情報設定(RB3から読込む)
ADCON1 = 0b11010000; // 読取値は右寄せ、A/D変換クロックはFOSC/16、VDDをリファレンスとする
while (1) {
static unsigned int adc[32] = {0};
static char num = 0;
unsigned int target = 0;
adc[(++num)&31] = adconv(); // アナログ値の変換関数呼び出しと配列によりAD変換値を平準化
for (char i = 0; i < 32; i++)target += adc[i];
target = target >> 8;
if (target > AD5220_val) {
AD5220_up();
} else if (target < AD5220_val) {
AD5220_down(); //U/Ddown関数呼び出し
}
}
}
// アナログ値の変換関数
unsigned int adconv() {
GO_nDONE = 1; // アナログ値読取り開始指示
while (GO_nDONE); // 読取り完了まで待つ
return ADRES;
}
Re: 続10 PWM
x9c運転用プログラム
//RB3が汎用出力14番_SEC基板ポート2のSL-18の1番ピン(出力端子)を入力端子として受ける
//UDピンをRA0へ繋ぐ
//INCピンをRA1へ繋ぐ
//CSはGNDに繋ぐ
//PIC16F1827 Configuration Bit Settings
// CONFIG1
略
#include <xc.h>
// クロック周波数指定
// (__delay_ms()関数が必要としているため)
#define _XTAL_FREQ
#define inc LATA1
#define ud LATA0
// プロトタイプ宣言
unsigned int adconv(void); //ADC読み込み関数
//外部変数
char x9c_val; //ワイパ位置
//デバイス初期化関数
void x9c_init(void) {
ud = 0;
for (char i = 0; i < 100; i++) {
inc = 0;
__delay_us(1);
inc = 1;
__delay_us(500); //抵抗値変更にかかる時間
}
x9c_val = 0;
}
//U/D_up関数
void x9c_up(void) {
ud = 1;
inc = 0;
__delay_us(1);
inc = 1;
if (x9c_val < 100)x9c_val++;
}
//U/Ddown関数
void x9c_dowm(void) {
ud = 0;
inc = 0;
__delay_us(1);
inc = 1;
if (x9c_val > 0)x9c_val--;
}
//メイン関数
void main() {
OPTION_REGbits.nWPUEN = 0; //内部プルアップ有効
OSCCON =
PORTA = 0x00; //全てLo
PORTB = 0x00; //全てLo
ANSELA = 0b00000000; //全てデジタルI/Oとする
ANSELB = 0b00001000; // SEC基板~ローパス経由でアナログ化信号をRB3でIN
// 入出力設定
TRISA = 0b00000000; // RA全て出力
TRISB = 0b00001000; //RB3 ADC用入力端子
// ADコンバータ設定
ADCON0 = 0b00100101; // アナログ変換情報設定(RB3から読込む)
ADCON1 = 0b11010000; // 読取値は右寄せ、A/D変換クロックはFOSC/16、VDDをリファレンスとする
x9c_init(); //初期化関数呼び出し
while (1) {
static unsigned int adc[32] = {0};
static char num = 0;
unsigned int target = 0;
adc[(++num)&31] = adconv(); // アナログ値の変換関数呼び出しと配列によりAD変換値を平準化
for (char i = 0; i < 32; i++)target += adc[i];
target /= 327.4;
if (target > x9c_val) {
x9c_up();//Up関数呼び出し
} else if (target < x9c_val) {
x9c_dowm();//Ddown関数呼び出し
}
__delay_ns(100);//MACHからのPWM周期を考慮して、サンプリング個数とサンプリング間隔を決めますが、暫定100ns.
}
}
// アナログ値の変換関数
unsigned int adconv() {
GO_nDONE = 1; // アナログ値読取り開始指示
while (GO_nDONE); // 読取り完了まで待つ
return ADRES;
}
//RB3が汎用出力14番_SEC基板ポート2のSL-18の1番ピン(出力端子)を入力端子として受ける
//UDピンをRA0へ繋ぐ
//INCピンをRA1へ繋ぐ
//CSはGNDに繋ぐ
//PIC16F1827 Configuration Bit Settings
// CONFIG1
略
#include <xc.h>
// クロック周波数指定
// (__delay_ms()関数が必要としているため)
#define _XTAL_FREQ
#define inc LATA1
#define ud LATA0
// プロトタイプ宣言
unsigned int adconv(void); //ADC読み込み関数
//外部変数
char x9c_val; //ワイパ位置
//デバイス初期化関数
void x9c_init(void) {
ud = 0;
for (char i = 0; i < 100; i++) {
inc = 0;
__delay_us(1);
inc = 1;
__delay_us(500); //抵抗値変更にかかる時間
}
x9c_val = 0;
}
//U/D_up関数
void x9c_up(void) {
ud = 1;
inc = 0;
__delay_us(1);
inc = 1;
if (x9c_val < 100)x9c_val++;
}
//U/Ddown関数
void x9c_dowm(void) {
ud = 0;
inc = 0;
__delay_us(1);
inc = 1;
if (x9c_val > 0)x9c_val--;
}
//メイン関数
void main() {
OPTION_REGbits.nWPUEN = 0; //内部プルアップ有効
OSCCON =
PORTA = 0x00; //全てLo
PORTB = 0x00; //全てLo
ANSELA = 0b00000000; //全てデジタルI/Oとする
ANSELB = 0b00001000; // SEC基板~ローパス経由でアナログ化信号をRB3でIN
// 入出力設定
TRISA = 0b00000000; // RA全て出力
TRISB = 0b00001000; //RB3 ADC用入力端子
// ADコンバータ設定
ADCON0 = 0b00100101; // アナログ変換情報設定(RB3から読込む)
ADCON1 = 0b11010000; // 読取値は右寄せ、A/D変換クロックはFOSC/16、VDDをリファレンスとする
x9c_init(); //初期化関数呼び出し
while (1) {
static unsigned int adc[32] = {0};
static char num = 0;
unsigned int target = 0;
adc[(++num)&31] = adconv(); // アナログ値の変換関数呼び出しと配列によりAD変換値を平準化
for (char i = 0; i < 32; i++)target += adc[i];
target /= 327.4;
if (target > x9c_val) {
x9c_up();//Up関数呼び出し
} else if (target < x9c_val) {
x9c_dowm();//Ddown関数呼び出し
}
__delay_ns(100);//MACHからのPWM周期を考慮して、サンプリング個数とサンプリング間隔を決めますが、暫定100ns.
}
}
// アナログ値の変換関数
unsigned int adconv() {
GO_nDONE = 1; // アナログ値読取り開始指示
while (GO_nDONE); // 読取り完了まで待つ
return ADRES;
}
Re: 続10 PWM
x9c運転用プログラムと違う部分を以下のように注記しました。
← ********この部分がx9c運転用プログラムと違う
x9cテスト用 プログラム
//RB3が汎用出力14番_SEC基板ポート2のSL-18の1番ピン(出力端子)を入力端子として受ける
//UDピンをRA0へ繋ぐ
//INCピンをRA1へ繋ぐ
//CSはGNDに繋ぐ
//PIC16F1827 Configuration Bit Settings
// CONFIG1
略
#include <xc.h>
// クロック周波数指定
// (__delay_ms()関数が必要としているため)
#define _XTAL_FREQ
#define inc LATA1
#define ud LATA0
// プロトタイプ宣言
unsigned int adconv(void); //ADC読み込み関数
//外部変数
char x9c_val; //ワイパ位置
//デバイス初期化関数
void x9c_init(void) {
ud = 0;
for (char i = 0; i < 100; i++) {
inc = 0;
__delay_us(1);
inc = 1;
__delay_us(500); //抵抗値変更にかかる時間
}
x9c_val = 0;
}
//U/D_up関数
void x9c_up(void) {
ud = 1;
inc = 0;
__delay_us(1);
inc = 1;
if (x9c_val < 100)x9c_val++;
__delay_us(100);
//次の上げ下げは500us空ける
}
//U/Ddown関数
void x9c_down(void) {
ud = 0;
inc = 0;
__delay_us(1);
inc = 1;
if (x9c_val > 0)x9c_val--;
__delay_us(100);← ********この部分がx9c運転用プログラムと違う
//次の上げ下げは500us空ける
}
//メイン関数
void main() {
OPTION_REGbits.nWPUEN = 0; //内部プルアップ有効
OSCCON =
PORTA = 0x00; //全てLo
PORTB = 0x00; //全てLo
ANSELA = 0b00000000; //全てデジタルI/Oとする
ANSELB = 0b00001000; // SEC基板~ローパス経由でアナログ化信号をRB3でIN
// 入出力設定
TRISA = 0b00000000; // RA全て出力
TRISB = 0b00001000; //RB3 ADC用入力端子
// ADコンバータ設定
ADCON0 = 0b00100101; // アナログ変換情報設定(RB3から読込む)
ADCON1 = 0b11010000; // 読取値は右寄せ、A/D変換クロックはFOSC/16、VDDをリファレンスとする
x9c_init(); //初期化関数呼び出し
while(1){
for(char i=0;i<=100;i++){
x9c_up();
__delay_us(500);
}
__delay_ms(5000);
for(char i=0;i<=100;i++){
x9c_down();
__delay_us(500); ← ********この部分がx9c運転用プログラムと違う
}
__delay_ms(5000);
}
}
// アナログ値の変換と読込み処理関数
unsigned int adconv() {
GO_nDONE = 1; // アナログ値読取り開始指示
while (GO_nDONE); // 読取り完了まで待つ
return ADRES;
}
← ********この部分がx9c運転用プログラムと違う
x9cテスト用 プログラム
//RB3が汎用出力14番_SEC基板ポート2のSL-18の1番ピン(出力端子)を入力端子として受ける
//UDピンをRA0へ繋ぐ
//INCピンをRA1へ繋ぐ
//CSはGNDに繋ぐ
//PIC16F1827 Configuration Bit Settings
// CONFIG1
略
#include <xc.h>
// クロック周波数指定
// (__delay_ms()関数が必要としているため)
#define _XTAL_FREQ
#define inc LATA1
#define ud LATA0
// プロトタイプ宣言
unsigned int adconv(void); //ADC読み込み関数
//外部変数
char x9c_val; //ワイパ位置
//デバイス初期化関数
void x9c_init(void) {
ud = 0;
for (char i = 0; i < 100; i++) {
inc = 0;
__delay_us(1);
inc = 1;
__delay_us(500); //抵抗値変更にかかる時間
}
x9c_val = 0;
}
//U/D_up関数
void x9c_up(void) {
ud = 1;
inc = 0;
__delay_us(1);
inc = 1;
if (x9c_val < 100)x9c_val++;
__delay_us(100);
//次の上げ下げは500us空ける
}
//U/Ddown関数
void x9c_down(void) {
ud = 0;
inc = 0;
__delay_us(1);
inc = 1;
if (x9c_val > 0)x9c_val--;
__delay_us(100);← ********この部分がx9c運転用プログラムと違う
//次の上げ下げは500us空ける
}
//メイン関数
void main() {
OPTION_REGbits.nWPUEN = 0; //内部プルアップ有効
OSCCON =
PORTA = 0x00; //全てLo
PORTB = 0x00; //全てLo
ANSELA = 0b00000000; //全てデジタルI/Oとする
ANSELB = 0b00001000; // SEC基板~ローパス経由でアナログ化信号をRB3でIN
// 入出力設定
TRISA = 0b00000000; // RA全て出力
TRISB = 0b00001000; //RB3 ADC用入力端子
// ADコンバータ設定
ADCON0 = 0b00100101; // アナログ変換情報設定(RB3から読込む)
ADCON1 = 0b11010000; // 読取値は右寄せ、A/D変換クロックはFOSC/16、VDDをリファレンスとする
x9c_init(); //初期化関数呼び出し
while(1){
for(char i=0;i<=100;i++){
x9c_up();
__delay_us(500);
}
__delay_ms(5000);
for(char i=0;i<=100;i++){
x9c_down();
__delay_us(500); ← ********この部分がx9c運転用プログラムと違う
}
__delay_ms(5000);
}
}
// アナログ値の変換と読込み処理関数
unsigned int adconv() {
GO_nDONE = 1; // アナログ値読取り開始指示
while (GO_nDONE); // 読取り完了まで待つ
return ADRES;
}
Re: 続10 PWM
maboさん、おはようございます。
この際、自分も、AD5220を購入しようかと思います。
購入先は、RSでしょうか?
https://jp.rs-online.com/web/
この際、自分も、AD5220を購入しようかと思います。
購入先は、RSでしょうか?
https://jp.rs-online.com/web/
Re: 続10 PWM
maboさん、続けて失礼します。
AD5220です。
No1650で、
>あと、このデバイスは7ビットなので、
× target /=327.4;
○ target=target>>8;
です。
とあります。
自分としては、分解能を調べると、
少しわかったような。
今回の例で具体的に気になる点は、
8ビットのPICが計算した値で、7ビットの受信機であるAD5220とのやり取りは
うまくいくのだろうかということです。
AD5220です。
No1650で、
>あと、このデバイスは7ビットなので、
× target /=327.4;
○ target=target>>8;
です。
とあります。
自分としては、分解能を調べると、
少しわかったような。
今回の例で具体的に気になる点は、
8ビットのPICが計算した値で、7ビットの受信機であるAD5220とのやり取りは
うまくいくのだろうかということです。
Re: 続10 PWM
> × target /=327.4;
これは100分割になるように割っていますよね?
でも今回のデバイスは0〜127の範囲になるようにします。
そこが大きな違いです。
target/=128;
でも良いです。
> 8ビットのPICが計算した値で、7ビットの受信機であるAD5220
操作自体は1ビットのシリアルです。中のカウンタのメモリが7ビットなだけです。
(PICでも8ビットのタイマーと16ビットのタイマーがあるでしょ?
レジスタの中には7ビットのものもあるかもしれません。けれど、それと操作は全くの別物です)
7ビットのメモリというのは単に0〜127まで数えられる、という事です。
x9cだって、使用メモリは7ビットでしょう。
例え、16ビットのパラレル操作だったとしても、16ピンを合わせてからクロックを入れるだけです。
8ビットマイコンでは出来ない、というわけではありません。
これは100分割になるように割っていますよね?
でも今回のデバイスは0〜127の範囲になるようにします。
そこが大きな違いです。
target/=128;
でも良いです。
> 8ビットのPICが計算した値で、7ビットの受信機であるAD5220
操作自体は1ビットのシリアルです。中のカウンタのメモリが7ビットなだけです。
(PICでも8ビットのタイマーと16ビットのタイマーがあるでしょ?
レジスタの中には7ビットのものもあるかもしれません。けれど、それと操作は全くの別物です)
7ビットのメモリというのは単に0〜127まで数えられる、という事です。
x9cだって、使用メモリは7ビットでしょう。
例え、16ビットのパラレル操作だったとしても、16ピンを合わせてからクロックを入れるだけです。
8ビットマイコンでは出来ない、というわけではありません。
Re: 続10 PWM
target /=327.4;
この327.4という数字は、
10ビット1024等分の分解能なんだそうですね。
以前でのやり取りで以下の通り説明してくれました。
>
つまり、最大値が1023*4=4092です。これが100分割になるように40.9で割っています。
※今気づきましたけど、最大値が99になるようにすべきですね。
なので、40.93で割った方が良いです。
で、327.4は、32回のサンプリングの場合です。
いろんな数字が出てきますが、
>今回のデバイスは0〜127の範囲に
これは、抵抗値の段数でしょうか?
サンプリング回数からくる数値と同じ考え方をして、結果どうなのですか?
>target/=128;
プログラムが変わりましたね。
迷いますね。
色々と言われていますが、良くわからないのです。
やっと、分解能という単語を調べたところですから。
ともかく、
問題アリなら、プログラムは変えます。
できたら、部分的に書き出すのではなく、
全体がこうで、内、変更箇所はこうだと言ってくれた方が良いのです。
行き違いが少なくなります。
でも、それも、手間もかかるでしょうから、お任せします。
この327.4という数字は、
10ビット1024等分の分解能なんだそうですね。
以前でのやり取りで以下の通り説明してくれました。
>
つまり、最大値が1023*4=4092です。これが100分割になるように40.9で割っています。
※今気づきましたけど、最大値が99になるようにすべきですね。
なので、40.93で割った方が良いです。
で、327.4は、32回のサンプリングの場合です。
いろんな数字が出てきますが、
>今回のデバイスは0〜127の範囲に
これは、抵抗値の段数でしょうか?
サンプリング回数からくる数値と同じ考え方をして、結果どうなのですか?
>target/=128;
プログラムが変わりましたね。
迷いますね。
色々と言われていますが、良くわからないのです。
やっと、分解能という単語を調べたところですから。
ともかく、
問題アリなら、プログラムは変えます。
できたら、部分的に書き出すのではなく、
全体がこうで、内、変更箇所はこうだと言ってくれた方が良いのです。
行き違いが少なくなります。
でも、それも、手間もかかるでしょうから、お任せします。
Re: 続10 PWM
> 10ビット1024等分の分解能なんだそうですね。
> 以前でのやり取りで以下の通り説明してくれました。
10ビット1024等分の分解能はPIC(16f1827)のADCの分解能です。0〜1023の値が返ってきます。
> これは、抵抗値の段数でしょうか?
そうです。抵抗値の段数も、ワイパー位置も、128(100)ポジションも凡そ同じ意味です。
X9Cでは値が0〜99の範囲になるように、AD5220では値が0〜127の範囲になるように割っています。
> サンプリング回数からくる数値と同じ考え方をして、結果どうなのですか?
聞いている意味がよく判りません。
Machから速度がPWMという形で送られてきます。それは設定した最高速度に対してのHIGHの時間/周期という形で、つまり最高速度に対しても割合で送られてきます。
フィルターを付けてアナログ受信したとしても、同じことで、それはADC値/1023が最高速度に対しての割合になります。
で、出力の方はその割合で、そのアナログポテンショ(のワイパー位置)を操作することになります。
> プログラムが変わりましたね。
> 迷いますね。
これも何のことを言っているのかよく判りません。
<追記します>
基本的に聞かれたことを答えた(説明した)だけで、新たに何かをしたつもりはありません。
それと、上の確認用プログラムですけど、
adconv()
x9c_init()
は要りません。(プログラムは書き換えなくても問題はありません)
そして、MACH(SSボード、SECボード)とは繋ぎません。
勿論、LEDもボリュームも繋ぎません。
(こちらの方が重要です)
X9Cの単体のテストですから、PICとX9Cを繋いで電圧を計測してください。
> 以前でのやり取りで以下の通り説明してくれました。
10ビット1024等分の分解能はPIC(16f1827)のADCの分解能です。0〜1023の値が返ってきます。
> これは、抵抗値の段数でしょうか?
そうです。抵抗値の段数も、ワイパー位置も、128(100)ポジションも凡そ同じ意味です。
X9Cでは値が0〜99の範囲になるように、AD5220では値が0〜127の範囲になるように割っています。
> サンプリング回数からくる数値と同じ考え方をして、結果どうなのですか?
聞いている意味がよく判りません。
Machから速度がPWMという形で送られてきます。それは設定した最高速度に対してのHIGHの時間/周期という形で、つまり最高速度に対しても割合で送られてきます。
フィルターを付けてアナログ受信したとしても、同じことで、それはADC値/1023が最高速度に対しての割合になります。
で、出力の方はその割合で、そのアナログポテンショ(のワイパー位置)を操作することになります。
> プログラムが変わりましたね。
> 迷いますね。
これも何のことを言っているのかよく判りません。
<追記します>
基本的に聞かれたことを答えた(説明した)だけで、新たに何かをしたつもりはありません。
それと、上の確認用プログラムですけど、
adconv()
x9c_init()
は要りません。(プログラムは書き換えなくても問題はありません)
そして、MACH(SSボード、SECボード)とは繋ぎません。
勿論、LEDもボリュームも繋ぎません。
(こちらの方が重要です)
X9Cの単体のテストですから、PICとX9Cを繋いで電圧を計測してください。
Re: 続10 PWM
TRさん,猛牛ロックさん,こんばんは。
レス遅くなりました。
このところ,実家の草刈りで,時間取られています。
作業の途中で,激安の刈払機のネジがなくなったり,
で,何度か中断です。
後一日ぐらいで,終わるかなあ。
AD5220ですが,そうです。
https://jp.rs-online.com/web/c/semiconductors/data-converters/digital-potentiometers/?searchTerm=AD5220&redirect-relevancy-data=636F3D3126696E3D4931384E53656172636847656E65726963266C753D6A61266D6D3D6D61746368616C6C7061727469616C26706D3D5E5B5C707B4C7D5C707B4E647D2D2C2F255C2E5D2B2426706F3D31313326736E3D592673723D2673743D4B4559574F52445F53494E474C455F414C5048415F4E554D455249432677633D4E4F4E45267573743D414435323230267374613D41443532323026&r=f&searchHistory=%7B%22enabled%22:true%7D
で求めました。
一個だと高いですね。でも,50個なんていりませんものね。
暇見て,あれこれやってましたが,
モニター用に作ったLCDを破損したり,手持ちの16F88全部破損したりと,
トラブル続きでした。
もうちょっとで,確認できるかと思います。
レス遅くなりました。
このところ,実家の草刈りで,時間取られています。
作業の途中で,激安の刈払機のネジがなくなったり,
で,何度か中断です。
後一日ぐらいで,終わるかなあ。
AD5220ですが,そうです。
https://jp.rs-online.com/web/c/semiconductors/data-converters/digital-potentiometers/?searchTerm=AD5220&redirect-relevancy-data=636F3D3126696E3D4931384E53656172636847656E65726963266C753D6A61266D6D3D6D61746368616C6C7061727469616C26706D3D5E5B5C707B4C7D5C707B4E647D2D2C2F255C2E5D2B2426706F3D31313326736E3D592673723D2673743D4B4559574F52445F53494E474C455F414C5048415F4E554D455249432677633D4E4F4E45267573743D414435323230267374613D41443532323026&r=f&searchHistory=%7B%22enabled%22:true%7D
で求めました。
一個だと高いですね。でも,50個なんていりませんものね。
暇見て,あれこれやってましたが,
モニター用に作ったLCDを破損したり,手持ちの16F88全部破損したりと,
トラブル続きでした。
もうちょっとで,確認できるかと思います。
Re: 続10 PWM

> モニター用に作ったLCDを破損したり,手持ちの16F88全部破損したりと
あれあれ、どうしちゃったんですか?
16F88に関しては機種変更のいい機会かもしれません。
16Fで最強の16F17XXシリーズはどうですか?
PIC16F1769やPIC16F1778辺りです。
(USB以外の)全てが詰まっているので、他を探す必要が無くなります。
※今回の件に関しては16F1579あたりが最適だと思っています。
(16bitのPWMがあるので)
PICF88も昔は「最強」だったのでしょうけど、今では「必要最低限が揃っているマイコン」
という感じです。
> TRさん
今までのプログラムを実際に稼働させるものとして捉えているようですけど、
私としては(私が書いたものは)、どれもテスト(確認)用のプログラムです。
Gコードのみ(おまけにMACHからという前提が付きます)でしかスピンドルを動かせない、という仕様はちょっとあり得ません。
SSボードやSECボードが壊れる可能性もありますし、MACHのサポートも永久では無いでしょう。
作業上でもちょっと手動で廻したい時はあると思います。スピンドル命令の書き忘れも含めて。
実際には、添付図のような?インターフェイスを作って、ちゃんと手動も出来るようにした方が賢明です。
・manual:完全手動。ボリューム値で回す
・on/off:測度は手動(ボリューム値)だけども、MACHからのPWMの信号を受けてオン/オフだけ行う
・raw:MACHからのPWMの割合で、そのままスピンドルの割合として送る
・feed back:MACHからの速度になるように、フォトリフレクタからの実測値で合わせる。
みたいな感じの物を想像しています。
Re: 続10 PWM
猛牛ロックさん,TRさん,こんばんは。
>あれあれ、どうしちゃったんですか?
タクトスイッチ使って,アップダウンのできる基盤作成してたのですが,
18ピンの手持ちのソケットがなかったんで,
20ピンのソケット使ったのが大きな間違いでした。
目元もあやふやなので,上の方をあけて挿すように配線
したのですが,
いつものくせて,上詰めで,さして,一発で破損です。
ところで,いろいろやってみた結果です。
AD5220の公証?100kのものですが,
計測結果,約90kΩでした。
それから,TRさん,AD5220の下記のプログラム
→のような訂正が必要です。
void AD5220_up(void) {
ud = 1;
clk = 0;→1
clk = 1;→0
if (AD5220_val < 127)AD5220_val++;
}
//U/Ddown関数
void AD5220_down(void) {
ud = 0;
clk = 0;→1
clk = 1;→0
if (AD5220_val > 0)AD5220_val--;
}
AD5220はダウンのクロックで動作のようです。
引き続き,いろいろ試してみます。
******追記です。*******
ワイパー両端まで,動かすと,片側07kΩ 片側0.2kΩ程度残ります。
それから,PIC AD5220の電源の入れ方で,
コントロールできなくなる場合があるようです。
ちょっと原因は?です。
>あれあれ、どうしちゃったんですか?
タクトスイッチ使って,アップダウンのできる基盤作成してたのですが,
18ピンの手持ちのソケットがなかったんで,
20ピンのソケット使ったのが大きな間違いでした。
目元もあやふやなので,上の方をあけて挿すように配線
したのですが,
いつものくせて,上詰めで,さして,一発で破損です。
ところで,いろいろやってみた結果です。
AD5220の公証?100kのものですが,
計測結果,約90kΩでした。
それから,TRさん,AD5220の下記のプログラム
→のような訂正が必要です。
void AD5220_up(void) {
ud = 1;
clk = 0;→1
clk = 1;→0
if (AD5220_val < 127)AD5220_val++;
}
//U/Ddown関数
void AD5220_down(void) {
ud = 0;
clk = 0;→1
clk = 1;→0
if (AD5220_val > 0)AD5220_val--;
}
AD5220はダウンのクロックで動作のようです。
引き続き,いろいろ試してみます。
******追記です。*******
ワイパー両端まで,動かすと,片側07kΩ 片側0.2kΩ程度残ります。
それから,PIC AD5220の電源の入れ方で,
コントロールできなくなる場合があるようです。
ちょっと原因は?です。
Re: 続10 PWM
maboさん、今晩は。
頑張っていますね〜。
>それから,TRさん,AD5220の下記のプログラム
→のような訂正が必要です。
void AD5220_up(void) {
ud = 1;
clk = 0;→1
clk = 1;→0
if (AD5220_val < 127)AD5220_val++;
}
//U/Ddown関数
void AD5220_down(void) {
ud = 0;
clk = 0;→1
clk = 1;→0
if (AD5220_val > 0)AD5220_val--;
}
実は、その動作に係る真理値表は、x9cも、AD5220も同じなんですね。
自分としては、maboさんと同じ意見でしたが、、、。
No1535を見たらわかりますが、
maboさんと同じ提案をしましたが、
No1536で却下されました。
そういったいきさつがあります。
ただ、自分のx9cが壊れる前は、猛牛ロックさんのプログラムで、
抵抗値は、アップとダウンしました。
maboさんの意見が事実だとすると、どちらでも構わないことになってしまうけど。
どうなんだろう、
猛牛ロックさんが、No1536で理由を述べていますので見て下さい。
それと、共通理解のプログラムですが、事実は小説より奇なりです!
実験結果から、訂正すべき点があれば、この件も含めて、もう一度書き込んでください。
> ワイパー両端まで,動かすと,片側07kΩ 片側0.2kΩ程度残ります。
そうですか、自分のx9cは10kオームなんですよね、確か、210Ωから
8.5kΩでした。
ざっくりと、割合で見たら、ほぼ一緒な感じですね!!
抵抗値の誤差について、maboさんに話したでしょ。No1587で書き込みました。
データシートのこの表現!! ↓
Rtotal :end to end resistance variation min20&〜max20%
たぶん、そんなもんなんですよ、数打てば当たるかな(笑い)
かの有名な、工作室売店の記事にも同様な書き込みがあります。 ↓
「抵抗値もばらつきがある。5kΩの物を購入しても4〜6kΩにばらつく。このばらつきは分圧の時には気にならなくなります。」
http://iizukakuromaguro.sakura.ne.jp/216_digitalPOT/216_digitalPOT.html
> それから,PIC AD5220の電源の入れ方で,
コントロールできなくなる場合があるようです。
x9cもそんなところがありました。
自分は、x9cや、5220は、構造が大別して2つに分かれていると思います。
うまく言えないけど、計算する部門と、可変抵抗部分、
電源を入れるコツは、計算部門に最初に電源を入れると、動作は問題なかったと思います。
ここまで来たので、自分が気になった点がもう一点あります。
電源ONで、一瞬、大きな電流が流れてしまいました。
LEDで確認していました。これは仕方がないかな〜。
*********
追記
No1671の5220運転プログラムですが、
自分の改良したプログラムがあります。
実験していないので、、、、自信はないのですが、
自分の言った、電源の入れる順番通りにやっても、
動作不安定なら、
改良案のプログラムをお話しします。
頑張っていますね〜。
>それから,TRさん,AD5220の下記のプログラム
→のような訂正が必要です。
void AD5220_up(void) {
ud = 1;
clk = 0;→1
clk = 1;→0
if (AD5220_val < 127)AD5220_val++;
}
//U/Ddown関数
void AD5220_down(void) {
ud = 0;
clk = 0;→1
clk = 1;→0
if (AD5220_val > 0)AD5220_val--;
}
実は、その動作に係る真理値表は、x9cも、AD5220も同じなんですね。
自分としては、maboさんと同じ意見でしたが、、、。
No1535を見たらわかりますが、
maboさんと同じ提案をしましたが、
No1536で却下されました。
そういったいきさつがあります。
ただ、自分のx9cが壊れる前は、猛牛ロックさんのプログラムで、
抵抗値は、アップとダウンしました。
maboさんの意見が事実だとすると、どちらでも構わないことになってしまうけど。
どうなんだろう、
猛牛ロックさんが、No1536で理由を述べていますので見て下さい。
それと、共通理解のプログラムですが、事実は小説より奇なりです!
実験結果から、訂正すべき点があれば、この件も含めて、もう一度書き込んでください。
> ワイパー両端まで,動かすと,片側07kΩ 片側0.2kΩ程度残ります。
そうですか、自分のx9cは10kオームなんですよね、確か、210Ωから
8.5kΩでした。
ざっくりと、割合で見たら、ほぼ一緒な感じですね!!
抵抗値の誤差について、maboさんに話したでしょ。No1587で書き込みました。
データシートのこの表現!! ↓
Rtotal :end to end resistance variation min20&〜max20%
たぶん、そんなもんなんですよ、数打てば当たるかな(笑い)
かの有名な、工作室売店の記事にも同様な書き込みがあります。 ↓
「抵抗値もばらつきがある。5kΩの物を購入しても4〜6kΩにばらつく。このばらつきは分圧の時には気にならなくなります。」
http://iizukakuromaguro.sakura.ne.jp/216_digitalPOT/216_digitalPOT.html
> それから,PIC AD5220の電源の入れ方で,
コントロールできなくなる場合があるようです。
x9cもそんなところがありました。
自分は、x9cや、5220は、構造が大別して2つに分かれていると思います。
うまく言えないけど、計算する部門と、可変抵抗部分、
電源を入れるコツは、計算部門に最初に電源を入れると、動作は問題なかったと思います。
ここまで来たので、自分が気になった点がもう一点あります。
電源ONで、一瞬、大きな電流が流れてしまいました。
LEDで確認していました。これは仕方がないかな〜。
*********
追記
No1671の5220運転プログラムですが、
自分の改良したプログラムがあります。
実験していないので、、、、自信はないのですが、
自分の言った、電源の入れる順番通りにやっても、
動作不安定なら、
改良案のプログラムをお話しします。
続9 PWM
maboさん
我がx9cが壊れて、ad5220見ました。
AD5220の方が出力10ma
使い易いかな。
ただ、プログラム変更に
必要な時間を読み取れませ。
分かりますか?
我がx9cが壊れて、ad5220見ました。
AD5220の方が出力10ma
使い易いかな。
ただ、プログラム変更に
必要な時間を読み取れませ。
分かりますか?
Re: 続9 PWM
Re: 続9 PWM
TRさん,猛牛ロックさん,今晩は。
プログラムの変更ですけど,そんなに時間はかからないような気がします。
5220は,アレイが128と出ていますので,
100→128
それと,
U/D立ち下がりの25μs後にCLSが10μs
みたいなかんじでしょうか。
inc = 0;
__delay_us(1);→→____delay_us(20)
inc = 1;
__delay_us(500);→いらないかも
でしょうか。ワイパーの移動時間については,
記載がないような気がします。
ちょと分からない部分ですが・・・・・・。
それから,X9C破損しましたか。
原因は,過電流?静電気?
私は,実際に,PWMのコントローラーに入れてみたいと
思いますが,
もし,それで,破損するようなら,ML4で使うも多分,難しいでしょうね。
初めに,このデジタルポテンショメーターを考えたとき,
もしだめだったらの頭ありましたが,
だめなら,抵抗アレイとトランジスタとPICで,
X9Cと同じような配線をすれば,10階の切り替えぐらいだったら,
そんなに手間かからずに,いけるかな,と思いました。
X9Cや,5220をためして,だめだったら,私は,
自分の興味のために,抵抗アレイとトランジスタアレイとPICで,同じようなもの作ってみようと思ってます。
PIC(18ピン)→→エンコーダー→→トランジスタアレイ→→抵抗アレイ
の組み合わせて,32個程度のトランジスタコントロールできますので,
約30段階のコントロールができるものが可能のような気がします。
プログラムの変更ですけど,そんなに時間はかからないような気がします。
5220は,アレイが128と出ていますので,
100→128
それと,
U/D立ち下がりの25μs後にCLSが10μs
みたいなかんじでしょうか。
inc = 0;
__delay_us(1);→→____delay_us(20)
inc = 1;
__delay_us(500);→いらないかも
でしょうか。ワイパーの移動時間については,
記載がないような気がします。
ちょと分からない部分ですが・・・・・・。
それから,X9C破損しましたか。
原因は,過電流?静電気?
私は,実際に,PWMのコントローラーに入れてみたいと
思いますが,
もし,それで,破損するようなら,ML4で使うも多分,難しいでしょうね。
初めに,このデジタルポテンショメーターを考えたとき,
もしだめだったらの頭ありましたが,
だめなら,抵抗アレイとトランジスタとPICで,
X9Cと同じような配線をすれば,10階の切り替えぐらいだったら,
そんなに手間かからずに,いけるかな,と思いました。
X9Cや,5220をためして,だめだったら,私は,
自分の興味のために,抵抗アレイとトランジスタアレイとPICで,同じようなもの作ってみようと思ってます。
PIC(18ピン)→→エンコーダー→→トランジスタアレイ→→抵抗アレイ
の組み合わせて,32個程度のトランジスタコントロールできますので,
約30段階のコントロールができるものが可能のような気がします。
Re: 続9 PWM
AD5220はX9Cと似ているデバイスです。違いは
・100ポジションと128ポジション
・ポジション記憶機能の有無
・make before breakとダイナミック動作
と言った所ですね。
初期化は特別なルーチンは必要ありません。外部変数で
volatile unsigned char AD5220_val=64;
としておけば良いです。
※この手のデバイスは可変抵抗と同じような動作をしますけど、可変抵抗では無いので注意が必要です。
例えば、通常の安い可変抵抗でも1/8W=125mWですけど、X9C103は10mWです。電流を流せる能力は1/10以下です。
(なので、安易にLED等を繋がないほうがいいです)
当然ながら、置き換えは、損失以外にも、全てのパラメータをパスする必要があります。
AD5220のデータシートの、8,9ページにあるように、可変抵抗には2通りの使い方があります。
そこで言う、可変抵抗器動作と電圧出力動作です。
可変抵抗器動作とは、平たく言えば、電流調整動作です。実際に流す電流を調整します。
電圧出力動作とは、電圧参照動作です。電圧値を読み込ませるだけで、ほとんど電気を流しません。
スピンドルの可変抵抗器が電圧参照として使われているのなら、殆どのデジタルポテンショでそのまま置き換え可能です。
電流調整として使われているのなら、何かしらの対処が必要になるかもしれません。
スピンドルに付いている可変抵抗器がどのように使われているのかは、別に、スピンドルの中(ドライバ)を見る必要はありません。
ちゃんと調べればどのように使われているのかは把握できます。
<追記します>
上記は、PICとAD5220が同時に電源投入がある、というのが前提です。
PICのみ或いはAD5220のみをリセットした場合は位置がずれる可能性があります。
あるサイトのX9Cのコードにでは、毎回、一番下まで下げてから目標位置まで上げていました。
その時は、馬鹿な事をしている人もいるなぁ、位にしか思いませんでしたけど、
どちらかが単独でリセット状態になる可能性があるなら、そういった処理も必要なのかもしれません。
デバイス的にはPIC16Fクラスのマイコンなら、操作にdelayは必要ありません。
ただ、UDをきめて、クロックを入れるだけです。
また、幾つかの図で分かるように、ワイパーの遅れもありません。ダイナミックに切り替わります。
(当然nsクラスの遅れはあるでしょうけど)
・100ポジションと128ポジション
・ポジション記憶機能の有無
・make before breakとダイナミック動作
と言った所ですね。
初期化は特別なルーチンは必要ありません。外部変数で
volatile unsigned char AD5220_val=64;
としておけば良いです。
※この手のデバイスは可変抵抗と同じような動作をしますけど、可変抵抗では無いので注意が必要です。
例えば、通常の安い可変抵抗でも1/8W=125mWですけど、X9C103は10mWです。電流を流せる能力は1/10以下です。
(なので、安易にLED等を繋がないほうがいいです)
当然ながら、置き換えは、損失以外にも、全てのパラメータをパスする必要があります。
AD5220のデータシートの、8,9ページにあるように、可変抵抗には2通りの使い方があります。
そこで言う、可変抵抗器動作と電圧出力動作です。
可変抵抗器動作とは、平たく言えば、電流調整動作です。実際に流す電流を調整します。
電圧出力動作とは、電圧参照動作です。電圧値を読み込ませるだけで、ほとんど電気を流しません。
スピンドルの可変抵抗器が電圧参照として使われているのなら、殆どのデジタルポテンショでそのまま置き換え可能です。
電流調整として使われているのなら、何かしらの対処が必要になるかもしれません。
スピンドルに付いている可変抵抗器がどのように使われているのかは、別に、スピンドルの中(ドライバ)を見る必要はありません。
ちゃんと調べればどのように使われているのかは把握できます。
<追記します>
上記は、PICとAD5220が同時に電源投入がある、というのが前提です。
PICのみ或いはAD5220のみをリセットした場合は位置がずれる可能性があります。
あるサイトのX9Cのコードにでは、毎回、一番下まで下げてから目標位置まで上げていました。
その時は、馬鹿な事をしている人もいるなぁ、位にしか思いませんでしたけど、
どちらかが単独でリセット状態になる可能性があるなら、そういった処理も必要なのかもしれません。
デバイス的にはPIC16Fクラスのマイコンなら、操作にdelayは必要ありません。
ただ、UDをきめて、クロックを入れるだけです。
また、幾つかの図で分かるように、ワイパーの遅れもありません。ダイナミックに切り替わります。
(当然nsクラスの遅れはあるでしょうけど)
Re: 続9 PWM
猛牛ロックさん,TRさん,おはようございます。
猛牛ロックさん,詳しい解説ありがとうございます。
いつもながら,勉強になります。
ところで,一つ教えていただきたいのですが,
電圧参照と電流調整の見分け方ですが,
ボリュームを外した状態で,3本の線の2本を選んで,
抵抗を計って,抵抗0になる組み合わせがあるものは,
電流調整の方だた考えていいのでしょうか。
また,こんな調べ方して,回路等に,悪影響はないのでしょうか。
それと,もし,電圧参照の回路でしたら,アースの線と,
ワイパーの線を使って,外部からかける電圧を変更することで,
コントロールできるのでしょうか。
今日は,これから,実家の畑の草刈りです。
ああ,です。
猛牛ロックさん,詳しい解説ありがとうございます。
いつもながら,勉強になります。
ところで,一つ教えていただきたいのですが,
電圧参照と電流調整の見分け方ですが,
ボリュームを外した状態で,3本の線の2本を選んで,
抵抗を計って,抵抗0になる組み合わせがあるものは,
電流調整の方だた考えていいのでしょうか。
また,こんな調べ方して,回路等に,悪影響はないのでしょうか。
それと,もし,電圧参照の回路でしたら,アースの線と,
ワイパーの線を使って,外部からかける電圧を変更することで,
コントロールできるのでしょうか。
今日は,これから,実家の畑の草刈りです。
ああ,です。
Re: 続9 PWM

おはようございます。
AD5220用プログラムの件、すみませんでした。
>それから,X9C破損しましたか。
原因は,過電流?静電気?
x9cのつなぎ方をよく知りませんでした。
最初は、写真の右側半分の左で実験していたら、動作していましたが、突然不動となりました。
LEDとx9cを並列に繋いだ感じです。
この使い方で、故障前は、LED15mA流れていました。
x9cのPower rating の表記は、10mAといなっていますが、これは、x9cに流れる上限電流だと思うんですよね、
並列接続で、分圧されて使っていた状態で、x9cにどれほど電流が流れていたかは、
測ったような測らなかったような、記憶があいまいです。
故障後は、合成写真右半分の右で繋いでいます。
可変抵抗としての機能はだめですが、一定の明るさで点灯はしています。
つまり調整が利きません。
原因は、繋ぎ方が悪かったのでしょうか?
>PIC(18ピン)→→エンコーダー→→トランジスタアレイ→→抵抗アレイ
の組み合わせて,32個程度のトランジスタコントロールできますので,
こういった方法もあるんですね!!
よくわかりませんが、行けそうですね(^^♪
Re: 続9 PWM

>初期化は特別なルーチンは必要ありません。外部変数で
volatile unsigned char AD5220_val=64;
としておけば良いです。
この解釈についてお聴きします。
x9cの場合、ワイパ一を最下位までダウンさせた位置を「x9c_val=0」として、初期化の位置としました。
で、AD5220の場合は、
単に、volatile unsigned char AD5220_val=64;
としておけば良いです。 ということは、
百分率で、今回は、位置決めしているわけですけど、
64の位置が、再下位のスタート位置であることになるのでしょうか??
若し、そうであれば、
UP/DOWN関数の考え方も変えるのでしょうか?
ワイパーをひとつづつ、上げ下げするのではなく、
0〜128ポジション数をAD5220に入力するのでしょうか?
真理値表には、3種類しかない!!
それと、もう一点お願いします。
初期化関数について
__delay_us(500)の位置が、forループの中にありますが、
これでは、毎回500待つようになりますが、
本来は、forループを終えてから、
500を待つようにするのではないのでしょうか?
500待つのは、方向を変える場合ではなかったでしょうか?
INKの0と1を交互に繰り返すことは、
方向を変えることではないように思いますけど。
ただ、抵抗値を変えるために、500待つ必要があるというなら別ですが。
//デバイス初期化関数
void x9c_init(void) {
ud = 0;
for (char i = 0; i < 100; i++) {
inc = 0;
__delay_us(1);
inc = 1;
__delay_us(500);
}
x9c_val = 0;
}
変更後
void x9c_init(void) {
ud = 0;
for (char i = 0; i < 100; i++) {
inc = 0;
__delay_us(1);
inc = 1;
}
x9c_val = 0;__delay_us(500);
}
Re: 続9 PWM
>MABOさん
実際に動かして見なければ流れる電流は判りません。
電流を計測できない機器なら、ボリューム位置に対する電圧を数点計測すれば判ります。
> 抵抗を計って,抵抗0になる組み合わせがあるものは,
これは典型的な電流調整の接続でしょうね。間違いないと思います。
(とはいえ、普通は目視で=ケーブルでつながっているのが見えるので、抵抗値を調べないのが普通ですけど基板上ですぐに短絡しているのかな?)
この場合は実電流がどの位流れるのかを調べる必要があります。
> TRさん
私はルネサスのデータシートを見ていますけど、ほぼ同じだと思います。
X9Cは最大絶対定格で、±4.4mAです。そして、10秒以内なら8.8mA流せます。
通常は2,3mAで抑えておくべきです。そして、その時の計測値(電圧)はあまり、正しくありません。
最大絶対定格の欄で
POWER RATING
X9C103 X0C104, and X9C503 . . .10mW
となっています。これはよく抵抗器で、1/2Wとか1/8Wとか呼んでいるものです。つまり1/100Wまで、という事です。
あぁ、左側の表ですね。ルネサスのものと同じです。Iwがワイパー電流=可動端子の電流です。
つなぎ方は右の方が優しいつなぎ方ではありますけど、どちらにしても、固定抵抗を2kΩにすれば壊れません。
> 百分率で、今回は、位置決めしているわけですけど、
> 64の位置が、再下位のスタート位置であることになるのでしょうか??
百分率なんてどこにも出てきません。何を見てそう思ったのでしょう?
「再下位」は「再開」のTYPOですね?そうです。ほぼ真ん中位置でスタートします。
使い方はX9Cと全く同じです。(位置記憶機能はありませんけど、X9Cでも元々使っていません)
> 初期化関数について
これはX9Cのものですよ。
で、初期化は電源が入ってい1瞬の出来事です。500usで、100回回したとしても0.06秒に満たない時間です。
この時間に拘ること自体ナンセンスです。
> 本来は、forループを終えてから、
> 500を待つようにするのではないのでしょうか?
> 500待つのは、方向を変える場合ではなかったでしょうか?
いいえ、電源が入っているのなら、同等の条件です。初期化でも、whileループでも、動かすのは同じことです。
あと、その変更後のプログラムでは駄目です。
適切な時間を取っていません。
実際に動かして見なければ流れる電流は判りません。
電流を計測できない機器なら、ボリューム位置に対する電圧を数点計測すれば判ります。
> 抵抗を計って,抵抗0になる組み合わせがあるものは,
これは典型的な電流調整の接続でしょうね。間違いないと思います。
(とはいえ、普通は目視で=ケーブルでつながっているのが見えるので、抵抗値を調べないのが普通ですけど基板上ですぐに短絡しているのかな?)
この場合は実電流がどの位流れるのかを調べる必要があります。
> TRさん
私はルネサスのデータシートを見ていますけど、ほぼ同じだと思います。
X9Cは最大絶対定格で、±4.4mAです。そして、10秒以内なら8.8mA流せます。
通常は2,3mAで抑えておくべきです。そして、その時の計測値(電圧)はあまり、正しくありません。
最大絶対定格の欄で
POWER RATING
X9C103 X0C104, and X9C503 . . .10mW
となっています。これはよく抵抗器で、1/2Wとか1/8Wとか呼んでいるものです。つまり1/100Wまで、という事です。
あぁ、左側の表ですね。ルネサスのものと同じです。Iwがワイパー電流=可動端子の電流です。
つなぎ方は右の方が優しいつなぎ方ではありますけど、どちらにしても、固定抵抗を2kΩにすれば壊れません。
> 百分率で、今回は、位置決めしているわけですけど、
> 64の位置が、再下位のスタート位置であることになるのでしょうか??
百分率なんてどこにも出てきません。何を見てそう思ったのでしょう?
「再下位」は「再開」のTYPOですね?そうです。ほぼ真ん中位置でスタートします。
使い方はX9Cと全く同じです。(位置記憶機能はありませんけど、X9Cでも元々使っていません)
> 初期化関数について
これはX9Cのものですよ。
で、初期化は電源が入ってい1瞬の出来事です。500usで、100回回したとしても0.06秒に満たない時間です。
この時間に拘ること自体ナンセンスです。
> 本来は、forループを終えてから、
> 500を待つようにするのではないのでしょうか?
> 500待つのは、方向を変える場合ではなかったでしょうか?
いいえ、電源が入っているのなら、同等の条件です。初期化でも、whileループでも、動かすのは同じことです。
あと、その変更後のプログラムでは駄目です。
適切な時間を取っていません。
Re: 続9 PWM

>X9Cは最大絶対定格で、±4.4mAです。そして、10秒以内なら8.8mA流せます。
このことは、写真の赤矢印の事ですか?
そして、合成写真右側の区間に流れる電流値ですか?
>そうです。ほぼ真ん中位置でスタートします。
使い方はX9Cと全く同じです。(位置記憶機能はありませんけど、X9Cでも元々使っていません)
MD5220は、電源ONで、0〜128ポジションの64に来るということですか、
ということは、スタート位置を0(0Ω)としたい場合は、
外部変数で
volatile unsigned char AD5220_val=0;
上記の様にポジションを0とすれば、0Ωとなるのでしょうか?
若し、そうであれば、U/P関数や、while (1) 関数内は、以下の様にすれば良いのでしょうか?
//U/D_up関数
void MD5220_up(void) {
cs=0; ud = 1;
clk = 0;
__delay_us(1);
clk = 1;
if (MD5520_val < 127)MD5220_val++;
//次の上げ下げは500us空ける
}
while (1) {
static unsigned int adc[32] = {0};
static char num = 0;
unsigned int target = 0;
adc[(++num)&31] = adconv();// アナログ値の変換と読込み処理関数呼び出しと配列による平準化
for (char i = 0; i < 32; i++)target += adc[i];
target /=327.4;
if ((target) > xMD5220_val)MD5220_up();
else if ((target) < AD5220_val)MD5220_dowm();//U/Ddown関数呼び出し
__delay_ms(1);
}
Re: 続9 PWM
ワイパーは可動部の矢印です。つまり、TEST POINTと書いてある部分を流せる電流です。電圧値ならVw、抵抗値ならRw、電流値ならIwです。
> void AD5220_up(void) {
> cs=0; ud = 1;
> clk = 0;
> __delay_us(1);
> clk = 1;
> if (AD5520_val < 127)AD5220_val++;
> //次の上げ下げは500us空ける
> }
AD5220は即時に反映するのでdelayは要りません。なので、
void AD5220_up(void) {
ud = 1;
clk = 0;
clk = 1;
if (AD5520_val < 127)AD5220_val++;
}
です。
で、0に移動させるには書き方は色々ありますけど、
while(AD5220__val>0)AD5220_down();
です。勿論、上と同じ様に、AD5220_down関数を作る必要があります。
※別関数を作っても良いです。例えば
void AD5220(unsigned char pos){
int t=pos-AD5220_val;
if(t>0)ud=1;
else {
ud=0;
t=-t;
}
while(t){
clk=0;
clk=1;
t--;
}
}
みたいに、直接位置を指定する関数です。AD5220(0);で、0位置へ移動します。
あと、このデバイスは7ビットなので、
× target /=327.4;
○ target=target>>8;
です。
> void AD5220_up(void) {
> cs=0; ud = 1;
> clk = 0;
> __delay_us(1);
> clk = 1;
> if (AD5520_val < 127)AD5220_val++;
> //次の上げ下げは500us空ける
> }
AD5220は即時に反映するのでdelayは要りません。なので、
void AD5220_up(void) {
ud = 1;
clk = 0;
clk = 1;
if (AD5520_val < 127)AD5220_val++;
}
です。
で、0に移動させるには書き方は色々ありますけど、
while(AD5220__val>0)AD5220_down();
です。勿論、上と同じ様に、AD5220_down関数を作る必要があります。
※別関数を作っても良いです。例えば
void AD5220(unsigned char pos){
int t=pos-AD5220_val;
if(t>0)ud=1;
else {
ud=0;
t=-t;
}
while(t){
clk=0;
clk=1;
t--;
}
}
みたいに、直接位置を指定する関数です。AD5220(0);で、0位置へ移動します。
あと、このデバイスは7ビットなので、
× target /=327.4;
○ target=target>>8;
です。
Re: 続9 PWM

新しいx9cが来たらテストをしたいと思います。
テスト方法ですが、猛牛ロックさんの言われた方法は、写真の通りでよろしいでしょうか?
****************
MD5220
MD5220用ですが、一応、下記の通りやったらビルトまではOKですが、
如何でしょうか?
見てやって下さい。
#include <xc.h>
// クロック周波数指定
// (__delay_ms()関数が必要としているため)
#define _XTAL_FREQ
#define clk LATA1
#define ud LATA0
// プロトタイプ宣言
unsigned int adconv(void); //ADC読み込み関数
//外部変数
volatile unsigned char MD5220_val = 64; //電源ON時ワイパ中間位置
//デバイス初期化関数
void MD5220(unsigned char pos) {
int t = pos - MD5220_val;
if (t > 0)ud = 1;
else {
ud = 0;
t = -t;
}
while (t) {
clk = 0;
clk = 1;
t--;
}
}
//U/D_up関数
void MD5220_up(void) {
ud = 1;
clk = 0;
clk = 1;
if (MD5220_val < 127)MD5220_val++;
}
//U/Ddown関数
void MD5220_dowm(void) {
ud = 0;
clk = 0;
clk = 1;
if (MD5220_val > 0)MD5220_val--;
}
//メイン関数
void main() {
OPTION_REGbits.nWPUEN = 0; //内部プルアップ有効
OSCCON =
PORTA = 0x00; //全てLo
PORTB = 0x00; //全てLo
ANSELA = 0b00000000; //全てデジタルI/Oとする
ANSELB = 0b00001000; // SEC基板~ローパス経由でアナログ化信号をRB3でIN
// 入出力設定
TRISA = 0b00000000; // RA全て出力
TRISB = 0b00001000; //RB3 ADC用入力端子
// ADコンバータ設定
ADCON0 = 0b00100101; // アナログ変換情報設定(RB3から読込む)
ADCON1 = 0b11010000; // 読取値は右寄せ、A/D変換クロックはFOSC/16、VDDをリファレンスとする
MD5220(0); //初期化
while (1) {
static unsigned int adc[32] = {0};
static char num = 0;
unsigned int target = 0;
adc[(++num)&31] = adconv(); // アナログ値の変換と読込み処理関数呼び出しと配列によりAD変換値を平準化
for (char i = 0; i < 32; i++)target += adc[i];
target = target >> 8;
if (target > MD5220_val) {
MD5220_up();
} else if (target < MD5220_val) {
MD5220_dowm();//U/Ddown関数呼び出し
}
}
}
// アナログ値の変換と読込み処理関数
unsigned int adconv() {
GO_nDONE = 1; // アナログ値読取り開始指示
while (GO_nDONE); // 読取り完了まで待つ
return ADRES;
}
Re: 続9 PWM

プログラム的にはおかしな所は見つかりませんでした。
その図はデジタルポテンショとして、x9cのテストですか?
でしたら、その状態で、「電圧値」を読んでください。
勿論、それ以外の色々な部分の抵抗値や電圧値を計測してもらって良いんですよ。
ただ、重要なのはその状態で、上から下まで電圧が動くかどうか?です。
※データシートから、ワイパーの抵抗値が210Ωはあり得ません
今までの結果はワイパー位置が下がり切っていないか、測定ミスどちらかだと思っています。
プログラムも
while(1){
の後を変更して、
while(1){
for(char i=0;i<=100;i++){
x9c_up();
__delay_us(500);
}
__delay_ms(5000);
for(char i=0;i<=100;i++){
x9c_down();
__delay_us(500);
}
__delay_ms(5000);
}
に変えてGND-Vw間を計測して下さい。0〜5Vまで変化する筈です。
※今回は5秒間隔でワイパー位置を最上位⇔最下位に切り替えています。入力用のボリュームは使いません。
必ず、ICの抵抗部の先は何も接続しないで計測して下さい。、
Re: 続9 PWM
猛牛ロックさんへ
MD5220用プログラム有難うございます。
ご提案頂きました、下記プログラムは、x9cのテスト用ですよね?
プログラム変更方法
while(1){ の中をそっくりと入れ替えて、他のプログラムは変更なしでよろしいですか?
記
プログラムも
while(1){
の後を変更して、
while(1){
for(char i=0;i<=100;i++){
x9c_up();
__delay_us(500);
}
__delay_ms(5000);
for(char i=0;i<=100;i++){
x9c_down();
__delay_us(500);
}
__delay_ms(5000);
}
追記
x9cのUP関数について
up関数は、下記の通りとなっていますよね
で、
if (x9c_val < 100)x9c_val++; この部分は、1ポジションづつ、抵抗値を上げていくわけですよね、
であれば、
抵抗値変更に必要な時間、100〜500μsの時間関数を入れるのでは?
記
//U/D_up関数
void x9c_up(void) {
ud = 1;
inc = 0;
__delay_us(1);
inc = 1;
if (x9c_val < 100)x9c_val++;
//次の上げ下げは500us空ける
}
変更後
//U/D_up関数
void x9c_up(void) {
ud = 1;
inc = 0;
__delay_us(1);
inc = 1;
if (x9c_val < 100)x9c_val++;
__delay_us(100);
//次の上げ下げは500us空ける
}
MD5220用プログラム有難うございます。
ご提案頂きました、下記プログラムは、x9cのテスト用ですよね?
プログラム変更方法
while(1){ の中をそっくりと入れ替えて、他のプログラムは変更なしでよろしいですか?
記
プログラムも
while(1){
の後を変更して、
while(1){
for(char i=0;i<=100;i++){
x9c_up();
__delay_us(500);
}
__delay_ms(5000);
for(char i=0;i<=100;i++){
x9c_down();
__delay_us(500);
}
__delay_ms(5000);
}
追記
x9cのUP関数について
up関数は、下記の通りとなっていますよね
で、
if (x9c_val < 100)x9c_val++; この部分は、1ポジションづつ、抵抗値を上げていくわけですよね、
であれば、
抵抗値変更に必要な時間、100〜500μsの時間関数を入れるのでは?
記
//U/D_up関数
void x9c_up(void) {
ud = 1;
inc = 0;
__delay_us(1);
inc = 1;
if (x9c_val < 100)x9c_val++;
//次の上げ下げは500us空ける
}
変更後
//U/D_up関数
void x9c_up(void) {
ud = 1;
inc = 0;
__delay_us(1);
inc = 1;
if (x9c_val < 100)x9c_val++;
__delay_us(100);
//次の上げ下げは500us空ける
}
Re: 続9 PWM
そうです。X9C用のプログラムです。
> 抵抗値変更に必要な時間、100〜500μsの時間関数を入れるのでは?
ほんの10行ちょっとのプログラムです。
その中に
__delay_us(500);
が2回も書いてあるのに何でそれが目に入らないのか不思議です。
既に書いてあります。
追記です。
御免なさい誤解したようです。
そのx9c_up関数の事ですね。
付ければ無駄な時間です。
その間にADCの取得や計算、etcをすれば、自然に経過するだろう、という考えて付けていません。
ADCの間隔を優先させる考えです。
そこで付けてしまうと、ADCの間隔がまばらになってしまいます。
> 抵抗値変更に必要な時間、100〜500μsの時間関数を入れるのでは?
ほんの10行ちょっとのプログラムです。
その中に
__delay_us(500);
が2回も書いてあるのに何でそれが目に入らないのか不思議です。
既に書いてあります。
追記です。
御免なさい誤解したようです。
そのx9c_up関数の事ですね。
付ければ無駄な時間です。
その間にADCの取得や計算、etcをすれば、自然に経過するだろう、という考えて付けていません。
ADCの間隔を優先させる考えです。
そこで付けてしまうと、ADCの間隔がまばらになってしまいます。
Re: 続9 PWM
猛牛ロックさんおはようございます。
>ADCの間隔を優先させる考えです。
そこで付けてしまうと、ADCの間隔がまばらになってしまいます。
色々とお聴きしてよかったです。
有難うございます。
新めてローパスフィルターも考えてみようかと思いました。
ML4についている可変抵抗なんですが、ML4についた状態で、抵抗値を計測したら、1kΩでした。
MD5220の方が性能が良いので、MD5220にしたかったが、1kΩがないようです。
まいりました〜。
>ADCの間隔を優先させる考えです。
そこで付けてしまうと、ADCの間隔がまばらになってしまいます。
色々とお聴きしてよかったです。
有難うございます。
新めてローパスフィルターも考えてみようかと思いました。
ML4についている可変抵抗なんですが、ML4についた状態で、抵抗値を計測したら、1kΩでした。
MD5220の方が性能が良いので、MD5220にしたかったが、1kΩがないようです。
まいりました〜。
Re: 続9 PWM
Re: 続9 PWM
> MD5220用プログラムですが、初期化がおかしいと思いますが。
どの点をみて、そう思うのでしょうか? No.1651ですよね?
私も完全では無い、と思ってはいますけど、「おかしい」と思うのなら、私の考えている部分では無いような気がします。
どの点をみて、そう思うのでしょうか? No.1651ですよね?
私も完全では無い、と思ってはいますけど、「おかしい」と思うのなら、私の考えている部分では無いような気がします。
Re: 続9 PWM
MD5220の初期化関数ですが、最後の}の前に、MD5220_val=0;
が抜けていると思います。
ただ、電源ONと共に、抵抗値ポジションが64になるという事が条件です。
が抜けていると思います。
ただ、電源ONと共に、抵抗値ポジションが64になるという事が条件です。
Re: 続9 PWM
あぁ、その通りですね。
で、MD5220関数の最後の行に
MD5220_val=pos;
の一行を入れておいて下さい。
※指定した位置に移動した後に、その位置(変数)も変更しておく
で、MD5220関数の最後の行に
MD5220_val=pos;
の一行を入れておいて下さい。
※指定した位置に移動した後に、その位置(変数)も変更しておく
Re: 続9 PWM
posについて、ネット検索しましたが、分かりませんでした。難しく感じました。
まだ、実験前で、大きな事は言えません。ご容赦願います。
No1652のx9cテスト用プログラム(下記一部抜粋、気になる点のみ)は、実験していませんが、
>に変えてGND-Vw間を計測して下さい。0〜5Vまで変化する筈です。
同感です。
ただ、運転用のx9c用プログラムは、
__delay_us(500);
が無い点が気になります。
抵抗値変更に要する時間が有るのと無いのでは、差がでると推測します。
記
x9c_down();
__delay_us(500);
}
まだ、実験前で、大きな事は言えません。ご容赦願います。
No1652のx9cテスト用プログラム(下記一部抜粋、気になる点のみ)は、実験していませんが、
>に変えてGND-Vw間を計測して下さい。0〜5Vまで変化する筈です。
同感です。
ただ、運転用のx9c用プログラムは、
__delay_us(500);
が無い点が気になります。
抵抗値変更に要する時間が有るのと無いのでは、差がでると推測します。
記
x9c_down();
__delay_us(500);
}
Re: 続8ーPWM

皆さんこんばんは。
マッハの、[CLOSED LOOP]の設定方法を教えてください。
自分のスピンドルモーターには、エンコーダーのようなものがありません。
それでも、[CLOSED LOOP]にチェックを入れたり、P I Dに何かしらの数値を入れるのでしょうか?
ご紹介くださったページ、難しそうですね。
https://ja.wikipedia.org/wiki/PID制御
デフォルトでも数値が入っていましたが、やはり弄らなくちゃいけないのでしょうか??
読んでみますが、わからなかったら、再度投稿しますので、その節は宜しくお願いします。
*********************
猛牛ロックさんへ
プログラムの件、了解しました。
それと、
No1617のお写真すみません。
了解しました。
既に写真の可変抵抗が結線された既存の状態で抵抗を測ってあります。
なんと、最大で1Ωでした。 外して、もう一度抵抗値を確認します。
また、結線状態で、写真箇所の電流も図ります。
で、なんですが、
写真右のテストですが、既存のシステムだけでテストですか?
既存だけでしたら、あまり意味がないようですが。
訂正とお詫び
1Ω 正しくは、1kΩ
でした。済みませんでした。
*******************
maboさんへ
>
◯SEC(PWM出力) → ローパスフィルター(直流変換) →X9C → コントローラー(電圧制御)→適当なDCモーター
(コントローラーのボリュームとX9Cを置き換え。)
解釈ですが、
適当なDCモーター(コントローラーのボリュームとX9Cを置き換え。)とあります。
DCモーターに括弧をつけて、抜き出しています。 DCモーターに付属する何かがあって、
その何かで何をするのでしょうか??
それと、SEC→→ローパスフィルター →→ PICのAD変換 →→ X9C →→ ML4
これですが、
ローパスフィルターで、PWMを平準化しますよね、で、この流れだと、PICとx9cによって、もう一度
直流の電圧を平準化します。 これでは、2度平準化しますよ!!
これでも良いのでしょうか? ちょっと見、無駄な感じがします。
このことは、猛牛ロックさんも言われていることだと思っていましたが。
Re: 続8ーPWM
TRさん,こんばんは。
すみません間違いがありました。
◯SEC(PWM出力) → ローパスフィルター(直流変換) →X9C → コントローラー(電圧制御)→適当なDCモーター
(コントローラーのボリュームとX9Cを置き換え。)
これ,
◯SEC→ローパスフィルター→PICAD変換→X9C→コントローラー→適当なDCモーター
で,PICのAD変換がぬけてました。
括弧のなかは,この流れだと,PWMのコントローラーの
ボリュームとX9Cを置き換えて,確かめる,の意味でした。
モーターには,何もしなくて大丈夫です。
>それと、SEC→→ローパスフィルター →→ PICのAD変換 →→ X9C →→ ML4
>これですが、
>ローパスフィルターで、PWMを平準化しますよね、で、この流れだと、PICとx9cによって、もう一度
>直流の電圧を平準化します。 これでは、2度平準化しますよ!!
>これでも良いのでしょうか? ちょっと見、無駄な感じがします。
>このことは、猛牛ロックさんも言われていることだと思っていましたが。
これですが,PICでやってることは,
ローパスフィルターで読み取った電圧をならして,
それに応じたX9Cの設定をすることです。
ローパスフィルターでやることと,PICでならすことは,
どちらも必要なことだと思います。
ローパスフィルターを通った信号に乱れがあるので,
読み取るために,何回か平均をとってます。
この平均に基づいて,X9Cの設定をします。
それから,P I Dの設定ですけど,
すみません,研究中です。
なかなかうまくいきません。
すみません間違いがありました。
◯SEC(PWM出力) → ローパスフィルター(直流変換) →X9C → コントローラー(電圧制御)→適当なDCモーター
(コントローラーのボリュームとX9Cを置き換え。)
これ,
◯SEC→ローパスフィルター→PICAD変換→X9C→コントローラー→適当なDCモーター
で,PICのAD変換がぬけてました。
括弧のなかは,この流れだと,PWMのコントローラーの
ボリュームとX9Cを置き換えて,確かめる,の意味でした。
モーターには,何もしなくて大丈夫です。
>それと、SEC→→ローパスフィルター →→ PICのAD変換 →→ X9C →→ ML4
>これですが、
>ローパスフィルターで、PWMを平準化しますよね、で、この流れだと、PICとx9cによって、もう一度
>直流の電圧を平準化します。 これでは、2度平準化しますよ!!
>これでも良いのでしょうか? ちょっと見、無駄な感じがします。
>このことは、猛牛ロックさんも言われていることだと思っていましたが。
これですが,PICでやってることは,
ローパスフィルターで読み取った電圧をならして,
それに応じたX9Cの設定をすることです。
ローパスフィルターでやることと,PICでならすことは,
どちらも必要なことだと思います。
ローパスフィルターを通った信号に乱れがあるので,
読み取るために,何回か平均をとってます。
この平均に基づいて,X9Cの設定をします。
それから,P I Dの設定ですけど,
すみません,研究中です。
なかなかうまくいきません。
Re: 続8ーPWM
maboさんへ
>これですが,PICでやってることは,
ローパスフィルターで読み取った電圧をならして,
それに応じたX9Cの設定をすることです。
ローパスフィルターでやることと,PICでならすことは,
どちらも必要なことだと思います。
ローパスフィルターを通った信号に乱れがあるので,
読み取るために,何回か平均をとってます。
この平均に基づいて,X9Cの設定をします。
大変恐縮ですが、怒らないで下さい。
x9cは、平準化プログラム込みのPICで使います。
コンデンサと抵抗は、無くて済むなら使わない方が良いと思います。
なので、先ずは、x9cは、平準化プログラム込みのPICの波形をオシロで比べてみて、それでも追いつかないようでしたら、
ローパスフィルターも併せて使った方が良いと思いますよ。
本当にごめんなさい。 言い過ぎかも。
>これですが,PICでやってることは,
ローパスフィルターで読み取った電圧をならして,
それに応じたX9Cの設定をすることです。
ローパスフィルターでやることと,PICでならすことは,
どちらも必要なことだと思います。
ローパスフィルターを通った信号に乱れがあるので,
読み取るために,何回か平均をとってます。
この平均に基づいて,X9Cの設定をします。
大変恐縮ですが、怒らないで下さい。
x9cは、平準化プログラム込みのPICで使います。
コンデンサと抵抗は、無くて済むなら使わない方が良いと思います。
なので、先ずは、x9cは、平準化プログラム込みのPICの波形をオシロで比べてみて、それでも追いつかないようでしたら、
ローパスフィルターも併せて使った方が良いと思いますよ。
本当にごめんなさい。 言い過ぎかも。
Re: 続8ーPWM
TRさん、こんばんは。
>大変恐縮ですが、怒らないで下さい。
大丈夫ですよ。
ローパスフィルター使わないのであれば、デジタルで受け取る
ということになると思います。
そうすると、猛牛ロックさんが、書いてくれた後の方のプログラムお使いいなるのかな。
AD変換しないで、デジタルで受け取ったものを処理した方が、
ノイズ等の心配も少なくなりますしね。
猛牛ロックさんも、デジタルで受け取る方が好みだとおっしゃってました。
今日は、ドライバー作って、TK100A08N1というFETで、
回転数調べていました。
回転始めから、最高回転までの、範囲が、狭いようでした。
PWMのコントローラーは、DUTY比が4%〜69%の範囲で
動いていましたが、
今回買い求めたのは、12%〜48%と狭くなりました。
FET差し替えられるようにしましたので、
いくつか変えて、検証してみようかなと思います。
>大変恐縮ですが、怒らないで下さい。
大丈夫ですよ。
ローパスフィルター使わないのであれば、デジタルで受け取る
ということになると思います。
そうすると、猛牛ロックさんが、書いてくれた後の方のプログラムお使いいなるのかな。
AD変換しないで、デジタルで受け取ったものを処理した方が、
ノイズ等の心配も少なくなりますしね。
猛牛ロックさんも、デジタルで受け取る方が好みだとおっしゃってました。
今日は、ドライバー作って、TK100A08N1というFETで、
回転数調べていました。
回転始めから、最高回転までの、範囲が、狭いようでした。
PWMのコントローラーは、DUTY比が4%〜69%の範囲で
動いていましたが、
今回買い求めたのは、12%〜48%と狭くなりました。
FET差し替えられるようにしましたので、
いくつか変えて、検証してみようかなと思います。
Re: 続8ーPWM
> TRさん
やっている事の意味がわかりませんけど、内部を計測したいなら可変抵抗を外した方が良いです。
繋がった状態だとボリューム位置で抵抗値が変わります。
スピンドルの巻き線抵抗を調べているんですか?
> 写真右のテストですが、既存のシステムだけでテストですか?
そうです。その可変抵抗を1本の抵抗で置き換えて、その可変抵抗の意味を調べます。
つまり、どういった回路をそこに繋げば制御出来るのか、という、一番最初にやるべきことです。
入口(PCからのPWM)と出口(スピンドルへの出力)の仕様が判らなければ、動くかどうか聞かれても判断が付きません。
それと、8個の平均を出したのはアナログ受信のプログラムです。デジタルなら100以上にした方が良いです。
追記します
スピンドルの基板から回路(使っているIC)が解るなら、それでも構いません。
やっている事の意味がわかりませんけど、内部を計測したいなら可変抵抗を外した方が良いです。
繋がった状態だとボリューム位置で抵抗値が変わります。
スピンドルの巻き線抵抗を調べているんですか?
> 写真右のテストですが、既存のシステムだけでテストですか?
そうです。その可変抵抗を1本の抵抗で置き換えて、その可変抵抗の意味を調べます。
つまり、どういった回路をそこに繋げば制御出来るのか、という、一番最初にやるべきことです。
入口(PCからのPWM)と出口(スピンドルへの出力)の仕様が判らなければ、動くかどうか聞かれても判断が付きません。
それと、8個の平均を出したのはアナログ受信のプログラムです。デジタルなら100以上にした方が良いです。
追記します
スピンドルの基板から回路(使っているIC)が解るなら、それでも構いません。
Re: 続8ーPWM
maboさん、おはようございます。
>そうすると、猛牛ロックさんが、書いてくれた後の方のプログラムお使いいなるのかな。
No1553ですか、1553は難しくて、、、理解できませんでした。
****************
猛牛ロックさんおはようございます。
既存の資料は何もないので、分かりません。
なので、改造できそうなスピードコントロールに使われている可変抵抗をx9cに変えようとしています。
で、
あえて、可変抵抗を外して、抵抗を入れて、既存システムでスピンドルを回すということは、
その理由が分かりません。
分からないという理由
可変抵抗で回るのでしょうから、固定抵抗に置き換えても、スピードは分かりませんが、回ると思います。
しかしながらテストをすることとは、、、を考えると。
それでもテストするということは、
可変抵抗が確実に、スピンドルモーターのスピードコントロールに寄与しているかどうかを
確認するということなんでしょうね。
分かりました。 やってみます。
テスト方法
再度、可変抵抗の最大抵抗値を計測し、その抵抗値の半分以上を使って、既存システムで、まわしてみる。
>それと、8個の平均を出したのはアナログ受信のプログラムです。デジタルなら100以上にした方が良いで
サンプリング回数を変える場合、プログラムを一部を変えるが、
デバイスの初期化関数は、デバイスの関係で500が上限と言っていました。
算出方法
PWM基本周波数/サンプル数
例
100Hzなら、1周期=0.01s
8サンプルで0.01/8=0.00125s=1250μs
8サンプルで1250、なのに、100サンプル、、
デバイスの上限を超えているので、、、、
*************
maboさん、、、、
ローパスと併用ですよ!! 多分。
>そうすると、猛牛ロックさんが、書いてくれた後の方のプログラムお使いいなるのかな。
No1553ですか、1553は難しくて、、、理解できませんでした。
****************
猛牛ロックさんおはようございます。
既存の資料は何もないので、分かりません。
なので、改造できそうなスピードコントロールに使われている可変抵抗をx9cに変えようとしています。
で、
あえて、可変抵抗を外して、抵抗を入れて、既存システムでスピンドルを回すということは、
その理由が分かりません。
分からないという理由
可変抵抗で回るのでしょうから、固定抵抗に置き換えても、スピードは分かりませんが、回ると思います。
しかしながらテストをすることとは、、、を考えると。
それでもテストするということは、
可変抵抗が確実に、スピンドルモーターのスピードコントロールに寄与しているかどうかを
確認するということなんでしょうね。
分かりました。 やってみます。
テスト方法
再度、可変抵抗の最大抵抗値を計測し、その抵抗値の半分以上を使って、既存システムで、まわしてみる。
>それと、8個の平均を出したのはアナログ受信のプログラムです。デジタルなら100以上にした方が良いで
サンプリング回数を変える場合、プログラムを一部を変えるが、
デバイスの初期化関数は、デバイスの関係で500が上限と言っていました。
算出方法
PWM基本周波数/サンプル数
例
100Hzなら、1周期=0.01s
8サンプルで0.01/8=0.00125s=1250μs
8サンプルで1250、なのに、100サンプル、、
デバイスの上限を超えているので、、、、
*************
maboさん、、、、
ローパスと併用ですよ!! 多分。
Re: 続8ーPWM
> 再度、可変抵抗の最大抵抗値を計測し、その抵抗値の半分以上を使って、既存システムで、まわしてみる。
可変抵抗の最大値の1倍(〜10倍程度)までならどれでも良いです。ただし、値は覚えておいてください。
可変抵抗の最大値(固定された端子間)は外した状態で測ってください。
まず、その3本を外した状態で、電源を入れて、赤-黒間の電圧を計測してください。
もしかしたら高い電圧かも知れません。
(ここで5Vならいい結果が期待出来ます。高い電圧だと厳しくなります)
元の可変抵抗の固定部を使って切り替えても良いです。
上図で、
「赤と青を使って最高速、黒と青を使って動かない」というのが「良い結果」です。
なので、それでテスト終了です。
それ以外の結果の場合は…
まぁその時考えましょう。
可変抵抗の最大値の1倍(〜10倍程度)までならどれでも良いです。ただし、値は覚えておいてください。
可変抵抗の最大値(固定された端子間)は外した状態で測ってください。
まず、その3本を外した状態で、電源を入れて、赤-黒間の電圧を計測してください。
もしかしたら高い電圧かも知れません。
(ここで5Vならいい結果が期待出来ます。高い電圧だと厳しくなります)
元の可変抵抗の固定部を使って切り替えても良いです。
上図で、
「赤と青を使って最高速、黒と青を使って動かない」というのが「良い結果」です。
なので、それでテスト終了です。
それ以外の結果の場合は…
まぁその時考えましょう。
Re: 続8ーPWM
TRさん,猛牛ロックさん,おはようございます。
TRさん,ご指摘ありがとうございます。
>maboさん、、、、
>ローパスと併用ですよ!! 多分。
これ,ブログの方の,基本周波数の変換のプログラムですか?。
何年か前に,最初に取り組んだ時に,これではまりました。
プログラムは外国の諸兄,回路は日本の諸兄,
という組み合わせで,ローパスフィルター入れて,もがきました。
結果,ローパルフィルタ入れるとデジタルのサンプリング
できなくなりました。
今は,なんとなく理解できるのですが・・・・・・・。
それから,サンプリングですが,TRさんのおっしゃってることちょっとわからないのですが,
下記のように理解してます。
サンプリングの最小は,PICのクロック数に依存するので,
私が使ってるPICは,8Mhzで動作してますので,
クロック8MHz→1クロック0.125μs→1命令サイクル0.5μs
0.5μsより短い期間でのサンプリングはできませんが,
これより長ければ可と理解してます。
==================
違う種類のFETを注文しています。
一つは,諸兄のHPあった,3020のFET
もう一つは,ブログの方に書いた,値段の差のある
PWMのコントローラーです。
ちょっと,楽しみですが,X9Cは,まだとどきません。
アリでの購入の方がよかったかなあ。
TRさん,ご指摘ありがとうございます。
>maboさん、、、、
>ローパスと併用ですよ!! 多分。
これ,ブログの方の,基本周波数の変換のプログラムですか?。
何年か前に,最初に取り組んだ時に,これではまりました。
プログラムは外国の諸兄,回路は日本の諸兄,
という組み合わせで,ローパスフィルター入れて,もがきました。
結果,ローパルフィルタ入れるとデジタルのサンプリング
できなくなりました。
今は,なんとなく理解できるのですが・・・・・・・。
それから,サンプリングですが,TRさんのおっしゃってることちょっとわからないのですが,
下記のように理解してます。
サンプリングの最小は,PICのクロック数に依存するので,
私が使ってるPICは,8Mhzで動作してますので,
クロック8MHz→1クロック0.125μs→1命令サイクル0.5μs
0.5μsより短い期間でのサンプリングはできませんが,
これより長ければ可と理解してます。
==================
違う種類のFETを注文しています。
一つは,諸兄のHPあった,3020のFET
もう一つは,ブログの方に書いた,値段の差のある
PWMのコントローラーです。
ちょっと,楽しみですが,X9Cは,まだとどきません。
アリでの購入の方がよかったかなあ。
Re: 続8ーPWM
maboさん
500マイクロは、1553にあるぷろぐらむで、初期化関数にあります。
猛牛ロックさんとのやり取りで、x9cの能力と聴いていました。
聞き間違えかもしれませんが、x9cは、500マイクロより、短時間では、動作しないと思いました。
猛牛ロックさんに、突っ込んで、聞けば良かった点です。
INCは500マイクロ必要かもしれません。
******
猛牛ロックさん
詳しく解説して下さい。x9cのデータシートの何処をどのように理解したらよろしいか。
500マイクロは、1553にあるぷろぐらむで、初期化関数にあります。
猛牛ロックさんとのやり取りで、x9cの能力と聴いていました。
聞き間違えかもしれませんが、x9cは、500マイクロより、短時間では、動作しないと思いました。
猛牛ロックさんに、突っ込んで、聞けば良かった点です。
INCは500マイクロ必要かもしれません。
******
猛牛ロックさん
詳しく解説して下さい。x9cのデータシートの何処をどのように理解したらよろしいか。
Re: 続8ーPWM
TRさん,はい,TRさんがおっしゃってたのは,
X9Cの500μsでしたか。
これは,サンプリングではなく,
X9Cが一つワイパーを動かすのにかかる時間と,
私は理解しました。
ですから,次の動作まで,500μs 待つのだと思ってました。
動作の途中で,次の命令しても,受け付けない,
と思ってました。
X9Cの500μsでしたか。
これは,サンプリングではなく,
X9Cが一つワイパーを動かすのにかかる時間と,
私は理解しました。
ですから,次の動作まで,500μs 待つのだと思ってました。
動作の途中で,次の命令しても,受け付けない,
と思ってました。
Re: 続8ーPWM
その辺りは2つの値が記載されています。
命令自体は1usで良い筈です。
その後にワイパーが動いて完了するまでが最大500usです。(標準で100us)
ワイパー自体は“make-before-break”動作です。
つまり、次のワイパーを繋いでから前のワイパーを切ります。
※必ずしも待たなければならない訳では無いと思います。
つまり、「待て」と書いてあるわけではありません。
けれども、例えば30ワイパーとかを連続(2us)間隔で命令を入れれば、並列で数ワイパー繋がり、瞬間的に抵抗が下がります。
その辺りをどう判断するかです。実際には仕様上、1つのワイパー動作でも1つ並列状態にはなります。
私は、確実だと思う方法を書いただけです。
例えば10usでwhileループを回しても動作はすると思います。
命令自体は1usで良い筈です。
その後にワイパーが動いて完了するまでが最大500usです。(標準で100us)
ワイパー自体は“make-before-break”動作です。
つまり、次のワイパーを繋いでから前のワイパーを切ります。
※必ずしも待たなければならない訳では無いと思います。
つまり、「待て」と書いてあるわけではありません。
けれども、例えば30ワイパーとかを連続(2us)間隔で命令を入れれば、並列で数ワイパー繋がり、瞬間的に抵抗が下がります。
その辺りをどう判断するかです。実際には仕様上、1つのワイパー動作でも1つ並列状態にはなります。
私は、確実だと思う方法を書いただけです。
例えば10usでwhileループを回しても動作はすると思います。
Re: 続8ーPWM

TRさん,初期化関数変更して,抵抗どうなりましたか?
ワイパー一番端に行って,40Ωになったでしょうか。
私は,X9Cまだ届かないので,
疑似X9C作成して,あそんでました。
私のPWMコントローラーのボリュームと換装して,いじってみたら,
回転数は,
90kΩ 1200rpm
80kΩ 4300rpm
70kΩ 6000rpm
60kΩ 7000rpm
50kΩ 7700rpm
40kΩ 8100rpm
30kΩ 8500rpm
20kΩ 8700rpm
10kΩ 9100rpm
Ωで書いてますけど,10kΩの抵抗10個で,
100kΩ(およそ90kΩ)にはなりませんでしたので,
90kΩ→→10kΩ1個====10kΩ9個の分圧
の結果ぐらいの意味しかないと思いますが,
こんな結果でした。
グラフにしてみると,Cカーブのボリュームのグラフ
に近い傾向でした。
==========================
猛牛ロックさん,TRさん,下記の様な記事を見つけました。
https://www.cnczone.com/forums/mach-software-artsoft-software-/241922-pid-control-spindle-speed.html
この書き込みでは, PID control は,SS等ではできない
の書き込みでした。
パラレルで試すの,面倒ですねえ。
Re: 続8ーPWM
皆さん済みませんでした。
やはり、ローパスフィルターは必要でした。
PICのプログラムは、ADコンバーターでした。
なので、PICに入れる信号はローパスフィルターでアナログ化しなければなりません。
すっかり、勘違いしていました。
SEC基板〜ローパスフィルター(10μ・22Ω)〜PIC〜x9c〜ML4
でした。
************
maboさんへ、
>ワイパー一番端に行って,40Ωになったでしょうか。
x9cの1kΩを追加しましたので、
これが来たら、試すつもりです。
若し、好転しなくても、計画は進めてみます。
ML4のモーターが回れば、良しとします。
欲を言えば、実際に使えたらいいのですが。
今回の計画は、複雑です(笑)
それから、
1633の実験結果を見ると、全体の1割程度の抵抗値は、気にしなくてもよさそうですね。
というのも、予期してスピンドルモーターが回るなら、それはそれでいいと思います。
止まらなかったら、やばいけど、そういった事はないでしょうから。
理由
プログラムで、スピンドル停止の指令があると思うからです。
やはり、ローパスフィルターは必要でした。
PICのプログラムは、ADコンバーターでした。
なので、PICに入れる信号はローパスフィルターでアナログ化しなければなりません。
すっかり、勘違いしていました。
SEC基板〜ローパスフィルター(10μ・22Ω)〜PIC〜x9c〜ML4
でした。
************
maboさんへ、
>ワイパー一番端に行って,40Ωになったでしょうか。
x9cの1kΩを追加しましたので、
これが来たら、試すつもりです。
若し、好転しなくても、計画は進めてみます。
ML4のモーターが回れば、良しとします。
欲を言えば、実際に使えたらいいのですが。
今回の計画は、複雑です(笑)
それから、
1633の実験結果を見ると、全体の1割程度の抵抗値は、気にしなくてもよさそうですね。
というのも、予期してスピンドルモーターが回るなら、それはそれでいいと思います。
止まらなかったら、やばいけど、そういった事はないでしょうから。
理由
プログラムで、スピンドル停止の指令があると思うからです。
Re: 続8ーPWM
maboさんへ
>この書き込みでは, PID control は,SS等ではできない
グーグル翻訳で解明しようとしましたが、ちんぷんかんぷん。
でも、maboさんの解説のとおりでしょうから、
マッハのPIDは、自分のSSでは無理だとわかりました。
有難うございます。
>この書き込みでは, PID control は,SS等ではできない
グーグル翻訳で解明しようとしましたが、ちんぷんかんぷん。
でも、maboさんの解説のとおりでしょうから、
マッハのPIDは、自分のSSでは無理だとわかりました。
有難うございます。
Re: 続8ーPWM

前記事で,PIDはSSでは動かないの記事を見つけた,
と書きました。
その記事は,
Jeff Birt at Warp9 says that one cannot use the PID
control with an external motion control device (eg ESS)
なんですけど,これ,又聞きなんでしょうかね。
本家 Warp9 のフォーラムのぞいてみたのですが,
PIDの話題が結構でてます。
もし動かないなら,話題にならないような気がしてきました。
MACH4でのコントロールの様子ですが,添付のグラフがありました。
もうちょとあさってみます。
PIDのことについては,分かり易いHPがありました。
http://www.picfun.com/motor05.html
◯mazonにX9Cはたのんだのですが,まだきません。
いろいろあさってたら,別な物見つけたので,
それ,追加で注文しました。
https://jp.rs-online.com/web/p/digital-potentiometers/5236816/
マニュアルも日本語のありました。
https://www.analog.com/media/jp/technical-documentation/data-sheets/AD5220_JP.pdf
分かれば,こちら頼んだのにと,思いました。
Re: 続8ーPWM

自分のx9cですが、壊れてしまったようで、
昨晩から、x9cにつなげたモニター用LEDが点灯しなくなりました。
取説、ありがとうございます。
INC・UDは、プルアップしないといけないようですね。
早速、INK/UDがつながっているPICの各ピンをプルアップに変更します。
それと、UP/DOWNのきっかけは、立下りエッジ検出のCLK=INKとなっていますね。
これで、初期化関数にある↓の意味が分かりました。
for (char i = 0; i < 100; i++) {
inc = 0;
__delay_us(1);
inc = 1;
__delay_us(500);
}
>分かれば,こちら頼んだのにと,思いました。
今回は、比較的に低廉な商品でよかったですね。
バイクの方は、そうはいきません、よくやりましたよ(笑)
Re: 続8ーPWM
maboさんへ、 もう一件失礼します。
SEC→ローパスフィルター→PICAD変換→X9C→コントローラー→適当なDCモーター
この流れで、ローパスフィルターは成功しましたか?
成功しているようであれば、CとRの数値を教えてください。
また、カットオフ周波数も分かればお願いします。
というのも、↓の記事が目に止まりました。
No1625
プログラムは外国の諸兄,回路は日本の諸兄,
という組み合わせで,ローパスフィルター入れて,もがきました。
結果,ローパルフィルタ入れるとデジタルのサンプリング
できなくなりました。
SEC→ローパスフィルター→PICAD変換→X9C→コントローラー→適当なDCモーター
この流れで、ローパスフィルターは成功しましたか?
成功しているようであれば、CとRの数値を教えてください。
また、カットオフ周波数も分かればお願いします。
というのも、↓の記事が目に止まりました。
No1625
プログラムは外国の諸兄,回路は日本の諸兄,
という組み合わせで,ローパスフィルター入れて,もがきました。
結果,ローパルフィルタ入れるとデジタルのサンプリング
できなくなりました。
Re: 続8ーPWM
TRさん,おはようございます。
TRさん,取説は,X9Cのものではないので,
お間違いのないように。
AD5220という型番のものです。
>SEC→ローパスフィルター→PICAD変換→X9C→コントローラー→適当なDCモーター
実機が届いてないので,LEDでのPICの動作確認ですが,
SS→→ローパスフィルター→→PICAD変換→LED
で,動作の確認はしてます。
X9C→コントローラー→適当なDCモーター
の部分が未確認です。
ローパスフィルターは,20kと10μF だったと思います。
ローパスフィルターいれて,だめだったのは,
今考えると当たりまえなのですが,デジタルで受けたからです。
ローパスフィルタ(日本の諸兄の配線図)→→デジタル受け(外国の諸兄のプログラム)
での失敗です。ローパスフィルターに使った抵抗とコンデンサーの選択の失敗ではなくで,
アナログ→デジタル
のながれでのあたりまえの失敗でした。今週には,
X9CもAD5220も届くと思いますので,確認しようと思ってます。
それから,パラレルでのPIDの検証もしたいと思ってます。
TRさん,取説は,X9Cのものではないので,
お間違いのないように。
AD5220という型番のものです。
>SEC→ローパスフィルター→PICAD変換→X9C→コントローラー→適当なDCモーター
実機が届いてないので,LEDでのPICの動作確認ですが,
SS→→ローパスフィルター→→PICAD変換→LED
で,動作の確認はしてます。
X9C→コントローラー→適当なDCモーター
の部分が未確認です。
ローパスフィルターは,20kと10μF だったと思います。
ローパスフィルターいれて,だめだったのは,
今考えると当たりまえなのですが,デジタルで受けたからです。
ローパスフィルタ(日本の諸兄の配線図)→→デジタル受け(外国の諸兄のプログラム)
での失敗です。ローパスフィルターに使った抵抗とコンデンサーの選択の失敗ではなくで,
アナログ→デジタル
のながれでのあたりまえの失敗でした。今週には,
X9CもAD5220も届くと思いますので,確認しようと思ってます。
それから,パラレルでのPIDの検証もしたいと思ってます。
Re: 続7ーPWM
maboさんへ、
VGSの電圧ですが、2Vからですね、もっと低い電圧からの方がいいと思います。
VGSの電圧ですが、2Vからですね、もっと低い電圧からの方がいいと思います。
Re: 続7ーPWM
うわー、またまた引っかかってしまった―
…と思ったらTRさんが立ててくれてた(^^)/
> TRさん
薦める方法は特にありません。使用者が何を求めているか?でしょう。
総体としては、ちゃんとGコードで回転数まできちっと制御するのがマシンとしてはベストなのでしょう。
けれども私は、切削途中で様子を見ながら手動で変えたいタチなので、全くそのような制御は望みません。
強いて言えば、Gコードが終わった時に同時に止まってくれればOKという感じです。
つなぎ方から言えば、そのつなぎ方でも良いかもしれないし、上手くはいかないかも知れないし、といった所です。
重要な部分は最終的な部分、つまりx9c〜ML4が上手く行くかどうかです。
ここをテストしなければ方針も定まりません。
>デジタルでやった方が良いです。
これは「デジタル信号を受信するなら」デジタルで受けた方が良い、と言っただけです。アナログ信号ならADCで受けます。
>Maxでは1kΩ程度ですね。
これは〜4.5Vの部分です。5Vに「0.5V足りない」、という部分が1kΩ相当という意味です。
X9Cに関して、簡潔に言えば、出力ピン=VWピンからLEDを繋いだら(電気を使ったら)ダメという事です。
LEDを取った状態で計測しなければ意味がありません。
> MABOさん
電気を流す時間と回転数が比例するとは思えません。例え合わせたとしても、トルクをかけるとまた条件が変わるでしょう。
あくまで、MACHからの信号は目標回転数としてくるのであって、実際の回転数は別物として制御する必要があると思います。
※これはシンクロにチェックを入れない=PWMで目標回転数を伝える設定の場合です。
で、MACHにその機能(目標回転数に合わせてPWM信号が変化する)があるのなら、そっちがどう動くのかに期待しています。
…と思ったらTRさんが立ててくれてた(^^)/
> TRさん
薦める方法は特にありません。使用者が何を求めているか?でしょう。
総体としては、ちゃんとGコードで回転数まできちっと制御するのがマシンとしてはベストなのでしょう。
けれども私は、切削途中で様子を見ながら手動で変えたいタチなので、全くそのような制御は望みません。
強いて言えば、Gコードが終わった時に同時に止まってくれればOKという感じです。
つなぎ方から言えば、そのつなぎ方でも良いかもしれないし、上手くはいかないかも知れないし、といった所です。
重要な部分は最終的な部分、つまりx9c〜ML4が上手く行くかどうかです。
ここをテストしなければ方針も定まりません。
>デジタルでやった方が良いです。
これは「デジタル信号を受信するなら」デジタルで受けた方が良い、と言っただけです。アナログ信号ならADCで受けます。
>Maxでは1kΩ程度ですね。
これは〜4.5Vの部分です。5Vに「0.5V足りない」、という部分が1kΩ相当という意味です。
X9Cに関して、簡潔に言えば、出力ピン=VWピンからLEDを繋いだら(電気を使ったら)ダメという事です。
LEDを取った状態で計測しなければ意味がありません。
> MABOさん
電気を流す時間と回転数が比例するとは思えません。例え合わせたとしても、トルクをかけるとまた条件が変わるでしょう。
あくまで、MACHからの信号は目標回転数としてくるのであって、実際の回転数は別物として制御する必要があると思います。
※これはシンクロにチェックを入れない=PWMで目標回転数を伝える設定の場合です。
で、MACHにその機能(目標回転数に合わせてPWM信号が変化する)があるのなら、そっちがどう動くのかに期待しています。
Re: 続7ーPWM
>X9Cに関して、簡潔に言えば、出力ピン=VWピンからLEDを繋いだら(電気を使ったら)ダメという事です。
LEDを取った状態で計測しなければ意味がありません。
抵抗値計測の際を言っているのでしょうか?
無論、LEDやLED付属の抵抗を外しています。
それでも、300〜8500Ωです。
LEDを取った状態で計測しなければ意味がありません。
抵抗値計測の際を言っているのでしょうか?
無論、LEDやLED付属の抵抗を外しています。
それでも、300〜8500Ωです。
Re: 続7ーPWM
いいえ、電圧を測る際の事です。
となると、RH-RL間は8200Ωなのでしょうか?
で、抵抗値が8500Ωは一応、想定内の数値です。
でも300Ωは多すぎますね。
まぁ、ワイパーの抵抗はあまり関係ないでしょうから、一番大事なのは出力される電圧値です。
でも、https://www.instructables.com/id/X9C103P-Basic-Operation/
あたりの結果が完璧なだけに、何故そんな特性なのか疑問です。
まぁ、販売元なので、信用できるデータかは判りませんけど。
となると、RH-RL間は8200Ωなのでしょうか?
で、抵抗値が8500Ωは一応、想定内の数値です。
でも300Ωは多すぎますね。
まぁ、ワイパーの抵抗はあまり関係ないでしょうから、一番大事なのは出力される電圧値です。
でも、https://www.instructables.com/id/X9C103P-Basic-Operation/
あたりの結果が完璧なだけに、何故そんな特性なのか疑問です。
まぁ、販売元なので、信用できるデータかは判りませんけど。
Re: 続7ーPWM
猛牛ロックさんへ
英語ができて羨ましいです。
初期化関数の99回ダウンの数値を100に変更
ついでに、アップも99から、100に変更
抵抗値は、下が210Ωになりました。
データシートには100ワイパーとか書いてあったけど、
0を含んで数えている、含んでいないに迷うと、
どっちなんだろうと、悩みます。
起算値を0にしてとか、表現をして欲しい。
上限の約8.5kΩは、データシートに
End-to-End Resistance, ±20%
と表記されていたので、この関係でしょうか。
一番心配なのは、回りだしてしまうことです。
英語ができて羨ましいです。
初期化関数の99回ダウンの数値を100に変更
ついでに、アップも99から、100に変更
抵抗値は、下が210Ωになりました。
データシートには100ワイパーとか書いてあったけど、
0を含んで数えている、含んでいないに迷うと、
どっちなんだろうと、悩みます。
起算値を0にしてとか、表現をして欲しい。
上限の約8.5kΩは、データシートに
End-to-End Resistance, ±20%
と表記されていたので、この関係でしょうか。
一番心配なのは、回りだしてしまうことです。
Re: 続7ーPWM

その辺りは一緒ですよ。
で、ワイパー抵抗が300→210と約90Ωのダウンですね。
もしかしたらその下に2段階あるのかもしれません。
そして2つ下がったら40Ωになるのかも??
私のプログラムが悪いのかもしれませんね。※場合によってはその回路も含む
例えば、PICは1.8V?から動作します。一方、X9Cは推奨動作条件は5V±10%とかなり狭い範囲です。
で、100ufのコンデンサを付けたらゆっくり電圧は上昇しますから、最初にPICだけ起動して、X9Cが準備が出来る前に
初期化関数が走っている可能性があります。
なので、・・・
初期化関数の前に
__delay_ms(100);
と入れて試してみてください。
で、電圧の方ですけど、Vwの先に何も繋がなければ0〜5Vになると思っています。
(ワイパー抵抗は関係なく、という事です)
上も下も頭打ちなんで、さっぱりわかりません。
> 一番心配なのは、回りだしてしまうことです。
全くその通りですね。
<追記します>
私の読み取った限りでは、ワイパー抵抗とはいわゆる、FETのオン抵抗というやつじゃないかと思っています。
(確信はありませんけど)
つまり、添付図の赤点線の部分の抵抗だと思っています。
そうだとしたら、変形させれば右図のようになるので、ちゃんとRLに繋いだ電圧からRHに繋いだ電圧まで取得出来るだろう、
と考えています。
実際、そうなってくれないと困るんですけどね。
Re: 続7ーPWM
猛牛ロックさんへ
今、網戸を張り終えました〜。簡単。
おっしゃっているのは、下記の通りでしょうか?
試しにやってみましたが、相変わらず210Ω〜8.5kΩです。
記
__delay_ms(100);
//初期化関数
x9c_init();
while (1) {
電圧ですか。
テスター棒の黒をGNDに
VWには何もつけずに、赤テスター棒をVH(テスター棒以外は、何も付けない)を計測
結果、0V
網戸と違って難しいです。
お写真すみません。
抵抗は、0〜99で、100ですね。
今、網戸を張り終えました〜。簡単。
おっしゃっているのは、下記の通りでしょうか?
試しにやってみましたが、相変わらず210Ω〜8.5kΩです。
記
__delay_ms(100);
//初期化関数
x9c_init();
while (1) {
電圧ですか。
テスター棒の黒をGNDに
VWには何もつけずに、赤テスター棒をVH(テスター棒以外は、何も付けない)を計測
結果、0V
網戸と違って難しいです。
お写真すみません。
抵抗は、0〜99で、100ですね。
Re: 続7ーPWM
プログラムはその通りです。
相変わらずですか。じゃあ、ワイパーは一番下まで来ているのかなぁ?
まぁ、上記のように、ワイパー抵抗はあまり関係ないと思っています。
位置が下がっている事が重要です。
重要なのは出力の電圧が0〜5Vまで動いてくれる事です。
VLにはGND、VHには5Vを繋いでください。
ウチは障子がボロボロになってるんだよなぁ(*_*;
相変わらずですか。じゃあ、ワイパーは一番下まで来ているのかなぁ?
まぁ、上記のように、ワイパー抵抗はあまり関係ないと思っています。
位置が下がっている事が重要です。
重要なのは出力の電圧が0〜5Vまで動いてくれる事です。
VLにはGND、VHには5Vを繋いでください。
ウチは障子がボロボロになってるんだよなぁ(*_*;
Re: 続7ーPWM
maboさんへ
PWM用FETいいやつを思い出しました。
自分のクーラントポンプもPWMでやっています。
パワーMOS FET IRLI520NPBF
もともとは、秋月電子のPWMキットに使われていました。確かそうです。
PWM用FETいいやつを思い出しました。
自分のクーラントポンプもPWMでやっています。
パワーMOS FET IRLI520NPBF
もともとは、秋月電子のPWMキットに使われていました。確かそうです。
Re: 続7ーPWM
TRさん,猛牛ロックさん,こんばんは。
今日は,DCモーターをPWMコントローラーのボリュームの
方に切り替えて,あれこれやってみました。
MACHからのPWMのDUTYをオシロで確認しながら,
ボリュームで,MACHへの入力RPMを変化させたとき,
DUTY比の変化があるのかないのか,確認しました。
同時に,P I Dのそれぞれの数値も大きく変えてみました。
結果,目視ですので,DUTYに多少の変化は見られるような気がするものの,大きな変化は少ない感じでした。
ただ,Pの値を大きくすると,DCモーターの回転が1秒ぐらい回転して,すぐ止まってしまいますので,
影響はあるようです。
調整の幅があるとすれば,そんなに大きくない感じです。
TRさん,FETの紹介ありがとうございます。
このへんは,本当に苦手で,困ります。
今実験に使ってるDCモーターが 24V 150W 6A
のもので,突入電流等を考えると,ちょっと,ぎりぎりかな,
なんて,思ってます。
それと,今使ってるPWMコントローラーのボリューム調べましたが,
やはり,5Vのコントロールで,100Kですので,
TRさんの注文したX9Cで使えるかもです。
ML4で実験する前に,PWMのコントローラー等で,
できるのなら,実験した方がいいかもですね。
コントローラーは,2800円ぐらいなので。
https://www.amazon.co.jp/ZhongKiYi-12V-110V-DC%E3%83%A2%E3%83%BC%E3%82%BF%E3%83%BC%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E3%83%BC%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BCPWM-MACH3%E3%82%B9%E3%83%94%E3%83%B3%E3%83%89%E3%83%AB%E3%82%AC%E3%83%90%E3%83%8E/dp/B07P6VPK5X/ref=sr_1_2?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%EF%BC%B0%EF%BC%B7%EF%BC%AD+%EF%BC%AD%EF%BC%A1%EF%BC%A3%EF%BC%A8%EF%BC%93&qid=1559915654&s=gateway&sr=8-2
猛牛ロックさん,ありがとうございます。
>電気を流す時間と回転数が比例するとは思えません。例え合わせたとしても、トルクをかけるとまた条件が変わるでしょう。
だと思います。他の物はわかりませんが,今使ってるPWMコントローラーの
FETの特性が偏ってるようなきがしてるのです。
仮に,MACHに調整の機能があったとしても,
その,調整範囲を超えてるような気がするのです。
実際はわかりませんが。
猛牛ロックさんは,否定的なご意見でした
諸兄のHPにある,回転数を見るとMACHへの入力の
5%の範囲に収まってるとの記事があるので,
FETの違いなのかなと思った次第です。
今日は,DCモーターをPWMコントローラーのボリュームの
方に切り替えて,あれこれやってみました。
MACHからのPWMのDUTYをオシロで確認しながら,
ボリュームで,MACHへの入力RPMを変化させたとき,
DUTY比の変化があるのかないのか,確認しました。
同時に,P I Dのそれぞれの数値も大きく変えてみました。
結果,目視ですので,DUTYに多少の変化は見られるような気がするものの,大きな変化は少ない感じでした。
ただ,Pの値を大きくすると,DCモーターの回転が1秒ぐらい回転して,すぐ止まってしまいますので,
影響はあるようです。
調整の幅があるとすれば,そんなに大きくない感じです。
TRさん,FETの紹介ありがとうございます。
このへんは,本当に苦手で,困ります。
今実験に使ってるDCモーターが 24V 150W 6A
のもので,突入電流等を考えると,ちょっと,ぎりぎりかな,
なんて,思ってます。
それと,今使ってるPWMコントローラーのボリューム調べましたが,
やはり,5Vのコントロールで,100Kですので,
TRさんの注文したX9Cで使えるかもです。
ML4で実験する前に,PWMのコントローラー等で,
できるのなら,実験した方がいいかもですね。
コントローラーは,2800円ぐらいなので。
https://www.amazon.co.jp/ZhongKiYi-12V-110V-DC%E3%83%A2%E3%83%BC%E3%82%BF%E3%83%BC%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E3%83%BC%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BCPWM-MACH3%E3%82%B9%E3%83%94%E3%83%B3%E3%83%89%E3%83%AB%E3%82%AC%E3%83%90%E3%83%8E/dp/B07P6VPK5X/ref=sr_1_2?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%EF%BC%B0%EF%BC%B7%EF%BC%AD+%EF%BC%AD%EF%BC%A1%EF%BC%A3%EF%BC%A8%EF%BC%93&qid=1559915654&s=gateway&sr=8-2
猛牛ロックさん,ありがとうございます。
>電気を流す時間と回転数が比例するとは思えません。例え合わせたとしても、トルクをかけるとまた条件が変わるでしょう。
だと思います。他の物はわかりませんが,今使ってるPWMコントローラーの
FETの特性が偏ってるようなきがしてるのです。
仮に,MACHに調整の機能があったとしても,
その,調整範囲を超えてるような気がするのです。
実際はわかりませんが。
猛牛ロックさんは,否定的なご意見でした
諸兄のHPにある,回転数を見るとMACHへの入力の
5%の範囲に収まってるとの記事があるので,
FETの違いなのかなと思った次第です。
Re: 続7ーPWM
maboさんへ
質問
ご紹介くださった、PWMコントローラーですが、秋月電子と同じ機能を持っていますか???
http://akizukidenshi.com/catalog/g/gK-06244/
以前、DCモーターのスピードコントロールに使っていました。
アマゾンの商品説明は分かりずらいのでお聞きしました。
同じ機能だと思いますがいかがでしょうか?
>同時に,P I Dのそれぞれの数値も大きく変えてみました。
PIDは、?今回の波形を見る機器ですか?
質問
ご紹介くださった、PWMコントローラーですが、秋月電子と同じ機能を持っていますか???
http://akizukidenshi.com/catalog/g/gK-06244/
以前、DCモーターのスピードコントロールに使っていました。
アマゾンの商品説明は分かりずらいのでお聞きしました。
同じ機能だと思いますがいかがでしょうか?
>同時に,P I Dのそれぞれの数値も大きく変えてみました。
PIDは、?今回の波形を見る機器ですか?
Re: 続7ーPWM
Re: 続7ーPWM
> MABOさん
DCモータの特性から言えば、確かに電圧と測度は比例関係にありますね。
ただ、マブチモータとかはそうかもしれませんけど、工業用の可変速モータや
スピンドル用のモータはちょっと特性が違うと思います。
トルクをかけてもマブチモータのように速度は落ちませんし、(超)低速でも回りません。
回り始めた瞬間にはある程度の速度になります。
まぁ、FETを含めたドライバの特性という事になるんでしょうか。
私自身はモータとドライバと分けてテストする経験が無いので変えればより、比例に近くなるかもしれません。
それと、No.1595の特性ですけど、かなり良いと思います。でもこの特性図から、比例云々はわかりません。
この図で見るべきところはどの位でスイッチングされるか、そして、何アンペアまで流せるか、と言った事です。
「5VのPWMなら半分の2.5Vでスイッチングされているのが良い」、という事になります。
温度特性にもブレが無いですし、電流値、まぁそれはFETの種類で大きく変わりますけど、自分の予定よりも充分大きければ
良いのではないでしょうか。
ただ、問題の「比例関係」の部分では関係のない特性図です。
要はスイッチング速度が速い、ターンオン時間とターンオフ時間が同じ(でかつ短い)という部分だと思います。
FETのゲートはコンデンサと同じですから容量が少ない物が良いと思います。
で、あとやはり気にするのはオン抵抗です。やはり低発熱の物が良いですよね。
といっても、アナログ回路は聞きかじり程度ですから。
あと、MACHの方ですけど、[CLOSED LOOP]にチェックは入れましたよね?(確認まで)
> TRさん
秋月のやつは「ボリュームでPWM設定→モータ制御」という手動スピードコントローラです。
アマゾンのやつは、万能タイプです。
電源もAC100Vも入れれますし、コントロールも手動、MACHからのパルス入力の切り替えもできます。
駆動能力も数倍〜1桁程度違うと思います。
(FETは基板の真裏=放熱器の所にあるのでしょう。確認できません)
DCモータの特性から言えば、確かに電圧と測度は比例関係にありますね。
ただ、マブチモータとかはそうかもしれませんけど、工業用の可変速モータや
スピンドル用のモータはちょっと特性が違うと思います。
トルクをかけてもマブチモータのように速度は落ちませんし、(超)低速でも回りません。
回り始めた瞬間にはある程度の速度になります。
まぁ、FETを含めたドライバの特性という事になるんでしょうか。
私自身はモータとドライバと分けてテストする経験が無いので変えればより、比例に近くなるかもしれません。
それと、No.1595の特性ですけど、かなり良いと思います。でもこの特性図から、比例云々はわかりません。
この図で見るべきところはどの位でスイッチングされるか、そして、何アンペアまで流せるか、と言った事です。
「5VのPWMなら半分の2.5Vでスイッチングされているのが良い」、という事になります。
温度特性にもブレが無いですし、電流値、まぁそれはFETの種類で大きく変わりますけど、自分の予定よりも充分大きければ
良いのではないでしょうか。
ただ、問題の「比例関係」の部分では関係のない特性図です。
要はスイッチング速度が速い、ターンオン時間とターンオフ時間が同じ(でかつ短い)という部分だと思います。
FETのゲートはコンデンサと同じですから容量が少ない物が良いと思います。
で、あとやはり気にするのはオン抵抗です。やはり低発熱の物が良いですよね。
といっても、アナログ回路は聞きかじり程度ですから。
あと、MACHの方ですけど、[CLOSED LOOP]にチェックは入れましたよね?(確認まで)
> TRさん
秋月のやつは「ボリュームでPWM設定→モータ制御」という手動スピードコントローラです。
アマゾンのやつは、万能タイプです。
電源もAC100Vも入れれますし、コントロールも手動、MACHからのパルス入力の切り替えもできます。
駆動能力も数倍〜1桁程度違うと思います。
(FETは基板の真裏=放熱器の所にあるのでしょう。確認できません)
Re: 続7ーPWM
maboさん、猛牛ロックさんへ
>MACHからのパルス入力の切り替えもできます。
いずれにしても、DC電圧をPWM化できるわけですよね。
このコントローラーの目的は、DC電圧をPWM化することですよね。
そうなると、
SS〜SEC基板(PWM化)〜ローパスフィルター(アナログ化)〜アマゾンPWMコントローラー(PWM化)となるわけですね。
ここから、自分の場合
〜x9c(デジタル処理で平準化される電気エネルギー)〜ML4
上記の流れをmaboさんは、テストの上お勧めなんだろうか?
よくわからないのですが、、
自分の目的は、ML4についている可変抵抗をx9cに換装して、うまくいったらスピンドルモーターを制御できるデス。
この場合、
〜ローパスフィルター(アナログ化)〜アマゾンPWMコントローラー(PWM化)
この部分は不要に思いますが、如何でしょうか?
ここ数回のやり取りでは、そう言われている感じがしますけど。
無論、いきなりではなく、
既存の制御システムを使て、LEDの点灯を確認してから、ML4とx9cを繋ぎます。
テスト方法
SS〜SEC基板(PWM化)〜x9c(デジタル処理で平準化される電気エネルギー)〜LED
しかし、
猛牛ロックさんのプログラムを学習していますが、なぜ、x9cが、約8.5kΩまでしか上がらないんだろうか?
分かりません。
>MACHからのパルス入力の切り替えもできます。
いずれにしても、DC電圧をPWM化できるわけですよね。
このコントローラーの目的は、DC電圧をPWM化することですよね。
そうなると、
SS〜SEC基板(PWM化)〜ローパスフィルター(アナログ化)〜アマゾンPWMコントローラー(PWM化)となるわけですね。
ここから、自分の場合
〜x9c(デジタル処理で平準化される電気エネルギー)〜ML4
上記の流れをmaboさんは、テストの上お勧めなんだろうか?
よくわからないのですが、、
自分の目的は、ML4についている可変抵抗をx9cに換装して、うまくいったらスピンドルモーターを制御できるデス。
この場合、
〜ローパスフィルター(アナログ化)〜アマゾンPWMコントローラー(PWM化)
この部分は不要に思いますが、如何でしょうか?
ここ数回のやり取りでは、そう言われている感じがしますけど。
無論、いきなりではなく、
既存の制御システムを使て、LEDの点灯を確認してから、ML4とx9cを繋ぎます。
テスト方法
SS〜SEC基板(PWM化)〜x9c(デジタル処理で平準化される電気エネルギー)〜LED
しかし、
猛牛ロックさんのプログラムを学習していますが、なぜ、x9cが、約8.5kΩまでしか上がらないんだろうか?
分かりません。
Re: 続7ーPWM
猛牛ロックさんへ
プログラムについて教えてください。
1行目で、初期化関数を呼び出しているので、
1行目で、x9cの値を0としていますよね?
7行目
for文でtargetに、adc配列の値を0,1,2,3の計4回の合計値を代入させていますよね、
8行目
7行目により、4回分雪だるまにしたtargetを、ここで、40.93で割っているのですよね。
9行目は、またまた、難しい、
9行目は、x9c_up関数を呼び出し、
且つ、
初期値0で始まる,//外部変数 char x9c_valの値を
1づつtargetの直近下位の値まで引き上げているのでしょうか?
//初期化関数
01 x9c_init();
02 while (1) {
03 static unsigned int adc[4] = {0};
04 static char num = 0;
05 unsigned int target = 0;
06 adc[(++num)&3] = adconv();
07 for (char i = 0; i < 4; i++)target += adc[i];
08 target /=40.93;
09 if (target > x9c_val)x9c_up();
10 else if (target < x9c_val)x9c_dowm();
11 __delay_ms(1);
12 }
長くなってすみません。
宜しくお願いします。
プログラムについて教えてください。
1行目で、初期化関数を呼び出しているので、
1行目で、x9cの値を0としていますよね?
7行目
for文でtargetに、adc配列の値を0,1,2,3の計4回の合計値を代入させていますよね、
8行目
7行目により、4回分雪だるまにしたtargetを、ここで、40.93で割っているのですよね。
9行目は、またまた、難しい、
9行目は、x9c_up関数を呼び出し、
且つ、
初期値0で始まる,//外部変数 char x9c_valの値を
1づつtargetの直近下位の値まで引き上げているのでしょうか?
//初期化関数
01 x9c_init();
02 while (1) {
03 static unsigned int adc[4] = {0};
04 static char num = 0;
05 unsigned int target = 0;
06 adc[(++num)&3] = adconv();
07 for (char i = 0; i < 4; i++)target += adc[i];
08 target /=40.93;
09 if (target > x9c_val)x9c_up();
10 else if (target < x9c_val)x9c_dowm();
11 __delay_ms(1);
12 }
長くなってすみません。
宜しくお願いします。
Re: 続7ーPWM
TRさんの場合=可変抵抗方式なら、関係ないと思います。
> 既存の制御システムを使て、LEDの点灯を確認
いやいや、そんなことをする必要ありません。
例えばその可変抵抗の元になっている3本の線(仮にL5、Lg、Loutとすると)、
@10kΩ程度の抵抗を、LgとLoutを繋いだ状態で動くか?
A10kΩの抵抗を、L5とLoutに繋いだ状態で動くか?
と言った事です。@で動かないで、AでMAXで回れば大丈夫です。
Aで、低速回転や動かないのなら駄目、という事になるかも。
LEDはPICプログラムの確認にしかなりません。
> x9cが、約8.5kΩまでしか上がらないんだろうか?
RH-RL間の抵抗はどのぐらいでしょうか?
実際にはその抵抗値は問題ではありません。問題はワイパー位置が0から99まで動いているか、です。
ML4は抵抗値を計測している訳では無いので、とにかく、電圧の方を計測してください。
if (target > x9c_val)x9c_up();
「目標値」が「現在のワイパー位置」よりも大きければ、ワイパー位置を1つあげる。
という意味です。数段階ずれていたら、whileのループを数回回って、目標値をワイパー位置を同じにします。
> 10 else if (target < x9c_val)x9c_dowm();
最期は、x9c_down();です。
> 既存の制御システムを使て、LEDの点灯を確認
いやいや、そんなことをする必要ありません。
例えばその可変抵抗の元になっている3本の線(仮にL5、Lg、Loutとすると)、
@10kΩ程度の抵抗を、LgとLoutを繋いだ状態で動くか?
A10kΩの抵抗を、L5とLoutに繋いだ状態で動くか?
と言った事です。@で動かないで、AでMAXで回れば大丈夫です。
Aで、低速回転や動かないのなら駄目、という事になるかも。
LEDはPICプログラムの確認にしかなりません。
> x9cが、約8.5kΩまでしか上がらないんだろうか?
RH-RL間の抵抗はどのぐらいでしょうか?
実際にはその抵抗値は問題ではありません。問題はワイパー位置が0から99まで動いているか、です。
ML4は抵抗値を計測している訳では無いので、とにかく、電圧の方を計測してください。
if (target > x9c_val)x9c_up();
「目標値」が「現在のワイパー位置」よりも大きければ、ワイパー位置を1つあげる。
という意味です。数段階ずれていたら、whileのループを数回回って、目標値をワイパー位置を同じにします。
> 10 else if (target < x9c_val)x9c_dowm();
最期は、x9c_down();です。
Re: 続7ーPWM
計測は、新しいx9c102が来てからにしましょうよ、
実は、ブレットボードからx9c103外してしまいました。
どうしようもなくなったら、再度ブレットボードを組み立てますよ。
9行目は、
C言語不慣れな自分にとっては、見慣れない使い方でした。
どうしてかというと、
関数を呼び出して、かつ、if文が同時にあるからです。
今までは、if文の{}内は、せいぜい、変数でしたから。
x9c_up関数は、wiper upさせる3条件(CS(グランドへ),INK,UD)を実施させる関数ですよね?
//初期化関数
01 x9c_init();
02 while (1) {
03 static unsigned int adc[4] = {0};
04 static char num = 0;
05 unsigned int target = 0;
06 adc[(++num)&3] = adconv();
07 for (char i = 0; i < 4; i++)target += adc[i];
08 target /=40.93;
09 if (target > x9c_val)x9c_up();
10 else if (target < x9c_val)x9c_dowm();
11 __delay_ms(1);
12 }
>例えばその可変抵抗の元になっている3本の線(仮にL5、Lg、Loutとすると)、
@10kΩ程度の抵抗を、LgとLoutを繋いだ状態で動くか?
猛牛ロックさんのの言われている意味が想像つきません。
LEDの代わりに、10kオームをつないだ場合、既存制御システムでマッハが動作するかということでしょうか?
そうであれば、x9cの3端子をL5、Lg,Loutに繋ぐのかな?
実は、ブレットボードからx9c103外してしまいました。
どうしようもなくなったら、再度ブレットボードを組み立てますよ。
9行目は、
C言語不慣れな自分にとっては、見慣れない使い方でした。
どうしてかというと、
関数を呼び出して、かつ、if文が同時にあるからです。
今までは、if文の{}内は、せいぜい、変数でしたから。
x9c_up関数は、wiper upさせる3条件(CS(グランドへ),INK,UD)を実施させる関数ですよね?
//初期化関数
01 x9c_init();
02 while (1) {
03 static unsigned int adc[4] = {0};
04 static char num = 0;
05 unsigned int target = 0;
06 adc[(++num)&3] = adconv();
07 for (char i = 0; i < 4; i++)target += adc[i];
08 target /=40.93;
09 if (target > x9c_val)x9c_up();
10 else if (target < x9c_val)x9c_dowm();
11 __delay_ms(1);
12 }
>例えばその可変抵抗の元になっている3本の線(仮にL5、Lg、Loutとすると)、
@10kΩ程度の抵抗を、LgとLoutを繋いだ状態で動くか?
猛牛ロックさんのの言われている意味が想像つきません。
LEDの代わりに、10kオームをつないだ場合、既存制御システムでマッハが動作するかということでしょうか?
そうであれば、x9cの3端子をL5、Lg,Loutに繋ぐのかな?
Re: 続7ーPWM
猛牛ロックさんの
プログラムですが、>です。
=を付けた方が良いのでは?
前 if (target > x9c_val)x9c_up();
変更後 if (target >= x9c_val)x9c_up();
プログラムですが、>です。
=を付けた方が良いのでは?
前 if (target > x9c_val)x9c_up();
変更後 if (target >= x9c_val)x9c_up();
Re: 続7ーPWM

今日は,ちょっと,山仕事で疲れてます。
さて,TRさん,
>同時に,P I Dのそれぞれの数値も大きく変えてみました。
これですけど,
P I Dは,MACHにある設定です。
Config→Ports and Pins→Spindle Setup
概要は,下記にもでてます。
https://ja.wikipedia.org/wiki/PID%E5%88%B6%E5%BE%A1
紹介した◯mazonのPWMコントローラーですが,
アリにもより安い値段でありますね。MACH3 PWM でくぐるとかかります。
このコントローラー紹介したのは,
X9CとML4をいきなりつなぐのは,リスクあるかなと思ったからです。
ML4の回路がどうなってるかわかりませんし,いきなりより,
リスク減るかななんて思った次第で,他意はありません。
多分,動作の確認は,できると思います。
このコントローラーを使えば,二通りの確認ができます。
◯SEC(PWM出力) → ローパスフィルター(直流変換) →X9C → コントローラー(電圧制御)→適当なDCモーター
(コントローラーのボリュームとX9Cを置き換え。)
私は,これ,実機がきたら試してみようと思います。
電圧で制御する方が,DUTY比でコントロールするよに,
比例動作に近い動きになるかも,なんて気もしてきました。
◯SEC7(PWM出力)→ → コントローラー → 適当なDCモーター
(コントローラーにPWM信号を直接入れる。)
のふた通りの確認ができまると思います。
ただ,TRさんには,2番目の確認は,必要ないかもですね。
>〜ローパスフィルター(アナログ化)〜アマゾンPWMコントローラー(PWM化)
>この部分は不要に思いますが、如何でしょうか?
はい,Amazon,アリ,のコントローラは,あくまでも,テストのためで,X9Cと置き換えがうまくいけば,コントローラーは必要ありません。
SEC→→ローパスフィルター →→ PICのAD変換 →→ X9C →→ ML4
でいけるかもしれません。
それから,LEDでの確認は,猛牛ロックさんのおっしゃるように,
あくまでも,PICの動作の確認だと思います。
そのPICのプログラムを使って実機が動作するかどうかは,
その,次の段階のように思います。
猛牛ロックさん,いろいろありがとうございます。
もちろん,Closed loop にはチェックは入れました。
いろいろやってますが,ふと,SSを介さないで,パラレルポートだけだと,どうなのか,
気になり出しました。
パラレルでの確認となると,使ってないデスクトップ,
出さなきゃならないので,ちょっと面倒なのですが(笑)。
今日,別なFET,等部品が届きましたので,
ドライバー作成して,実験してみたいと思います。
Re: 続7ーPWM
TRさん,追記です。
猛牛ロックさんがおっしゃってるのは,
ML4のボリュームの部分にきている3本の線のところに,
抵抗をそれぞれつないで見るということだと思います。
半固定抵抗を固定抵抗に置き換えてみて,
下記のようにすれば,ということだと思います。
>いやいや、そんなことをする必要ありません。
>例えばその可変抵抗の元になっている3本の線(仮にL5、Lg、Loutとすると)、
>@10kΩ程度の抵抗を、LgとLoutを繋いだ状態で動くか?
>A10kΩの抵抗を、L5とLoutに繋いだ状態で動くか?
と言った事です。@で動かないで、AでMAXで回れば大丈夫です。
>Aで、低速回転や動かないのなら駄目、という事になるかも。
実機がきたら,これを,私は,これをPWMのコントローラーで,やってみます。
猛牛ロックさんがおっしゃってるのは,
ML4のボリュームの部分にきている3本の線のところに,
抵抗をそれぞれつないで見るということだと思います。
半固定抵抗を固定抵抗に置き換えてみて,
下記のようにすれば,ということだと思います。
>いやいや、そんなことをする必要ありません。
>例えばその可変抵抗の元になっている3本の線(仮にL5、Lg、Loutとすると)、
>@10kΩ程度の抵抗を、LgとLoutを繋いだ状態で動くか?
>A10kΩの抵抗を、L5とLoutに繋いだ状態で動くか?
と言った事です。@で動かないで、AでMAXで回れば大丈夫です。
>Aで、低速回転や動かないのなら駄目、という事になるかも。
実機がきたら,これを,私は,これをPWMのコントローラーで,やってみます。
Re: 続7ーPWM

@のテストなら右の図のように接続して、(残りの1本は図のように開放)
スピンドルをオンにして下さい。
Aは青-赤間に抵抗です。
他には何もつけません。その外したボリュームがどういった使われ方なのかの確認作業です。
> if (target >= x9c_val)x9c_up();
駄目です。
> if (target > x9c_val)x9c_up();
> 「目標値」が「現在のワイパー位置」よりも大きければ、ワイパー位置を1つあげる。
> という意味です。
同じ値なのにワイパーの位置を上げたら、目標位置を行き過ぎますよね?
目標位置に達していたら、何もしません。
- JoyfulNote v6.02 -
++ Edited by Hamel ++