48時間以内の記事は
で表示されます
で表示されます
疑似抵抗ー1
TRさん,猛牛ロックさん,おはようございます。TRさん,
>>>adc[(++num)&31] = adconv();
>駄目だと分かりました。
>32にしないと駄目!
ですが,32にしてしまうと,0〜31が全部0になると思います。
また,32以上64未満の場合は,,
31 & 32 →→ 0
32 & 32 →→ 32
33 & 32 →→ 30
34 & 32 →→ 30
みたいに全部30になり,思った結果にはならないと思います。
num に 最初に1がが入るの,++num のためかな,思ってました。
num++ だと,思った結果になるような気がしてますが,
この辺,ちょっと,私自身あいまいなところです。
次のようにすれば,混乱しないかなと思います。
while (1){
if(num==32){num=0;}
adc[num] = adconv();
num++;
}
それから,
>サンプリングを一定間隔で、とっていている中、VRが変わると、急遽、UP/DOWNをし、
>それが終わると、また、サンプリングをする という流れでしょ!?
この辺もよく分からないところなのですが,
No1671のプログラムでは,
1回 adc 変換の結果を読む。
↓
読んだ結果を過去の一つと入れ替えて配列に保存する。
↓
今までに保存した合計を出して平均する。
↓
アップdダウンの処理をする
これを繰り返すという考え方の処理です。
TRさんが書いてくださった
while (1) {
static unsigned int adc[64] = {0};
static char num = 0;
unsigned int target = 0;
for (char i = 0; i < 64; i++)adc[i] = adconv();→ 配列がadc[0]〜にしたつもり
for (char i = 0; i < 64; i++)target += adc[i];
target1 = target / 511.5;
if (target1 > AD5220_val) {
AD5220_up();
} else if (target1 < AD5220_val) {
AD5220_down(); //down関数呼び出し
}
__delay_ms(1);
}
の処理では,
64回測定し,それを配列に保存する。
↓
64回の合計を出し平均する。
↓
アップダウンの処理をする。
みたいな流れになると思います。
64回ごとに新しい平均値を使って計算してますので,
もしかして,そのために,なめらかな変化にならないのかな,
という気もしてます。
確かめてないのですが,No1671 のように,
過去のデータに付け加える形で計算した方がなめらかかもしれないと思いました。
後で,比較してみようと思います。
>for文に来た時、継続条件式をすべて実施した後、やっと、for文を抜けることができるのでしょうか????
これは,そうだと思います。たしか,break 文を入れることで
強制的にも抜けることができたように思います。
=====追伸です。====
エクセルで添付の写真のように,
いくつか入力すると設定値を計算
できるもの作りました。
よかったら,使ってみてください。
シートには保護かけてあります。
解除は,1234 が暗証番号です。
PR2が256以上になるとエラーになるように
してあります。
http://mabo52.sakura.ne.jp/files/PWM-calc.xlsx
Re: 疑似抵抗ー1
maboさんこんにちは。
今日は仕事です。
>この辺もよく分からないところなのですが,
no1728にある__delay_ms(1);
これが、サンプリング間隔です。
__delay_ms(1)でサンプリングをとりつつ、upとdownにも対応していますので、
テスターの動きがスムースでわないと思いました。
サンプリング回数を当初4から増やした理由は、電圧を拾いきれない感じで、電圧の幅が狭かったからです。平均なので、そうなると思いました。
後、エクセルは、帰宅後に
見させて頂きます。
今日は仕事です。
>この辺もよく分からないところなのですが,
no1728にある__delay_ms(1);
これが、サンプリング間隔です。
__delay_ms(1)でサンプリングをとりつつ、upとdownにも対応していますので、
テスターの動きがスムースでわないと思いました。
サンプリング回数を当初4から増やした理由は、電圧を拾いきれない感じで、電圧の幅が狭かったからです。平均なので、そうなると思いました。
後、エクセルは、帰宅後に
見させて頂きます。
Re: 疑似抵抗ー1
maboさんこんにちは。
サンプリングはとらないと駄目という話でした。
理由は
PWM基本周波数により、信号が送られて来るからだそうです。
no1728にある__delay_ms(1);
これが、サンプリング間隔です。
__delay_ms(1)でサンプリングを
今は、マッハのPWM基本周波数を250ヘルツから実験するつもりなので250usにしています。
無論、実験なのでスタートはマッハの基本周波数を100ヘルツから様子を見ます。
サンプリングはとらないと駄目という話でした。
理由は
PWM基本周波数により、信号が送られて来るからだそうです。
no1728にある__delay_ms(1);
これが、サンプリング間隔です。
__delay_ms(1)でサンプリングを
今は、マッハのPWM基本周波数を250ヘルツから実験するつもりなので250usにしています。
無論、実験なのでスタートはマッハの基本周波数を100ヘルツから様子を見ます。
Re: 疑似抵抗ー1
maboさんこんにちは。
>読んだ結果を過去の一つと入れ替えて配列に保存する。
no1671は
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関数呼び出し
}
}
}
ですよ。
この場合、whileの中で2集目は、配列やAD値は、全て初期化されますよ。
でmaboの下記プログラムはエラーを起こしました。
すみませんが、話の筋は素晴らしいので、成功したら、全て教えて下さい。
記
while (1){
if(num==32){num=0;}
adc[num] = adconv();
num++;
}
>読んだ結果を過去の一つと入れ替えて配列に保存する。
no1671は
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関数呼び出し
}
}
}
ですよ。
この場合、whileの中で2集目は、配列やAD値は、全て初期化されますよ。
でmaboの下記プログラムはエラーを起こしました。
すみませんが、話の筋は素晴らしいので、成功したら、全て教えて下さい。
記
while (1){
if(num==32){num=0;}
adc[num] = adconv();
num++;
}
Re: 疑似抵抗ー1
TRさんへ
> PIC初心者です。
>
> プログラムでよく、__delay_ms(500);このように書きますが、
> 実際とはずれている感じがします。
> 実感と同じ時間にするには、どういった計算をするのでしょうか?
> お願いします。
某サイトでこの質問を見て、私は下記の回答をしました。
> PICが何クロックで動作しているのかを
> #define _XTAL_FREQ 32000000
> のように設定して、コンパイラはその周波数から、delayの相当する時間分、何もしない命令を算出します。
>
> ※実際に動く速度はCONFIG等で設定した速度です。その速度と_XTAL_FREQの値が違っているとおかしくなります。大抵の場合、○倍(1/○倍)時間がおかしくなります。
>
> もう一つは、delay命令を実行中に割り込みが入ると、割り込みの時間分、遅くなることになります。
> また、内蔵オシレータは性能が悪いので、時間を算出するような用途だと結構ずれていくと思います。
> まぁ、このあたりは、大抵、ちょっとの時間のずれですから、分単位でみないとわからないでしょう。
そしてその後、ここを訪問して、下記の書き込みを見て、質問者がTRさんだったのをすぐに気づきました。
> プログラムでよく、__delay_ms(500);このように書きますが、
> 実際とはずれている感じがします。
> 実感と同じ時間にするには、どういった計算をするのでしょうか?
> お願いします。
当然、ここでの事でしょうから、上の方からTRさんの書き込み(プログラムをチェックしていきました)
※まず、実周波数と#define _XTAL_FREQ XXXXXがおかしいのだろうと思ったわけです。
で、データシートをみて、どの部分を弄れば周波数が決まるのかをチェックして、プログラムと1つずつ突き合わせました。
そして、おかしい部分を発見したので、下記の回答を追加しました。
> OSCCON = 0b0111001; //クロック周波数を16MHzに設定
>
> これがおかしいです
普通、これを見れば、自分の記載している部分をチェックするでしょう?
こんなに明確に場所を示しているんですよ?
それに対して、最後のコメントに
> もう少し初心者にも丁寧な説明をお願いします。
> 丁寧な説明によりストレスが少なくなります。
と返信して、その質問は終わりました。
意味が判らなければ、更に聞けばいい事です。
今まで返信していた大抵の人は間違えた箇所を教えてあげれば自分で気づいて直していました。
ちょっとTRさん、甘え過ぎですよ。
いつまでも初心者とか言っていますけど、PICで言えば、TRさんが始めたので私も始めたように記憶しています。
(それ自体は記憶が定かではありませんけど、初めてPICを秋月で注文したのが2015.11.3です。)
会社でもたまにマイコンを使っていますけど、全てAVRで、PICはドットマトリクスで正月の挨拶のやつをやって以来、多分、使っていません。
話がそれましたけど、プログラムは自分で責任をもって改変すべきです。
TRさんがアップしたプログラムを私がチェックする責任があると考えているのでしょうか?
また、丁寧に教える義務があると考えているのでしょうか?
一体何様のつもりなのでしょう??
> maboさん、いつも丁寧な説明に感謝します。
> maboさんとのコミュニケーションにはストレスがありません!!!!
> 気が合いますね!!!
これをみて、下劣な人だと、と感じました。
まるで私が丁寧な説明をしていない、という書きぶりですよね。
元々、私がこの類の心配が無い、Arduinoを薦めていたのを忘れているのでしょうか?
CONFIGやレジスタの使い方も決して初めてではありません。
データシートをみるのはPICでは必須です。
これまで幾度となく説明しましたし、重要性も説きました。
勿論、調べて値を教えるのは簡単な事です。けれども、TRさん自身がデータシートを見て設定する事が重要なんです。
※さもなければ、信頼できるものを入手して、決して変えない事、という趣旨を話しました。
それを自分で出来ないのならもうやめた方が良いです。
> 記
> OSCCONについて
> 当 初:OSCCON = 0b0111001; //クロック周波数を16MHzに設定
>
> 変更後:OSCCON = 0b01110010; //クロック周波数を16MHzに設定
で、全く直っていませんね。
TRさんは、あなたが私のプログラムを何度改悪して、私のストレスになったかお判りでしょうか?
その度に悪い箇所を指摘するのに、何もストレスが無いと思っているのでしょうか?
指摘しても直してもらえず、また指摘するのもストレスなんですよ。
プログラムは基本的に、他人に直してもらうものでは無いのです。自分で作り上げるものだと思います。
PICが初めてなら私もその値を教えます。
私がマイコン(AVR)を初めてから約6年弱です。PICに手を出してからは3年半。
でもその3年半はTRさんとも重なっていますよね?
いつまで初心者とか、甘ったれているつもりなのでしょうか?
私はその6年弱の間に、マイコンの事を他人に聞いた事は無い???と思います。(記憶の上では)
勿論、判らない事だらけでしたから、データシートやWEB上の役に立ちそうなものを調べまくりました。
3年半は、専門学校でも卒業するような年月です。一体何年で初心者を卒業するつもりですか?
そして、初心者を卒業する気はあるのでしょうか?
※私は「初心者」と言えるのは半年程度だと思っています。「初心者」と「初級」は違います。
ここでPICを始めた当初、AVRの方は2年半程度でしたけど、「初級の終わりあたり」だと自分で認識していました。
またまた、話が脱線しました。
私が作ったプログラムを改悪されるのも、それが一因でなにかおかしな事になっていくのも私にとってストレスです。
なので、
今後一切、私が作ったプログラムは改変=使わないで下さい。
> PIC初心者です。
>
> プログラムでよく、__delay_ms(500);このように書きますが、
> 実際とはずれている感じがします。
> 実感と同じ時間にするには、どういった計算をするのでしょうか?
> お願いします。
某サイトでこの質問を見て、私は下記の回答をしました。
> PICが何クロックで動作しているのかを
> #define _XTAL_FREQ 32000000
> のように設定して、コンパイラはその周波数から、delayの相当する時間分、何もしない命令を算出します。
>
> ※実際に動く速度はCONFIG等で設定した速度です。その速度と_XTAL_FREQの値が違っているとおかしくなります。大抵の場合、○倍(1/○倍)時間がおかしくなります。
>
> もう一つは、delay命令を実行中に割り込みが入ると、割り込みの時間分、遅くなることになります。
> また、内蔵オシレータは性能が悪いので、時間を算出するような用途だと結構ずれていくと思います。
> まぁ、このあたりは、大抵、ちょっとの時間のずれですから、分単位でみないとわからないでしょう。
そしてその後、ここを訪問して、下記の書き込みを見て、質問者がTRさんだったのをすぐに気づきました。
> プログラムでよく、__delay_ms(500);このように書きますが、
> 実際とはずれている感じがします。
> 実感と同じ時間にするには、どういった計算をするのでしょうか?
> お願いします。
当然、ここでの事でしょうから、上の方からTRさんの書き込み(プログラムをチェックしていきました)
※まず、実周波数と#define _XTAL_FREQ XXXXXがおかしいのだろうと思ったわけです。
で、データシートをみて、どの部分を弄れば周波数が決まるのかをチェックして、プログラムと1つずつ突き合わせました。
そして、おかしい部分を発見したので、下記の回答を追加しました。
> OSCCON = 0b0111001; //クロック周波数を16MHzに設定
>
> これがおかしいです
普通、これを見れば、自分の記載している部分をチェックするでしょう?
こんなに明確に場所を示しているんですよ?
それに対して、最後のコメントに
> もう少し初心者にも丁寧な説明をお願いします。
> 丁寧な説明によりストレスが少なくなります。
と返信して、その質問は終わりました。
意味が判らなければ、更に聞けばいい事です。
今まで返信していた大抵の人は間違えた箇所を教えてあげれば自分で気づいて直していました。
ちょっとTRさん、甘え過ぎですよ。
いつまでも初心者とか言っていますけど、PICで言えば、TRさんが始めたので私も始めたように記憶しています。
(それ自体は記憶が定かではありませんけど、初めてPICを秋月で注文したのが2015.11.3です。)
会社でもたまにマイコンを使っていますけど、全てAVRで、PICはドットマトリクスで正月の挨拶のやつをやって以来、多分、使っていません。
話がそれましたけど、プログラムは自分で責任をもって改変すべきです。
TRさんがアップしたプログラムを私がチェックする責任があると考えているのでしょうか?
また、丁寧に教える義務があると考えているのでしょうか?
一体何様のつもりなのでしょう??
> maboさん、いつも丁寧な説明に感謝します。
> maboさんとのコミュニケーションにはストレスがありません!!!!
> 気が合いますね!!!
これをみて、下劣な人だと、と感じました。
まるで私が丁寧な説明をしていない、という書きぶりですよね。
元々、私がこの類の心配が無い、Arduinoを薦めていたのを忘れているのでしょうか?
CONFIGやレジスタの使い方も決して初めてではありません。
データシートをみるのはPICでは必須です。
これまで幾度となく説明しましたし、重要性も説きました。
勿論、調べて値を教えるのは簡単な事です。けれども、TRさん自身がデータシートを見て設定する事が重要なんです。
※さもなければ、信頼できるものを入手して、決して変えない事、という趣旨を話しました。
それを自分で出来ないのならもうやめた方が良いです。
> 記
> OSCCONについて
> 当 初:OSCCON = 0b0111001; //クロック周波数を16MHzに設定
>
> 変更後:OSCCON = 0b01110010; //クロック周波数を16MHzに設定
で、全く直っていませんね。
TRさんは、あなたが私のプログラムを何度改悪して、私のストレスになったかお判りでしょうか?
その度に悪い箇所を指摘するのに、何もストレスが無いと思っているのでしょうか?
指摘しても直してもらえず、また指摘するのもストレスなんですよ。
プログラムは基本的に、他人に直してもらうものでは無いのです。自分で作り上げるものだと思います。
PICが初めてなら私もその値を教えます。
私がマイコン(AVR)を初めてから約6年弱です。PICに手を出してからは3年半。
でもその3年半はTRさんとも重なっていますよね?
いつまで初心者とか、甘ったれているつもりなのでしょうか?
私はその6年弱の間に、マイコンの事を他人に聞いた事は無い???と思います。(記憶の上では)
勿論、判らない事だらけでしたから、データシートやWEB上の役に立ちそうなものを調べまくりました。
3年半は、専門学校でも卒業するような年月です。一体何年で初心者を卒業するつもりですか?
そして、初心者を卒業する気はあるのでしょうか?
※私は「初心者」と言えるのは半年程度だと思っています。「初心者」と「初級」は違います。
ここでPICを始めた当初、AVRの方は2年半程度でしたけど、「初級の終わりあたり」だと自分で認識していました。
またまた、話が脱線しました。
私が作ったプログラムを改悪されるのも、それが一因でなにかおかしな事になっていくのも私にとってストレスです。
なので、
今後一切、私が作ったプログラムは改変=使わないで下さい。
Re: 疑似抵抗ー1
猛牛ロックさんへ
言い合いをする気はありません。
猛牛ロックさんに色々と教えて頂いて感謝しています。
でも、分からないことは分からないんですよ。
今回ご教示頂いたプログラムは、つい最近までうまく動作しなかったのです。
折角、教えて頂いたプログラムなので、内容を理解し、動作したいと思いました。
決して、改悪するつもりはありません。
上手く動作するプログラムにしたいと思っています。
悪くはとらえないで下さい。
言い合いをする気はありません。
猛牛ロックさんに色々と教えて頂いて感謝しています。
でも、分からないことは分からないんですよ。
今回ご教示頂いたプログラムは、つい最近までうまく動作しなかったのです。
折角、教えて頂いたプログラムなので、内容を理解し、動作したいと思いました。
決して、改悪するつもりはありません。
上手く動作するプログラムにしたいと思っています。
悪くはとらえないで下さい。
Re: 疑似抵抗ー1
maboさんへ
理由はどうであれ、脇で見ていて気分を害されたと思います。
自分は、もうこの場所に来ません。
というのも、誰とも仲良くしたいのですが、
多分、うまくいかないと思うからです。
これまで、色々と教えていただき感謝申し上げます。
本当に残念ですが、失礼します。
理由はどうであれ、脇で見ていて気分を害されたと思います。
自分は、もうこの場所に来ません。
というのも、誰とも仲良くしたいのですが、
多分、うまくいかないと思うからです。
これまで、色々と教えていただき感謝申し上げます。
本当に残念ですが、失礼します。
Re: 疑似抵抗ー1
TRさんへ> 猛牛ロックさんへ
>
> 言い合いをする気はありません。
私は言い争いも厭いませんよ。それでいい方向に向くなら。
で、私が
> OSCCON = 0b0111001; //クロック周波数を16MHzに設定
>
> これがおかしいです
と書いた後、ちゃんとデータシートを見て確認したのでしょうか?
> でも、分からないことは分からないんですよ。
と言い訳をしていますけど、そのレスをみて「OSCCONの値に原因があるだろう」と判らない筈はないですよね?
で、添付図のOSCCONのページをみて、それでも判らなかったのですか?
「1111 =16 MHz HF」
とかいてありますよね?
これを見て、
> 変更後:OSCCON = 0b01110010; //クロック周波数を16MHzに設定
とした理由は説明できますか?
私は、何もしていない「教えて君」だと判断しました。
何も確認せずに、努力もせずに、答えだけを聞いたという判断です。
「でも、分からないことは分からないんですよ。」なんていうのはその為の努力をした人が言う言葉です。
見苦しい言い訳は止めてもらいたいです。
そして、本当に見て(努力して)わからなかったのならはっきりと言ってください。
私はTRさんに完成したプログラムを教えるのが目的ではありません。
TRさんがマイコンが使えるように、プログラムが書けるようになるために協力してきたつもりですよ。
<追記します>
質問主がTRさんと気付いて、私がおかしい箇所はどこは調べていって、おかしい箇所を発見して、それを報告した訳ですけど、
あなたは、私が調べる事も、おかしい箇所を発見する事も、さも当然という態度で、その上、
礼の一つも言わずに、「何故丁寧に説明しないんだ」という類の事を言ったのですよ!
私にはその尊大な態度の理由が判りません。
そこまでする義務は負っていませんから。
でも、まだそれだけなら流していました。
(そういったストレスは私にもこれまでにも幾度もありますよ)
で、今朝の投稿(No.1727)です。
> 素人には、丁寧に説明してくれないと何を言っているのかよく分かりません!!
> maboさん、いつも丁寧な説明に感謝します。
> maboさんとのコミュニケーションにはストレスがありません!!!!
> 気が合いますね!!!
これはどう見ても、私への文句が含まれていますよね。
直接言わない、何とも、いやらしい表現だと思います。
そして、極め付けはその後の
> 記
> OSCCONについて
> 当 初:OSCCON = 0b0111001; //クロック周波数を16MHzに設定
>
> 変更後:OSCCON = 0b01110010; //クロック周波数を16MHzに設定
これだけ文句を言いながら自分では何もしていない!!!
と、まぁ、こんな感じで私は捉えたのですが、それについては何か反論はありますか?
「悪くはとらえないで下さい。」と言っていますけど、其れではどう捉えればいいのでしょう?
「理由はどうであれ、」とは?まるでTRさんの方には原因が無いような言い方ですけど?
Re: 疑似抵抗ー1
MABOさん、こんな事になってしまい、申し訳ありません。私の接し方が悪かったのでしょうか?
元々、バイタリティーがあって、どんどん突き進むイメージがある人でした。
でも今とは違って、勝手にどんどん進んでいくイメージでした。目が離せないというか
でも最近は、なんとなく寄生しているようなイメージを持っていました。
自分の両足で立っていないような…
遅かれ早かれ、こうなったような気がします。
このままでは何も成長しないのは目に見えていましたから。
「私のプログラムを一切つかうな」というのは、「1行ずつちゃんと自分で責任をもって書いていかないと身に付かない」、という考えから来ています。
実の所、そんなに怒っている訳ではありません。まぁ、怒ってはいますけど。
このまま居なくなるのでしょうかね?
原因を作った身ですけど、寂しく感じます。
そんな時に、AD5220が来ました。
今更ですけど、テストしましたから報告します。
初期化のシーケンスは一度、一番上までワイパーを上げて、一番下まで下げます。
具体的には、Arduinoのsetupで、
for (byte i = 0; i < 70; i++) {
digitalWrite(ud, HIGH);
digitalWrite(clk, LOW);
digitalWrite(clk, HIGH);
}
for (byte i = 0; i < 128; i++) {
digitalWrite(ud, LOW);
digitalWrite(clk, LOW);
digitalWrite(clk, HIGH);
}
としたらこの後は完動しました。(10回程度確認)
でワイパーは0〜127です。その間はぼちぼち綺麗(多少のゆがみあり)に動きます。添付図
電圧は0V(B側)〜4.96V(A側)でした。何故か、片側はちゃんと付くのに逆は付きません。
逆に繋ぐと0.04V(A側)〜5.0V(B側)となります。(添付図はこっちの接続です)
つまり、A側は抵抗1つ分、存在しているようです。
→128ポジションで、ワイパー1つで1/128動きます。そして、A側には1ワイパー分残ります。
ワイパー抵抗は24Ω程度。(添付図の0の位置でのA-W間抵抗)
Re: 疑似抵抗ー1
TRさん,猛牛ロックさん,こんばんは。
猛牛ロックさん,詳しい実験結果のありがとうございます。
>つまり、A側は抵抗1つ分、存在しているようです。
これは,どうんなんでしょうかね。
仕様なのか,それとも,ワイパーの移動に使ってる半導体が,
製造時に不具合起こしたのか,ちょっと?でしょうか。
実際に使用するには,安定して動作するための条件等,いろいろ調べる必要ありですね。
トランジスタかフォットカプラーと秋月の安いロータリーエンコーダーとエンコーダーを使って,
自作のデジタルポテンショメーター作ってみようかな,
なんて思ってます。
猛牛ロックさん,詳しい実験結果のありがとうございます。
>つまり、A側は抵抗1つ分、存在しているようです。
これは,どうんなんでしょうかね。
仕様なのか,それとも,ワイパーの移動に使ってる半導体が,
製造時に不具合起こしたのか,ちょっと?でしょうか。
実際に使用するには,安定して動作するための条件等,いろいろ調べる必要ありですね。
トランジスタかフォットカプラーと秋月の安いロータリーエンコーダーとエンコーダーを使って,
自作のデジタルポテンショメーター作ってみようかな,
なんて思ってます。
Re: 疑似抵抗ー1
データシートにはその辺の所は書かれていないようです。ただし、P8右側の説明中、
「VRの公称抵抗(R AB )は、128ポイントの接触点を持ち摺
動端子に接続されています。さらに、B端子の接触点がこれに追加
されます。」
とあります。この説明やその上の図は理解できませんでしたけど、端子A、端子Bには
ちょっとした違いがあるようには読み取れます。
(その上の図38なんて、Ax端子とWx端子が繋がっているので、全く意味が解りません
なので、このデータシート自体、「REV.0」となっているように、信頼性は低いです。)
勿論、私の報告は、私の入手した個体(AD5220BNZ10)1個を調べたものですから、それで、
全て当てはまるかは不明です。
※最初は、初期化で、一番下までワイパーを下げてから、ループ関数で、「1つずつ上まで上げていき、一番上まで行ったら一番下まで下げる、」
の繰り返し、というスケッチで試していました。ここで上がっていたようなスケッチです。(ループ部は一段毎に全てモニタ表示)
で、数回の結果としては、全て、初期化は不十分でした。上に上げていく段階(ループ関数)で、スタート位置はいずれもバラバラで、ゆったりと
フロートしているような感じです。感覚的にはhi-zピンを調べているようなかんじでしょうか
けれども、ある時から正常に動いていました。ある時とは、一度上がって下がるときから同期していました。
で、さっきもう一度試してみたのですけど、必ずしも、前回いったスケッチで初期化がうまくいく、という訳ではありませんでした。
といっても、ループ部の最初の上げ下げで、必ず同期しました。=2回目で同期した、という事です。
同期する瞬間は、ワイパーを下げていく(A→B)ときにその電圧を通りすぎる時に付いていくような感じです。
不思議と、ワイパーを上げる(Aに近づける)時には同期しません。
いずれにしても、ワイパー操作自体はdelayは要りません。
電源と同時投入なら、ピン初期化→1ms程度delay→2往復位ワイパーを↑↓させれば大丈夫だと感じました。
ワイパーAに、1ワイパー分の抵抗が残る、というのは、抵抗値は偶然なのかもしれません。
でも、この個体的には、必ずそうなっています。
Aを5V側にすると、ADC値は
990,997,1006,1014,1014,1014,…
と1014(もしくは1015)でピタっと止まります。下げる方は15,7,0,0,0,…です。(7の部分は7か8です。)
逆にAを0V側にすると、23,15,7,7,7のように、それ以上なりません。B側は1007,1015,1023のように、ぴたっと
最上まで来ます。数値は1ワイパー分の8(7〜9)です。
ワイパーをA側にいっぱいにしてA-W抵抗値を計測すると97.5Ω程度です。
なので、97.5-24.5(ワイパー抵抗)=73Ω
AB間の抵抗値は9.15kΩ程度なので、9150/128=71.5Ωと、ほぼ一致します。
※数値は千円以下のおもちゃテスターなので、正確性には欠けます。
この個体に関しては、やはり前回の添付図のような構成になっていると考えて間違いないと思います。
あと、抵抗値は16ポジションごとに低いものがあります。(添付図右)
(本来、差が8になるはずがそこだけ5になります)
<追記>
テスト中、チョコチョコ変えますけど、下記がテストスケッチです。
おおよそ、これで、おかしい動きを見つけるのが面倒な位、正常に動きます。
※最初はdigitalWriteで、検証していたのですけど、digitalWriteは50クロックほどかかりますから、
bitSet/bitClear(2クロック?)に変えました。
/*
AD5220 TEST PROGRAM
*/
#define clk 2
#define ud 3
#define ad_pin A0
word ad5220_val;
void clock(word num) {
while (num--) {
bitClear(PORTD, clk);
bitSet(PORTD, clk);
}
}
void ad5220_up() {
bitSet(PORTD, ud);
clock(1);
if (ad5220_val < 127)ad5220_val++;
}
void ad5220_down() {
bitClear(PORTD, ud);
clock(1);
if (ad5220_val > 0)ad5220_val--;
}
void setup() {
Serial.begin(115200);
pinMode(ud, OUTPUT);
pinMode(clk, OUTPUT);
bitSet(PORTD, clk);
bitSet(PORTD, ud);
clock(128);
bitClear(PORTD, ud);
clock(128);
ad5220_val = 0;
}
void loop() {
while (ad5220_val != 127) {
ad5220_up();
delay(5);
word adc = analogRead(ad_pin);
Serial.println(adc);
}
Serial.println("");
delay(2000);
while (ad5220_val != 0) {
ad5220_down();
delay(5);
word adc = analogRead(ad_pin);
Serial.println(adc);
}
Serial.println("");
delay(2000);
}
Re: 疑似抵抗ー1
猛牛ロックさん,こんばんは。
AD5220の細かい検証の資料ありがとうございます。
いつもながら,猛牛ロックさんのくださる資料の緻密さにびっくりしてます。
私は,おおざっぱな検証しかしてないので,なんともいえないのですが,
PWMコントローラーのボリュームと,AD5220を入れ替えて,
モーターを回したところ,
抵抗を小さくしていくと,モーターの回転は,順次上がっていくのですが,
ある場所で,上がらないで,むしろ下がるような印象を受けた箇所が何カ所かありました。
>あと、抵抗値は16ポジションごとに低いものがあります。(添付図右)
>(本来、差が8になるはずがそこだけ5になります)
もしかして,これが原因なのかなと思いました。
私の持ってるものは,100kΩのものなので,
もし同じような傾向があるのなら,単純計算の10倍で,30Ω程度でしょうか,低い物が混在してるのでしょうかね,検証の必要はあると思いますが。
この30Ω程度の抵抗が果たして,私か感じた回転数の低下にどの程度関係してるのかは,自信はありませんが・・・・・。
MACHのPIDの検証もやりたいなと思っているのですが,
グレイコードで頭抱えています。
なんとなく理解はできてきたのですが,通常のコードへの変換等,
ビット操作のオンパレードみたいなので,頭いたいです。
AD5220の細かい検証の資料ありがとうございます。
いつもながら,猛牛ロックさんのくださる資料の緻密さにびっくりしてます。
私は,おおざっぱな検証しかしてないので,なんともいえないのですが,
PWMコントローラーのボリュームと,AD5220を入れ替えて,
モーターを回したところ,
抵抗を小さくしていくと,モーターの回転は,順次上がっていくのですが,
ある場所で,上がらないで,むしろ下がるような印象を受けた箇所が何カ所かありました。
>あと、抵抗値は16ポジションごとに低いものがあります。(添付図右)
>(本来、差が8になるはずがそこだけ5になります)
もしかして,これが原因なのかなと思いました。
私の持ってるものは,100kΩのものなので,
もし同じような傾向があるのなら,単純計算の10倍で,30Ω程度でしょうか,低い物が混在してるのでしょうかね,検証の必要はあると思いますが。
この30Ω程度の抵抗が果たして,私か感じた回転数の低下にどの程度関係してるのかは,自信はありませんが・・・・・。
MACHのPIDの検証もやりたいなと思っているのですが,
グレイコードで頭抱えています。
なんとなく理解はできてきたのですが,通常のコードへの変換等,
ビット操作のオンパレードみたいなので,頭いたいです。
Re: 疑似抵抗ー1
MABOさんのは100kΩだったんですか。でも、100kΩの方がデータシート的には誤差(の割合)が少なく書いてあります。
添付図では、どちらが50kΩか100kΩかは判りませんけど、10kΩよりはバラつきが少ないのが見て取れます。
私の通常8毎のはずが16ワイパーおきに5になっている、というのは添付図(グラフ)の黄線部分だと思います。
そこだけ-0.3LSB=30%程度、抵抗が低いので、8→5の変化は納得いく数字です。
よく見ると、その半分の所で、+1の9になっています。それはグラフのちょこっと山になっている部分(水色)の
せいだと思います。
まぁ、訳が分からない説明がありながらも、納得できる部分もある感じですね。
MABOさんの言っているのが16パイパー毎の事では無く、抵抗(ワイパー)が0Ωよりの全体的な動きの事でしたら、
多分、電流の流れすぎによる、電圧低下なのではないかと予想します。
Re: 疑似抵抗ー1
猛牛ロックさん,こんばんは。
またまた,詳しい資料ありがとうございます。
マニュアルに載っているんですよね。
グラフ見ただけで,毛嫌いして,解釈するのあきらめてました。
>多分、電流の流れすぎによる、電圧低下なのではないかと予想します。
こういうこともあるんですね。
この辺も私の理解の及ばないところかな,なんて思います。
AD5220にを使って,モーターを回したときには,
回転数等,詳しくみてないので,感覚で,回転数がさがった,
と判断してるところもあるので,回転数の表示させて,
後日,みてみようと思います。
今,部材をいろいろあたってます。
またまた,詳しい資料ありがとうございます。
マニュアルに載っているんですよね。
グラフ見ただけで,毛嫌いして,解釈するのあきらめてました。
>多分、電流の流れすぎによる、電圧低下なのではないかと予想します。
こういうこともあるんですね。
この辺も私の理解の及ばないところかな,なんて思います。
AD5220にを使って,モーターを回したときには,
回転数等,詳しくみてないので,感覚で,回転数がさがった,
と判断してるところもあるので,回転数の表示させて,
後日,みてみようと思います。
今,部材をいろいろあたってます。
Re: 疑似抵抗ー1
X9C(10kΩ)も一応試したので、載せておきます。こちらの方は0〜5.0Vまで動きました。(正確にはADCで0〜1023という事です)
ワイパー抵抗は45Ω程度、A-B間の抵抗は9.0kΩでした。
「make before break」は並列になるので、抵抗値が下がるのかと思っていたのですけど
図を描いてみたら、過渡期は両抵抗の間になるのですね。
つまり、理論的には安全性が高くて、良いデバイスと言えると思います。
で、ほぼAD5220と同じもので試したのですけど、1usの間隔では駄目でした。
2usにしたら動きました。
バラつきはAD5220と同じ程度ありました。でも、16ワイパー毎というわけでは無く、何となくばらついています。
「make before break」の時間はデータシートでは平均100us、MAXで500usとなっていますけど、
5V側(ワイパー位置99)から1つ下げて観測してみたのですけど、20us後には安定した電圧になっているようです。
理論的にはmakeで並列状態になった時は「ワイパー抵抗45Ω×2の直列」と「抵抗1つ分の90Ω」の並列なので、この部分の合成抵抗は45Ωです。
つまり、添付図下のようになり、電圧値で4.9875V、adc値では1020.4に相当します。
なので、表の2us後の部分で既に並列状態になっていると思います。
(何故かその後、一段階下がってから安定します)
※表中の時間はアバウトです。1,2割は異なっている可能性はあります。
今回はワイパー位置が同じ部分(99→98)しかやりませんでしたから、もしかしたら違う位置だと動作時間(並列時間)が大きく変わるのかもしれません。
でも、データシートの時間100usや500usは、苦情が来ないように、だいぶ大きく見積もっている、という印象です。
また、この程度の時間&変動なら、待ち時間無しにワイパーを動かしても良さそうです。
※不揮発性メモリの方は試していません。CSはLOW(GND接続)固定です。
Re: 疑似抵抗ー1
手作りの件ですけど、参考サイトの構成が良いと思います。低on抵抗のフォトMOSリレーを使う、ってやつです。
FETで構成するのも可能かもしれませんけど、可変抵抗部「以外」の回路も知る必要があると思います。
で、抵抗はX2で付けていって、ワイパー位置の上げ下げでは無く、「不必要な抵抗の短絡」といった感じにすれば、
10個(組み)で1024段階になります。
添付図で、負論理でGPIOに繋いでいますから、そのまま抵抗値として表現出来ます。
抵抗は固定抵抗で賄えない部分は半固定抵抗を使うしかないと思います。
https://www.aliexpress.com/item/32956113030.html
MABOさんの可変抵抗は100kΩと結構大きな値ですから、
参考サイトのTLP3100の方オン抵抗最大50mΩとが高性能ですけど、
TLP241Aあたりでも全然問題無いと思います。(オン抵抗最大150mΩ)
AQV251Gも良さそうだったのですけど、特に薦めるほどでも無かったみたい。
https://www.aliexpress.com/item/32834495736.html
https://www.aliexpress.com/item/33008121998.html
※TLP3100はSMDタイプしか無いようです。
あと、これらはターンオン時間が数msかかります。なので、頻繁にオン/オフしないようにした方が良いです。
つまり、プログラムでまったり動かすようにします。
※オフなら電流が流れないので発熱しない。onでも低on抵抗なので発熱は少ない。でも切り替えのときは多くの発熱をするので、
1msとかで更新すると、殆どの時間が「切り替え状態」になる可能性があります。
Re: 疑似抵抗ー1
猛牛ロックさん,こんばんは。
またまた細かい検証の資料ありがとうございます。
ワイパーの移動で,切り替えが追いつかない時間があるというか,これ,もしかして,意図的なのかもですね。
現在の接続を切断してから,隣の接続をする,というのではなくて,隣を接続してから,現在を切断,こんな手順なのでしょうか。
プログラム組むときは,その辺も考慮しないと,
思った結果にならないのでしょうが,私の場合,厳密な処理する訳ではないので,それほど気にならないと思います。
それから,部材のご紹介もありがとうございます。
私も,フォットリレーにしようかなと思ってましたが,
TLP3100 は,値段が高いんですよね。
それに,SMDだと,老眼の目には厳しいかななんてね。(笑)
とりあえず動けばいいかな,なんて思ってるので,
秋月の
http://akizukidenshi.com/catalog/g/gI-08029/
あたり使おうかなと思ってますが,お恥ずかしい話,
ON抵抗について,高いのか低いのか判別がつかないでいます。
またまた細かい検証の資料ありがとうございます。
ワイパーの移動で,切り替えが追いつかない時間があるというか,これ,もしかして,意図的なのかもですね。
現在の接続を切断してから,隣の接続をする,というのではなくて,隣を接続してから,現在を切断,こんな手順なのでしょうか。
プログラム組むときは,その辺も考慮しないと,
思った結果にならないのでしょうが,私の場合,厳密な処理する訳ではないので,それほど気にならないと思います。
それから,部材のご紹介もありがとうございます。
私も,フォットリレーにしようかなと思ってましたが,
TLP3100 は,値段が高いんですよね。
それに,SMDだと,老眼の目には厳しいかななんてね。(笑)
とりあえず動けばいいかな,なんて思ってるので,
秋月の
http://akizukidenshi.com/catalog/g/gI-08029/
あたり使おうかなと思ってますが,お恥ずかしい話,
ON抵抗について,高いのか低いのか判別がつかないでいます。
Re: 疑似抵抗ー1
1カ所繋ぐだけの方式なら、特別良いものは要らないと思います。
けれども、低抵抗部(特に抵抗0の位置)はそれなりの電流が流せるものが良いです。
TLP291は最大絶対定格で50mAでした。それで充分かどうかは?です。
最大絶対定格で20mAのAD5220で、最高速近くいったのなら大丈夫なのかもしれません。
また、そこだけ並列にしちゃうのも、手かもしれませんね。
フォトカプラ(出力部がフォトトランジスタ)だと、特性として、オン時に一定の電圧がエミッタ-コレクタ間に
残ると思います。(0.2Vとか0.3Vとか。ダイオードに近い感じだと思います)
で、例えば、10個使って、複数接続する方式だと電圧値として2.5V前後は落ちますから、用途的に合いません。
最高速は出ないという結果になりますし、中間部の計算も出来ません。
フォトMOSリレーなら、オン抵抗で表せるように、無視できるほどの低オン抵抗なら多接続(短絡方式)でも上手く行くと思います。
また、フォトカプラが通常、数十〜数百mA出力に対して、フォトMOSリレーは数百mA〜数Aまで流せます。
ただし、スイッチング時間は圧倒的にフォトカプラの方が早いです。単位がusとmsの違いがあります。
私もフォトカプラ(PC817)なら沢山持っていますけど(ALIで100個で200円程度で売っています)数を並べるのも面倒です。
74HC595も1個5円程度でありますから、作れないわけでは無いと思うのですけど、多くのピンに配線しなくてはならない、という部分で作るのが大変でしょうね。
やはり、分解能を出すならフォトMOSリレーに分があると思います。
16以下の分解能で良いなら、フォトカプラで、といった感じでしょうか。
※分解能16でもhttp://akizukidenshi.com/catalog/g/gI-12192/あたりを4つ使って、4ピンで制御する方が楽です。
MABOさんの場合は、抵抗値が高い可変抵抗ですし、それほど高機能(低オン抵抗)のフォトMOSリレーは必要ないと思います。
けれども、低抵抗部(特に抵抗0の位置)はそれなりの電流が流せるものが良いです。
TLP291は最大絶対定格で50mAでした。それで充分かどうかは?です。
最大絶対定格で20mAのAD5220で、最高速近くいったのなら大丈夫なのかもしれません。
また、そこだけ並列にしちゃうのも、手かもしれませんね。
フォトカプラ(出力部がフォトトランジスタ)だと、特性として、オン時に一定の電圧がエミッタ-コレクタ間に
残ると思います。(0.2Vとか0.3Vとか。ダイオードに近い感じだと思います)
で、例えば、10個使って、複数接続する方式だと電圧値として2.5V前後は落ちますから、用途的に合いません。
最高速は出ないという結果になりますし、中間部の計算も出来ません。
フォトMOSリレーなら、オン抵抗で表せるように、無視できるほどの低オン抵抗なら多接続(短絡方式)でも上手く行くと思います。
また、フォトカプラが通常、数十〜数百mA出力に対して、フォトMOSリレーは数百mA〜数Aまで流せます。
ただし、スイッチング時間は圧倒的にフォトカプラの方が早いです。単位がusとmsの違いがあります。
私もフォトカプラ(PC817)なら沢山持っていますけど(ALIで100個で200円程度で売っています)数を並べるのも面倒です。
74HC595も1個5円程度でありますから、作れないわけでは無いと思うのですけど、多くのピンに配線しなくてはならない、という部分で作るのが大変でしょうね。
やはり、分解能を出すならフォトMOSリレーに分があると思います。
16以下の分解能で良いなら、フォトカプラで、といった感じでしょうか。
※分解能16でもhttp://akizukidenshi.com/catalog/g/gI-12192/あたりを4つ使って、4ピンで制御する方が楽です。
MABOさんの場合は、抵抗値が高い可変抵抗ですし、それほど高機能(低オン抵抗)のフォトMOSリレーは必要ないと思います。
Re: 疑似抵抗ー1
猛牛ロックさん,こんばんは。
いろいろアドバイスありがあとうございます。
本日,部材を◯月に注文しました。
送料ただいするべく,奮発してしまいました。
これで,しばらくおとなしくするようです。
エンコーダーは安いのにしようと思いましたが,
チャタリング対策等,手間取りそうなので,
マルツのこう光学式にする予定です。
ネットでくぐったのですが,102タイプの抵抗アレイは,
マルツとデジキーあたりしか取り扱いないんですよね。
マルツはもうちょっと検討してから,注文します。
それと,アナログスイッチなるICもあるのですね。
いろいろあさっていて,目にとまりました。
http://akizukidenshi.com/catalog/g/gI-05673/
アナログでも,デジタルでも高速スイッチングが可能,
とマニュアルには記載あります。
それに,低ON抵抗 50Ω とあります。
状況にもよるのでしょうが,これが高いのか,低いのか,
私にはちょっと判断できません。
いろいろあさっていて,
PIDの制御にも興味が向いてきました。
プログラムもそれほど難しくないようなので,
http://akiracing.com/2017/12/19/arduino_drone_pid/
後日,挑戦してみようかなと思います。
手始めに回転数取得のプログラムあれこれやってます。
いろいろアドバイスありがあとうございます。
本日,部材を◯月に注文しました。
送料ただいするべく,奮発してしまいました。
これで,しばらくおとなしくするようです。
エンコーダーは安いのにしようと思いましたが,
チャタリング対策等,手間取りそうなので,
マルツのこう光学式にする予定です。
ネットでくぐったのですが,102タイプの抵抗アレイは,
マルツとデジキーあたりしか取り扱いないんですよね。
マルツはもうちょっと検討してから,注文します。
それと,アナログスイッチなるICもあるのですね。
いろいろあさっていて,目にとまりました。
http://akizukidenshi.com/catalog/g/gI-05673/
アナログでも,デジタルでも高速スイッチングが可能,
とマニュアルには記載あります。
それに,低ON抵抗 50Ω とあります。
状況にもよるのでしょうが,これが高いのか,低いのか,
私にはちょっと判断できません。
いろいろあさっていて,
PIDの制御にも興味が向いてきました。
プログラムもそれほど難しくないようなので,
http://akiracing.com/2017/12/19/arduino_drone_pid/
後日,挑戦してみようかなと思います。
手始めに回転数取得のプログラムあれこれやってます。
Re: 疑似抵抗ー1
良いですねぇ、光学式。私はおもちゃエンコーダばっかりです。
秋月で売ってるLED付きも使いました。
アナログスイッチICは電気はあまり流せませんよ。
20mA程度まで流せますけど、流せば出力電圧は変わります。
この辺りは、マイコンの出力と同じです。
オン抵抗50Ωは9V駆動時の標準値です。
4.5V駆動だと、70Ω標準で、最大100Ωです。
で、100Ωだとしたら20mA流せば100x0.02=2Vも電圧が下降します。
なので、電圧値が重要な場合は電流を流してはいけません。
> 手始めに回転数取得のプログラムあれこれやってます。
単純なオフタイマー(7セグとリレーとロータリーエンコーダを使ったもの)で、よく使いますけど、
○○時○○分まであるので、ロータリーエンコーダといえども加速させないとなかなか目的値まで達しません。
で、早く回した時は+8/クリック位?までさせると思うのですけど、いい塩梅を見つけるのが面白い所かもしれません。
秋月で売ってるLED付きも使いました。
アナログスイッチICは電気はあまり流せませんよ。
20mA程度まで流せますけど、流せば出力電圧は変わります。
この辺りは、マイコンの出力と同じです。
オン抵抗50Ωは9V駆動時の標準値です。
4.5V駆動だと、70Ω標準で、最大100Ωです。
で、100Ωだとしたら20mA流せば100x0.02=2Vも電圧が下降します。
なので、電圧値が重要な場合は電流を流してはいけません。
> 手始めに回転数取得のプログラムあれこれやってます。
単純なオフタイマー(7セグとリレーとロータリーエンコーダを使ったもの)で、よく使いますけど、
○○時○○分まであるので、ロータリーエンコーダといえども加速させないとなかなか目的値まで達しません。
で、早く回した時は+8/クリック位?までさせると思うのですけど、いい塩梅を見つけるのが面白い所かもしれません。
疑似可変抵抗
maboさんおはようございます。デジタルポテンションに代えて、maboさんの疑似可変抵抗を制御するプログラムを始めようと思います。
宜しくお願いします。
と思いましたが、
Trはシンク駆動ですよね
駆動するもののがないから電流が流れない
最上段のTr
返事は急ぎません。
追記
ワイパと電源端子間の抵抗を計測する場合、TRを通じるようになるのでは。
Re: 疑似可変抵抗
TRさん,猛牛ロックさん,こんばんは。TRさん,ごめんなさい,回路のことよくわからないので,
明確な答えは,?です。
ただ,端がうまくいかない場合は,添付のようにしてもいいかな,
と考えていました。こうすると,ワイパー最端に移動しても,抵抗残りますが。
この方が最悪のこと考えてもいいような気もします。
全部の抵抗やら,電流は,トランジスタを通したものになると思いますので,
減衰はあると思います。
それから,トランジスタの破損等考えると,フォトカプラーをはさんで,絶縁した方がいいかなと思いました。
それから,プログラムですが,
今までのもの改変すれば使えると思います。
1023で平均取ったものを,8段階にする。
up・downのサブ関数を変更する,等で可能だと思います。
ただ,up・down の関数で,デコーダーに信号を送るように
なると思いますが,レジスタ3個に送るので多少手間かかると思います。
データーシートでは,
10進数
LLL → 0
LLH → 1
LHL → 2
LHH → 3
HLL → 4
HLH → 5
HHL → 6
HHH → 7
ですので,
PORTA=5
のようにしてしまえば,一度に送れますが,
(HLH→5 を送る場合)
RA0=5
RA1=5>>1
RA2=5>>2
みたいに,シフトするか,マスクかけてそれぞれ送る
ようでしょうかね。
まあ,8通りですので,全部記述しておいてもいいのでしょうけど,
case 0: RA0=0;//10進数0を送る
RA1=0;
RA2=0;
case 1: RA0=1;//10進数1を送る
RA1=0
RA2=0;
case 2:RA0=0;//10進数2っを送る
RA1=1;
RA2=0;
・・・・・・
・・・・・・
case 7;RA0=1;//10進数7を送る
RA1=1;
RA2=1;
それと,使えそうな抵抗アレイ見てみましたけど,
マルツで102と表記のあるものでしょうかね。
残念ながら,秋月には,使えそうなタイプは,ないようでした。
Re: 疑似可変抵抗
maboさん、おはようございます。自分も、投降した後に、フォトカプラを使った方法を思いつきました。
でも、ワイパーと電源側間の抵抗値のラインを電流が流れる形ですよね。
そういった、使い方は適当なんだろうかという疑問が残ります。
Tr内を利用しての抵抗を使って分圧するといったことを初めて考えてみたので、
疑問に感じました。
先達者の実例があればいいのですが。
後、今回の形の場合、当初からあったTrは、追加のフォトカプラがあるので
Trが2個になった形となるので、
当初のTrはいらないと思います。
このままだと、ダーリントン接続の形です。
さらに、
フォトカプラの使い方の場合、シンクでもソースでもOKなので、
右上に設けた抵抗は不要ですよ。
色々とすみません。
Re: 疑似可変抵抗
簡単だったので、実験しました。やはり想像していたとおりで、
Tr内を通じた場合、抵抗値が大きく変わります。
被計測抵抗値680Ωが写真の様に約0.9kになりました。
追記
maboさんは、No1681で、5220のテスト結果として
↓
**********
ワイパー両端まで,動かすと,片側07kΩ 片側0.2kΩ程度残ります。
それから,PIC AD5220の電源の入れ方で,
コントロールできなくなる場合があるようです。
*******************************
この時の実験の際、PICのプログラムは、猛牛ロックさんのですか?
それとも、maboさんのNo1693ですか??
maboさんのと比べて、差があったのでしょうか??
それと、
電源の入れ方で、問題があったようですが、問題解消のために
No1693のプログラムでは、どのようにしたのでしょうか?
x9cきましたか、自分の5220は、明後日には来ると思います
Re: 疑似可変抵抗
TRさん,猛牛ロックさん,こんばんは。
TRさん,いろいろありがとうございます。
======
>そういった、使い方は適当なんだろうかという疑問が残ります。
私も,自分で考えておきながら,いつも,TRさんがお書きいただいたようなこと考えてしまいます。
その点,いろんな意味で,理論的な背景のある諸兄がうらやましいです。
======
>当初のTrはいらないと思います。
デコーダICのドライブ能力のデータシートみてないので,
まあ,いれとけば,問題ないかな,位の気持ちでいれました。
多分,入れなくても,ドライブ能力はだいじょうでしょうね。
目的が違うのですが,7セグのダイナミック表示では,
トランジスタ入れてる回路もみかけますので,
それも,頭にあったのかもですね。
=====
>右上に設けた抵抗は不要ですよ。
これも深い意味はありません。当初,X9C等の取説見たとき,
最端でも40Ω程度の抵抗がある,の表記で,1701のような構造かな,と,早とちりしました。
万が一,使ってるカプラーやトランジスターが,ショートする
方向で,パンクしたとき,多少の安全弁になるかな,
位の意識で,いれましたので,大きな意味ないです。
シンク か ソースか,なんてことも,考えていませんでした。
=======
>ワイパー両端まで,動かすと,片側07kΩ 片側0.2kΩ程度残ります。
これ確かめたの,タクトスイッチを使った割り込みを使った自分のプログラムです。
======
>電源の入れ方で、問題があったようですが、問題解消のために
>No1693のプログラムでは、どのようにしたのでしょうか?
一般的な,PC等の電源の入れ方でしていました。
一番のノイズが大きいと想定されるモーターは,一番最初にいれて,次のようにしてました。
モーター → AD5220 → PIC
やはりこれだとだめでした。
PCの電源の入れ方は,周辺機器の認識の問題もあるので,
周辺機器からONするのが一般的だと思いますが,これがだめでした。
PICの電源を後にすると,PIC起動時の影響か,AD5220がコントロールできなくなる,と前回に記述したところです。
それで,逆にし,PICを先にONにしてみたのですが,D5220の電源を入れる時には,PIC側での,初期化が終わってしまうので,
最初うまくいきませんでした。
それで,PICのプログラムで,初期化の前にいろいろウエイトを入れてためしました。
ただ,感じとして,初期化の開始は,ウエイトをれても,変化ないような感じでしたでした。
そんなこんなで,いろいろやってみて,PICのポートの初期化の前に1回,
AD5220の前に1回,それぞれ,ウエイトいれて,
PICの起動後,約一秒以内にAD5220をONにした時
がほぼ100%コントロールできた,という状態です。
>この時の実験の際、PICのプログラムは、猛牛ロックさんのですか?
>それとも、maboさんのNo1693ですか??
>maboさんのと比べて、差があったのでしょうか??
猛牛ロックさんのプログラムは,AD変換で,ワイパーで『動かしていますので,
自分ので確認しただけですので,違いは,分かりません。
====
実際にAD5220等を使うには,PIC側の操作で,
AD5220の電源ONの時間を遅らせる等のード的な処置も必要なのかなと思いました。
ただ,残念ながら,いままで,いろんなHPを見てきましたが,
周辺機器の起動をハードで遅らせてる,ものは,なかったように思います。
手法的には,それほど手間かからないようなきがします。
TRさん,いろいろありがとうございます。
======
>そういった、使い方は適当なんだろうかという疑問が残ります。
私も,自分で考えておきながら,いつも,TRさんがお書きいただいたようなこと考えてしまいます。
その点,いろんな意味で,理論的な背景のある諸兄がうらやましいです。
======
>当初のTrはいらないと思います。
デコーダICのドライブ能力のデータシートみてないので,
まあ,いれとけば,問題ないかな,位の気持ちでいれました。
多分,入れなくても,ドライブ能力はだいじょうでしょうね。
目的が違うのですが,7セグのダイナミック表示では,
トランジスタ入れてる回路もみかけますので,
それも,頭にあったのかもですね。
=====
>右上に設けた抵抗は不要ですよ。
これも深い意味はありません。当初,X9C等の取説見たとき,
最端でも40Ω程度の抵抗がある,の表記で,1701のような構造かな,と,早とちりしました。
万が一,使ってるカプラーやトランジスターが,ショートする
方向で,パンクしたとき,多少の安全弁になるかな,
位の意識で,いれましたので,大きな意味ないです。
シンク か ソースか,なんてことも,考えていませんでした。
=======
>ワイパー両端まで,動かすと,片側07kΩ 片側0.2kΩ程度残ります。
これ確かめたの,タクトスイッチを使った割り込みを使った自分のプログラムです。
======
>電源の入れ方で、問題があったようですが、問題解消のために
>No1693のプログラムでは、どのようにしたのでしょうか?
一般的な,PC等の電源の入れ方でしていました。
一番のノイズが大きいと想定されるモーターは,一番最初にいれて,次のようにしてました。
モーター → AD5220 → PIC
やはりこれだとだめでした。
PCの電源の入れ方は,周辺機器の認識の問題もあるので,
周辺機器からONするのが一般的だと思いますが,これがだめでした。
PICの電源を後にすると,PIC起動時の影響か,AD5220がコントロールできなくなる,と前回に記述したところです。
それで,逆にし,PICを先にONにしてみたのですが,D5220の電源を入れる時には,PIC側での,初期化が終わってしまうので,
最初うまくいきませんでした。
それで,PICのプログラムで,初期化の前にいろいろウエイトを入れてためしました。
ただ,感じとして,初期化の開始は,ウエイトをれても,変化ないような感じでしたでした。
そんなこんなで,いろいろやってみて,PICのポートの初期化の前に1回,
AD5220の前に1回,それぞれ,ウエイトいれて,
PICの起動後,約一秒以内にAD5220をONにした時
がほぼ100%コントロールできた,という状態です。
>この時の実験の際、PICのプログラムは、猛牛ロックさんのですか?
>それとも、maboさんのNo1693ですか??
>maboさんのと比べて、差があったのでしょうか??
猛牛ロックさんのプログラムは,AD変換で,ワイパーで『動かしていますので,
自分ので確認しただけですので,違いは,分かりません。
====
実際にAD5220等を使うには,PIC側の操作で,
AD5220の電源ONの時間を遅らせる等のード的な処置も必要なのかなと思いました。
ただ,残念ながら,いままで,いろんなHPを見てきましたが,
周辺機器の起動をハードで遅らせてる,ものは,なかったように思います。
手法的には,それほど手間かからないようなきがします。
Re: 疑似可変抵抗
maboさん、おはようございます。>いろいろやってみて,PICのポートの初期化の前に1回,
AD5220の前に1回,それぞれ,ウエイトいれて,
PICの起動後,約一秒以内にAD5220をONにした時
がほぼ100%コントロールできた,という状態です。
・maboさんのプログラムNo1693と上記説明を見比べて分かりました。
自分も、参考にします。有難うございます。
疑似可変抵抗に使ったフォトカプラーですが、実験結果により固定抵抗の代わりになるのは間違いないと思います。
Trの内部抵抗と順電流の関係がどうかなといったところがあって、制御に使うのはコツがいるかもしれませんね。
*************++++++++++++++++
5220到着に備え
・本来の信号の流れであるSEC基板からの信号は、MACHの基本周波数(200Hz想定)を受けることになりますが、
今まで、
DC5V〜VR〜PIC(AD変換してX9c駆動プログラム)〜x9c〜LED(抵抗付加)でした。
今回は、
DC5V〜VR〜PIC(PWM240Hz発生)〜
ローパス(ローカット200Hz)〜
PIC(AD変換内蔵のX9c駆動プログラム)〜
5220(単に、ワイパと下方のRl端子間の状況を見る)
の方法もプラスして、としました。
*AD変換内蔵の5220駆動プログラムは、猛牛ロックさんにmaboさんのをプラスします。
PIC(PWM240Hz発生)の部分を追加したので、MACH(PWM基本周波数240Hz)に似せた状況にしました。
まっ、適当かどうか不明ですが。
実際、
PIC(PWM240Hz発生)にLEDを付けると、光方に斑が出るのが分かりました。
目視で確認できるのかとも驚きました!
今回は、OSCCONの設定とかまじめに考えました。
写真を載せました。算出方法を乗せた写真ですが、あっていますか?
見てやってください。
宜しくお願いします。
PIC16F1827
Re: 疑似可変抵抗
Re: 疑似可変抵抗
TRさん,猛牛ロックさん,こんばんは。
TRさん,いろいろやられていますね。
ちょっと,不明な点なのですが,
TRさんが今日,やられたのは,SECさんの基盤と切り離して,
MACHからのPWMの信号の代わりに,ボリュームで,
電圧調整して,PICに入れての実験でしたか。
それと,電圧計られたのは,入力に使ったボリュームでしょうか。
それとも,X9Cで計られたのですか。
ちょっと不明です。
今日は,昨日の草刈りの影響え疲れ切っていますので,
ボケ−ッ と,しました。
いろいろあさってたのですが,同じようなことやっている
諸兄を見つけました。
ただ,CNC等のコントロールではなく,オーディオのボリュームの調整のようです。
http://mikenekosou.blog76.fc2.com/blog-entry-140.html
この使い方は,電流制御 なんでしょうね。
初めて知りましたが,レオスタッド・モードとか言うみたいです。
プログラムがのってないので,よく分かりませんが,
この諸兄は,PICで 同時に複数のカプラーをONにして,
コントロールしてるような感じですかね。
それと,機械的なリレーと同等以上のフォットカプラーの紹介もありました。
高いです。500円前後するみたいですね。
TRさん,いろいろやられていますね。
ちょっと,不明な点なのですが,
TRさんが今日,やられたのは,SECさんの基盤と切り離して,
MACHからのPWMの信号の代わりに,ボリュームで,
電圧調整して,PICに入れての実験でしたか。
それと,電圧計られたのは,入力に使ったボリュームでしょうか。
それとも,X9Cで計られたのですか。
ちょっと不明です。
今日は,昨日の草刈りの影響え疲れ切っていますので,
ボケ−ッ と,しました。
いろいろあさってたのですが,同じようなことやっている
諸兄を見つけました。
ただ,CNC等のコントロールではなく,オーディオのボリュームの調整のようです。
http://mikenekosou.blog76.fc2.com/blog-entry-140.html
この使い方は,電流制御 なんでしょうね。
初めて知りましたが,レオスタッド・モードとか言うみたいです。
プログラムがのってないので,よく分かりませんが,
この諸兄は,PICで 同時に複数のカプラーをONにして,
コントロールしてるような感じですかね。
それと,機械的なリレーと同等以上のフォットカプラーの紹介もありました。
高いです。500円前後するみたいですね。
Re: 疑似可変抵抗
今日の実験
実験の繋ぎ方ですね。
DC5.1V電源〜VR〜PIC(PWAM発生)〜ローパス〜PIC(0622/5220駆動プログラム)〜AD5220〜テスター
まだ、SEC基板やML4には触れていません。
ポテンションメーターは、AD5220が今日来たので、初めて使いました。
電圧測定箇所は、AD5220のワイパー〜Rl間です。
実験の繋ぎ方ですね。
DC5.1V電源〜VR〜PIC(PWAM発生)〜ローパス〜PIC(0622/5220駆動プログラム)〜AD5220〜テスター
まだ、SEC基板やML4には触れていません。
ポテンションメーターは、AD5220が今日来たので、初めて使いました。
電圧測定箇所は、AD5220のワイパー〜Rl間です。
Re: 疑似可変抵抗
TRさん,猛牛ロックさん,こんばんは。
TRさんの実験環境わかりました。
ありがとうございます。
PWMの発生に関する記載があったので,ちょっとあれ,と思った次第です。
ご自分でプログラムされた,PWM信号を入力にお使いなんですね。
了解いたしました。
AD52204安定しませんか。
ちょっと,原因は分かりません。
CLKとU/D単身をプルアップするかしないかでも,
私の場合挙動が変化しました。
よくわからにのですが,CS端子は固定してありますが,
この変ももしかして関係あるのかもしれません。
外部からのノイズ受けやすいのでしょうかね。
この辺は,自作した方が,ノイズ等には強いかもですね。
TRさんそれから,プログラムですが,
while (AD5220_val>0)AD5220_down;
AD5220_down →→ AD5220_down( );
でしょうかね。
それと,
while (AD5220_val>0)
while (AD5220_val)
は,結局同じ意味だと思います。AD5220_val の変数は,
AD5220_down( )のサブ関数内で,0 になるまで,マイナスされます。
while(K) は,Kの部分が0以外だとループされて,
0になると,ループを抜けるので同じ意味かと思います。
前回はタクトスイッチ使って,AD5220のコントロールしましたが,
秋月の安いエンコーダーで,やってみようかななんて,
いろいろ画策してます。
それと,自作のデジタルポテンショメーター(デジポット)に必要な部材,
まとめています。
TRさんの実験環境わかりました。
ありがとうございます。
PWMの発生に関する記載があったので,ちょっとあれ,と思った次第です。
ご自分でプログラムされた,PWM信号を入力にお使いなんですね。
了解いたしました。
AD52204安定しませんか。
ちょっと,原因は分かりません。
CLKとU/D単身をプルアップするかしないかでも,
私の場合挙動が変化しました。
よくわからにのですが,CS端子は固定してありますが,
この変ももしかして関係あるのかもしれません。
外部からのノイズ受けやすいのでしょうかね。
この辺は,自作した方が,ノイズ等には強いかもですね。
TRさんそれから,プログラムですが,
while (AD5220_val>0)AD5220_down;
AD5220_down →→ AD5220_down( );
でしょうかね。
それと,
while (AD5220_val>0)
while (AD5220_val)
は,結局同じ意味だと思います。AD5220_val の変数は,
AD5220_down( )のサブ関数内で,0 になるまで,マイナスされます。
while(K) は,Kの部分が0以外だとループされて,
0になると,ループを抜けるので同じ意味かと思います。
前回はタクトスイッチ使って,AD5220のコントロールしましたが,
秋月の安いエンコーダーで,やってみようかななんて,
いろいろ画策してます。
それと,自作のデジタルポテンショメーター(デジポット)に必要な部材,
まとめています。
Re: 疑似可変抵抗
maboさん、こんばんは。
maboさんの5220プログラムですが、
PICの初期設定関数をみると、初期化の前に500msのウエイトを2回付けていますが、
5220は、電源を入れると抵抗値が半分になるので、
最初に、ワイパから、電源電圧の半分が出力されませんか?
記
* メインの処理 *
*******************************************************************************/
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);
それと自分の5220ですが、電圧を上げていく途中、
テスターを見ていると、一瞬ぐっと山が出ます。
後、残留電圧ですが、蛍光灯に反応しています。
やっぱり、安定しませんね。
maboさんの5220プログラムですが、
PICの初期設定関数をみると、初期化の前に500msのウエイトを2回付けていますが、
5220は、電源を入れると抵抗値が半分になるので、
最初に、ワイパから、電源電圧の半分が出力されませんか?
記
* メインの処理 *
*******************************************************************************/
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);
それと自分の5220ですが、電圧を上げていく途中、
テスターを見ていると、一瞬ぐっと山が出ます。
後、残留電圧ですが、蛍光灯に反応しています。
やっぱり、安定しませんね。
Re: 疑似可変抵抗
TRさん,猛牛ロックさん,こんばんは。
AD5220については,電圧は測って内ので不明ですが,
PWMコントローラのボリュームと置き換えて,
モーターのコントロールで,判断してますが,
安定しないときは,モーターが回らなかったり,
回ったりで,きちんとコントロールができるときは,
置き換え前のボリュームでのコントロールと同じ程度にコントロールできました。
>最初に、ワイパから、電源電圧の半分が出力されませんか?
多分,これ,正常かもしれません。
マニュアルに,最初はワイパーが,64のところにある,との記述があったように思います。
初期化がうまくいかないとのことですが,
PWM発生→→ ローパス →→ PIC(AD変換) →→ AD5220
でおやりでしょうか。
PWM発生とローパスを外して,
ボリューム(片側5V)をPIC接続してAD変換してみて,
結果を見てはどうでしょうか。
それと,お使いの部プログラムは,No1671のですか。
変更してなければ,初期化記述が,main のなかにないようですが・・・・・。
====追記です====
>GNDにしてあります。 これ以上の方法はどういった方法なのでしょうか?
意味あるのかは分かりませんが,CS端子もプルアップでPICにつないで,
AD5220の初期化の前に,
RB2=0;(CSをつないであるPIC端子)
__delay_ms(500);
AD5220_init();
とかやったらどうなのかなと思いました。
AD5220については,電圧は測って内ので不明ですが,
PWMコントローラのボリュームと置き換えて,
モーターのコントロールで,判断してますが,
安定しないときは,モーターが回らなかったり,
回ったりで,きちんとコントロールができるときは,
置き換え前のボリュームでのコントロールと同じ程度にコントロールできました。
>最初に、ワイパから、電源電圧の半分が出力されませんか?
多分,これ,正常かもしれません。
マニュアルに,最初はワイパーが,64のところにある,との記述があったように思います。
初期化がうまくいかないとのことですが,
PWM発生→→ ローパス →→ PIC(AD変換) →→ AD5220
でおやりでしょうか。
PWM発生とローパスを外して,
ボリューム(片側5V)をPIC接続してAD変換してみて,
結果を見てはどうでしょうか。
それと,お使いの部プログラムは,No1671のですか。
変更してなければ,初期化記述が,main のなかにないようですが・・・・・。
====追記です====
>GNDにしてあります。 これ以上の方法はどういった方法なのでしょうか?
意味あるのかは分かりませんが,CS端子もプルアップでPICにつないで,
AD5220の初期化の前に,
RB2=0;(CSをつないであるPIC端子)
__delay_ms(500);
AD5220_init();
とかやったらどうなのかなと思いました。
Re: 疑似可変抵抗
maboさん、おはようございます。いつもレスありがとうございます。
>それと,お使いの部プログラムは,No1671のですか。
変更してなければ,初期化記述が,main のなかにないようですが・・・・・。
今は、No1671は使っていません。
全く動作しませんでした。
mainの中に、初期化関数を配置してもダメでした。
理由は不明、一応、猛牛ロックさんとのやり取りで作った内容でした。
自分でプログラムは作り直しました。
一応動作するようになりました。
No1671との差は、自分のは、初期化関数を追加したのは当たり前ですが、
5220の動作を重くしたというのか、くどいのかも知れません。
ただ、きにいらないのが、不安定なところがあるのです。
動作不安定な状況写真を付けました。
写真右は、5220の内部電圧が下がった状態でして、
この辺の内部電圧から5220をOnにすれば初期化が成功します。
ただ、5220をOffにしてからかなり待たなければなりません。
待ち時間を短縮する方法が分かればいいのですが。
待ち時間短縮に直接寄与するかどうかわかりませんが、
5220の電源直近にオイルコンを付けました。気持ち変わったかな〜程度です。
その他にもちょっと癖があります。
>PWM発生とローパスを外して,
ボリューム(片側5V)をPIC接続してAD変換してみて,
結果を見てはどうでしょうか。
やはり症状は変わりません。
>意味あるのかは分かりませんが,CS端子もプルアップでPICにつないで,
AD5220の初期化の前に,
RB2=0;(CSをつないであるPIC端子)
__delay_ms(500);
AD5220_init();
とかやったらどうなのかなと思いました。
一応、やっています。それも、前記プログラムとの合わせ技で
5220のCS端子をGNDに繋いでもいます。
でも、5220はON/Offの繰り返しには対応できません。
実際のフライス作業に使うわけですが、5220はSSやSEC基板と同じ電源にするので、
こういったOn/Offの連続操作はないと思うので、もうやめて、次の段階に進もうかと思いっています。
あれ 5220故障かな、プログラム大丈夫かも。
Re: 疑似可変抵抗
maboさん、こんにちは。先程、ML4の可変抵抗器の使われ方を調べました。
写真の通りです。
VRは電圧制御の使われ方でした。
電源電圧5Vを@とA間の抵抗によって電圧を分圧し制御していると思います。
後は、5220を使って、バラックでのテストです。
一応、ML4〜Bの電流も調べましたが、MAXで2.7mAでした。
赤だけ外して、電圧も確認しました。5Vです。
後、既存の可変抵抗ですが、東京コスモス製
型番が、RV24YN 20S B502 127C
からすると5kのBカーブです。
Bと@を本体から外し、Aをそのままにして、抵抗値を計測したら5.3kでした。
焦っても良い事はないので、今日は、これで作業は中止して、5220を弄っています。
配線図なんかもチェックします。
ついでですみません。
プログラムでよく、__delay_ms(500);このように書きますが、
実際とはずれている感じがします。
実感と同じ時間にするには、どういった計算をするのでしょうか?
お願いします。
Re: 疑似可変抵抗
TRさん,猛牛ロックさん,こんばんは。
>プログラムでよく、__delay_ms(500);このように書きますが、
>実際とはずれている感じがします。
>実感と同じ時間にするには、どういった計算をするのでしょうか?
>お願いします。
この部分は,マクロで,次のようになってるようです。
#define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000.0)))
usの場合,プログラムの冒頭で指定した,
#define 8000000
のクロック数を4000000で割って,delay( )を作ってるようです。
よく分からないのですが,もっと,正確にするには,
外部のオシレーター使ったり,割り込み使ったりするんでしょうかね。
それから,No1671 動かなかったということで,プログラム
見てみました。
共通の部分でもあるんですよね。
もしかして,思い違いが入ってるかもしれない気がします。
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関数呼び出し
}
この部分ですが,32個分の配列を用意して,
adc[0]〜adc[31]
のそれぞれにADCで変換した値を読み込むことになってます。
ただ,ループの中の先頭で,毎回,adc[ ],num ,を0で初期化してます。
その後で,
adc[(++num)&31] = adconv();
をしてますので,(++num)&31 の部分は, 毎回 1 になってしまうのではと思います。
となると,毎回読み取った値が,adc[1]に保存されることになり,
そのほかのadc[*](adc[0],adc[2],.......adc[30],adc[31],)は,
初期化した,0 になると思います。
それで,正しく32回分の平均にならないような気がします。
次のようにすれば,32回分のデータの平均になるのかなと思います。
=========
static unsigned int adc[32] = {0};//while分の外で初期化
static char num = 0;//while分の外で初期化
while (1) {
target = 0;
if(num==32){
?adc[32] = {0};
num = 0;
}
adc[num++] = 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関数呼び出し
}
========
if(num==32) の中に,
adc[32] = {0};
を入れると,毎回,32回ごとに,まっさらな状態で,
平均を取ることになると思います。
これを入れないと,一番古いデータの一つと,一番新しいデーターの一つを入れ替えて,
常に,平均を出すことになると思います。
どちらがいいのか分かりませんが,
個人的には,一番古いデーターと,一番新しいデーターを入れ替えて計算するのが,いいのかな,と思います。
まだ,確認してませんが,確かめてみたいと思います。
>プログラムでよく、__delay_ms(500);このように書きますが、
>実際とはずれている感じがします。
>実感と同じ時間にするには、どういった計算をするのでしょうか?
>お願いします。
この部分は,マクロで,次のようになってるようです。
#define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000.0)))
usの場合,プログラムの冒頭で指定した,
#define 8000000
のクロック数を4000000で割って,delay( )を作ってるようです。
よく分からないのですが,もっと,正確にするには,
外部のオシレーター使ったり,割り込み使ったりするんでしょうかね。
それから,No1671 動かなかったということで,プログラム
見てみました。
共通の部分でもあるんですよね。
もしかして,思い違いが入ってるかもしれない気がします。
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関数呼び出し
}
この部分ですが,32個分の配列を用意して,
adc[0]〜adc[31]
のそれぞれにADCで変換した値を読み込むことになってます。
ただ,ループの中の先頭で,毎回,adc[ ],num ,を0で初期化してます。
その後で,
adc[(++num)&31] = adconv();
をしてますので,(++num)&31 の部分は, 毎回 1 になってしまうのではと思います。
となると,毎回読み取った値が,adc[1]に保存されることになり,
そのほかのadc[*](adc[0],adc[2],.......adc[30],adc[31],)は,
初期化した,0 になると思います。
それで,正しく32回分の平均にならないような気がします。
次のようにすれば,32回分のデータの平均になるのかなと思います。
=========
static unsigned int adc[32] = {0};//while分の外で初期化
static char num = 0;//while分の外で初期化
while (1) {
target = 0;
if(num==32){
?adc[32] = {0};
num = 0;
}
adc[num++] = 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関数呼び出し
}
========
if(num==32) の中に,
adc[32] = {0};
を入れると,毎回,32回ごとに,まっさらな状態で,
平均を取ることになると思います。
これを入れないと,一番古いデータの一つと,一番新しいデーターの一つを入れ替えて,
常に,平均を出すことになると思います。
どちらがいいのか分かりませんが,
個人的には,一番古いデーターと,一番新しいデーターを入れ替えて計算するのが,いいのかな,と思います。
まだ,確認してませんが,確かめてみたいと思います。
Re: 疑似可変抵抗
maboさん、おはようございます。
自分聞き方が悪かったかもしれないので、聞き直します。
5220駆動プログラムを通じて、delay関数で気付きがありました。
例では、
maboさんの、初期化関数内に記載している
__delay_ms(500);
__delay_ms(500);
この2行です。
ms500は、私の感覚では、0.5秒ですよね。一呼吸相当な感じ(笑い
で、
delay500が2行なので、1秒経過してから、初期化となる。
初期化の様子をテスターで観察すると、様子が分かりました。
見ていると、1秒よりずいぶん経過した後に初期化している感じでした。
そこで、自分の設定方法が悪いのではと、疑問を持ちました。
そこで、maboさんにお聞きしました。
以下の通り考えていました。間違っていますか?
自分の場合の設定方法
・#pragma config FOSC = INTOSC で内部クロックを使用する。
・#define _XTAL_FREQ 16000000 ここで、マイコンの動作速度をクロックを16万Hzと設定
後は、delay関数を使えば、()内に指定する数値(時間)を止めることができると思っていました
。
例
__delay_ms(500); ←0.5秒待つ
配列関数の方は、自分も再考してみます。なんか、テスターの動きが悪い感じです。
あ〜、今日はML4でテストという段取り済みでしたが、
流れますね。
>それから,No1671 動かなかったということで,プログラム
見てみました。
自分の5220故障しているかも。その成果も。
********************
追記
maboさんこんにちは。
>adc[(++num)&31] = adconv();
これの内、&31は、10進数で11111
&があるから0b11111と読み替えられるようですね?
ループの1巡目でいうと
adc[0]&0b11111でマスク処理されて、adc[1]となるのかな。
[]内は、数字なんですね、分かりずらい!
自分聞き方が悪かったかもしれないので、聞き直します。
5220駆動プログラムを通じて、delay関数で気付きがありました。
例では、
maboさんの、初期化関数内に記載している
__delay_ms(500);
__delay_ms(500);
この2行です。
ms500は、私の感覚では、0.5秒ですよね。一呼吸相当な感じ(笑い
で、
delay500が2行なので、1秒経過してから、初期化となる。
初期化の様子をテスターで観察すると、様子が分かりました。
見ていると、1秒よりずいぶん経過した後に初期化している感じでした。
そこで、自分の設定方法が悪いのではと、疑問を持ちました。
そこで、maboさんにお聞きしました。
以下の通り考えていました。間違っていますか?
自分の場合の設定方法
・#pragma config FOSC = INTOSC で内部クロックを使用する。
・#define _XTAL_FREQ 16000000 ここで、マイコンの動作速度をクロックを16万Hzと設定
後は、delay関数を使えば、()内に指定する数値(時間)を止めることができると思っていました
。
例
__delay_ms(500); ←0.5秒待つ
配列関数の方は、自分も再考してみます。なんか、テスターの動きが悪い感じです。
あ〜、今日はML4でテストという段取り済みでしたが、
流れますね。
>それから,No1671 動かなかったということで,プログラム
見てみました。
自分の5220故障しているかも。その成果も。
********************
追記
maboさんこんにちは。
>adc[(++num)&31] = adconv();
これの内、&31は、10進数で11111
&があるから0b11111と読み替えられるようですね?
ループの1巡目でいうと
adc[0]&0b11111でマスク処理されて、adc[1]となるのかな。
[]内は、数字なんですね、分かりずらい!
Re: 疑似可変抵抗
> TRさん
向こうにも書きましたけど、
OSCCON = 0b0111001; //クロック周波数を16MHzに設定
が違います。これではPICが動きません。
※間違いの入っている元レスも修正しておいた方が良いです。
コピペして使う可能性もありますから。
追記しておきます。
下の方のプログラムの幾つかは
#define _XTAL_FREQ
と実周波数部分が書かれていません。
基本的にMABOさんと同じ周波数(プログラム前半部)にした方が良いと思います。
向こうにも書きましたけど、
OSCCON = 0b0111001; //クロック周波数を16MHzに設定
が違います。これではPICが動きません。
※間違いの入っている元レスも修正しておいた方が良いです。
コピペして使う可能性もありますから。
追記しておきます。
下の方のプログラムの幾つかは
#define _XTAL_FREQ
と実周波数部分が書かれていません。
基本的にMABOさんと同じ周波数(プログラム前半部)にした方が良いと思います。
Re: 疑似可変抵抗
maboさん、続けて失礼します。
問題のところですが以下のようにしました。
動作しています。
下の方にある__delay_ms(1);は、サンプリング間隔です。
猛牛ロックさんに言われていました。
PWM基本周波数と関係するそうです。
ワイパ〜Rl間の電圧を見ていると面白いです。
Sw ONで約250mv、VR目一杯開けて、その後、目一杯閉めると130mvになります。
初期化より、ダウン関数の方が、ワイパ一が下がっているように感じます。
動作してくると面白くなってきます。
AD5220を2個追加しました。
記
while (1) {
static unsigned int adc[64] = {0};
static char num = 0;
unsigned int target = 0;
for (char i = 0; i < 64; i++)adc[i] = adconv();→ 配列がadc[0]〜にしたつもり
for (char i = 0; i < 64; i++)target += adc[i];
target1 = target / 511.5;
if (target1 > AD5220_val) {
AD5220_up();
} else if (target1 < AD5220_val) {
AD5220_down(); //down関数呼び出し
}
__delay_ms(1);
}
追記
現在PIC(PWM発生)の信号をもとに5220を駆動するテスト段階に入りました。
結果、コンデンサは20μF、75Ωが良い感じです。
それと、5220駆動プログラムの内、
サンプリング間隔は、PWH基本周波数244Hzでやっていますが、
__delay_us(244)が良い感じです。
問題のところですが以下のようにしました。
動作しています。
下の方にある__delay_ms(1);は、サンプリング間隔です。
猛牛ロックさんに言われていました。
PWM基本周波数と関係するそうです。
ワイパ〜Rl間の電圧を見ていると面白いです。
Sw ONで約250mv、VR目一杯開けて、その後、目一杯閉めると130mvになります。
初期化より、ダウン関数の方が、ワイパ一が下がっているように感じます。
動作してくると面白くなってきます。
AD5220を2個追加しました。
記
while (1) {
static unsigned int adc[64] = {0};
static char num = 0;
unsigned int target = 0;
for (char i = 0; i < 64; i++)adc[i] = adconv();→ 配列がadc[0]〜にしたつもり
for (char i = 0; i < 64; i++)target += adc[i];
target1 = target / 511.5;
if (target1 > AD5220_val) {
AD5220_up();
} else if (target1 < AD5220_val) {
AD5220_down(); //down関数呼び出し
}
__delay_ms(1);
}
追記
現在PIC(PWM発生)の信号をもとに5220を駆動するテスト段階に入りました。
結果、コンデンサは20μF、75Ωが良い感じです。
それと、5220駆動プログラムの内、
サンプリング間隔は、PWH基本周波数244Hzでやっていますが、
__delay_us(244)が良い感じです。
Re: 疑似可変抵抗
> MABOさん添付図はAD5220の日本語データシートP8に記載されているものです。
ここでは、
・パワーオン時に40H(=64)からカウントを開始する。
・クロックを入れると1LSB(最小単位)ずつインクリメントする。
・UDピンがHIGHならフルスケール値3FH(63)まで動き、LOWなら
00H(ゼロ・スケール)まで動き、どちらもそれ以上のクロックは無視される。
と書いてあります。
私は、「3FH」が7FH(127)の誤植?なのだろうと思っていたのですけど、
そうではなく、考え方が間違っているのかもしれません。
いや、その点は誤植なのかもしれませんけど、最大値というか、ポジションはここで、
7FHだと思っていたのですけど、本当は80H(128)まであって、129ポジションなのかもしれません。
※X9Cの方は抵抗が99あって、100ポジションとなっているので間違いはないと思います。
ついでに言えば、1ページにある、
「図2b.フル・スケール・アップ/ダウン・カウント」というタイトルの波形図ですけど、
タイトルからすれば、一番上から一番下まで移動させている、というように読めますけど、
その図中の表記は「COUNT 00H→3FH→00H」つまり、0→63→0なんですよね。
このあたりも???です。
その左に目を向けると
「(例えば、R STEP =10 kΩ/128=78 W)」となっています。
これも、「78Ω」もしくは「78Ω/W(ワイパー)」だと思うのですけど、単位はともかく、
計算式に関してはデータシート上では128抵抗あるように書いてあるようです。
ぶっちゃけ、動作しないのなら、あまりデータシート(の数値)も当てにならないのかもしれません。
実際に試してみるしかない部分もありそうです。
あと注意事項ですけど、ホームページのFAQで
Q: デバイスの電源がoffの時に、W(ワイパー)やA、B端子に電圧を印加することは可能ですか?(GNDは共通)
A: ストレスにより破壊する危険がありますので、不可です。
となっています。繋ぐ順番そして、切る順番も考慮する必要がありますね。どの程度シビアな要件なのかは判りませんけど。
Re: 疑似可変抵抗
TRさん,猛牛ロックさん,こんばんは。
=====猛牛ロックさん=======
猛牛ロックさん,詳しい考察ありがとうございました。
この辺,私,だめなんですよね。
あまり読んだりしないので・・・・・・・。
勉強になります。
それと,やはり,ON OFF のシーケンスや,
接続機器との接続のシーケンス,等まで,細かく検討するようなんですね。
いろいろ,面倒ですね。
====TRさん=====
>自分の場合の設定方法
>・#pragma config FOSC = INTOSC で内部クロックを使用する。
・#define _XTAL_FREQ 16000000 ここで、マイコンの動作速度をクロックを16万Hzと設定
>後は、delay関数を使えば、()内に指定する数値(時間)を止めることができると思っていました
猛牛ロックさんがおっしゃってたように,OSCCONの設定もあるようですね。
これ,が正しく設定されてないと,もしかして,早く感じたり,遅く感じたりするかもですね。
それから,追記の
>>adc[(++num)&31] = adconv();
ですが,num が 32以上にならないための処理だと思います。
まず,++num で,num が +1 されて,
その後と,31との&が取られると理解しました。
num が 32 以上になった時,「&」の処理で,
0→0
1→1
・
・
31→31
32→0
33→1
のようになると思います。
プログラムの流れでは,
num は num=0 で冒頭に初期化されてますので,
++num で0に1にプラスされて,
num に 1 が入り, & が 実施されると理解しました。
num++ だと 処理がすんだ後でプラスされるので,
「numの0」と31の&が取られた後で,numが 1 になると理解してました。
ここ,ちょっと,いつも不安になるところです。
それで,書くときは,いつも,
adc[num & 31] = adconv();
num++;
か,
num++;
adc[num & 31] = adconv();
みたいに,明示的に書いてます。
こうしないと理解できないので,頭弱いのかなと思ってます。(笑)
私の理解,間違っているかもしれません。
それから,プログラムですが,64回のサンプリングですね。
for (char i = 0; i < 64; i++)adc[i] = adconv();→ 配列がadc[0]〜にしたつもり
for (char i = 0; i < 64; i++)target += adc[i];
この部分,
for (char i = 0; i < 64; i++){
adc[i] = adconv();
target += adc[i];
}
みたいに,一つにすると,多分,半分の時間でできます。
それと,好みの問題なのですが,後からのデバックのしやすさ考えると,
{ }
を省略しないで書く方が,私は,好みです。
省略して書くと,後で確かめるとき,範囲が曖昧になって,
理解できななくなってしまします。
やはり頭悪いです。(笑)
>動作してくると面白くなってきます。
>AD5220を2個追加しました。
安定して,動作するようになったんでしょうか。
ちょと,明るくなってきましたかね。
=====猛牛ロックさん=======
猛牛ロックさん,詳しい考察ありがとうございました。
この辺,私,だめなんですよね。
あまり読んだりしないので・・・・・・・。
勉強になります。
それと,やはり,ON OFF のシーケンスや,
接続機器との接続のシーケンス,等まで,細かく検討するようなんですね。
いろいろ,面倒ですね。
====TRさん=====
>自分の場合の設定方法
>・#pragma config FOSC = INTOSC で内部クロックを使用する。
・#define _XTAL_FREQ 16000000 ここで、マイコンの動作速度をクロックを16万Hzと設定
>後は、delay関数を使えば、()内に指定する数値(時間)を止めることができると思っていました
猛牛ロックさんがおっしゃってたように,OSCCONの設定もあるようですね。
これ,が正しく設定されてないと,もしかして,早く感じたり,遅く感じたりするかもですね。
それから,追記の
>>adc[(++num)&31] = adconv();
ですが,num が 32以上にならないための処理だと思います。
まず,++num で,num が +1 されて,
その後と,31との&が取られると理解しました。
num が 32 以上になった時,「&」の処理で,
0→0
1→1
・
・
31→31
32→0
33→1
のようになると思います。
プログラムの流れでは,
num は num=0 で冒頭に初期化されてますので,
++num で0に1にプラスされて,
num に 1 が入り, & が 実施されると理解しました。
num++ だと 処理がすんだ後でプラスされるので,
「numの0」と31の&が取られた後で,numが 1 になると理解してました。
ここ,ちょっと,いつも不安になるところです。
それで,書くときは,いつも,
adc[num & 31] = adconv();
num++;
か,
num++;
adc[num & 31] = adconv();
みたいに,明示的に書いてます。
こうしないと理解できないので,頭弱いのかなと思ってます。(笑)
私の理解,間違っているかもしれません。
それから,プログラムですが,64回のサンプリングですね。
for (char i = 0; i < 64; i++)adc[i] = adconv();→ 配列がadc[0]〜にしたつもり
for (char i = 0; i < 64; i++)target += adc[i];
この部分,
for (char i = 0; i < 64; i++){
adc[i] = adconv();
target += adc[i];
}
みたいに,一つにすると,多分,半分の時間でできます。
それと,好みの問題なのですが,後からのデバックのしやすさ考えると,
{ }
を省略しないで書く方が,私は,好みです。
省略して書くと,後で確かめるとき,範囲が曖昧になって,
理解できななくなってしまします。
やはり頭悪いです。(笑)
>動作してくると面白くなってきます。
>AD5220を2個追加しました。
安定して,動作するようになったんでしょうか。
ちょと,明るくなってきましたかね。
Re: 疑似可変抵抗
maboさんおはようございます。
5220の電源のON/OFFの順番は、同感です。
自分も過去に、ON/OFFの順番あるな〜と感じて、書き込んであります。
でも、そういった注意点は、自分の過去の経験で、分かったことで、デバイスの説明書にはないと思いました。
>猛牛ロックさんがおっしゃってたように,OSCCONの設定もあるようですね。
そうでしたか、下記の通りですね、最初何を言っているのか分かりませんでした。
今、maboさんに言われて、分かりました、でも実際は、何度も、データシートを見て、確認していたので、
いつの間にか、直っていました。 そういった地味な積み重ねで、今は動作しています。
素人には、丁寧に説明してくれないと何を言っているのかよく分かりません!!
maboさん、いつも丁寧な説明に感謝します。
maboさんとのコミュニケーションにはストレスがありません!!!!
気が合いますね!!!
記
OSCCONについて
当 初:OSCCON = 0b0111001; //クロック周波数を16MHzに設定
変更後:OSCCON = 0b01110010; //クロック周波数を16MHzに設定
>num++;
adc[num & 31] = adconv();
みたいに,明示的に書いてます。
こうしないと理解できないので,頭弱いのかなと思ってます。(笑)
この部分ですが、次行のままだと
次行
>>adc[(++num)&31] = adconv();
駄目だと分かりました。
32にしないと駄目!
でも、
32にすると、32は2進数で100000、なので
10000&32
それも、&が利いてマスク処理され、&0b11と同じになるとか。
つまり、00
なので、
作られる配列の順番は、
adc[1],adc[2]〜adc[0]となる、
でも、配列に順番が、最後に0が来て、adc[0]に一番最後にサンプリングされた値が入るので、
サンプリングにより平均値を出すという考えと合っているのか??と思いますが、
どうかなって感じです。 ただ一定しているので良いような気もします。
maboさんは、どう思いますか??
テスターの数値を見ていると、スムースじゃないんですよ。
プログラム処理では無理なのかな。
つまり、
サンプリングを一定間隔で、とっていている中、VRが変わると、急遽、UP/DOWNをし、
それが終わると、また、サンプリングをする という流れでしょ!?
テスターの数値が滑らかに動かないのは、こういった計算処理の所為かなって思います。
maboさんもやってみてください。
それと、自分の場合、今のままじゃ、コンパイルできませんでした。
自分が変えた内容は、下記のとおりです。
target1とし、targetと分けることによって、安定しました。
記
for (char i = 0; i < 64; i++)target += adc[i];
target1 = target / 511.5;__delay_us(250);//PWMサンプリング間隔
if (target1 > AD5220_val) {
AD5220_up();
} else if (target1 < AD5220_val) {
>for (char i = 0; i < 64; i++){
adc[i] = adconv();
target += adc[i];
}
有難うございます。
この方が見やすいですね、今、このようにしました。
ついでに、
for文について解釈を教えて下さい。
キットで遊ぼうより抜粋 ↓
*******************
初期化式の値が変化式によって変化した後、継続条件式が真ならば処理を繰り返し実行。
継続条件式が偽ならば、処理は実行されない。
******************
for文に来た時、継続条件式をすべて実施した後、やっと、for文を抜けることができるのでしょうか????
長文になりましたが、ご容赦願います。
で、
ローパスの注意点があります。
10μと22kだと、抵抗が大きすぎて、電圧が分圧される度合いが大きすぎます。
自分は、今は、75Ωにし、その分、コンデンサ10μを2個並列にしています。並列によって、コンデンサ容量は2倍になる。
5220の電源のON/OFFの順番は、同感です。
自分も過去に、ON/OFFの順番あるな〜と感じて、書き込んであります。
でも、そういった注意点は、自分の過去の経験で、分かったことで、デバイスの説明書にはないと思いました。
>猛牛ロックさんがおっしゃってたように,OSCCONの設定もあるようですね。
そうでしたか、下記の通りですね、最初何を言っているのか分かりませんでした。
今、maboさんに言われて、分かりました、でも実際は、何度も、データシートを見て、確認していたので、
いつの間にか、直っていました。 そういった地味な積み重ねで、今は動作しています。
素人には、丁寧に説明してくれないと何を言っているのかよく分かりません!!
maboさん、いつも丁寧な説明に感謝します。
maboさんとのコミュニケーションにはストレスがありません!!!!
気が合いますね!!!
記
OSCCONについて
当 初:OSCCON = 0b0111001; //クロック周波数を16MHzに設定
変更後:OSCCON = 0b01110010; //クロック周波数を16MHzに設定
>num++;
adc[num & 31] = adconv();
みたいに,明示的に書いてます。
こうしないと理解できないので,頭弱いのかなと思ってます。(笑)
この部分ですが、次行のままだと
次行
>>adc[(++num)&31] = adconv();
駄目だと分かりました。
32にしないと駄目!
でも、
32にすると、32は2進数で100000、なので
10000&32
それも、&が利いてマスク処理され、&0b11と同じになるとか。
つまり、00
なので、
作られる配列の順番は、
adc[1],adc[2]〜adc[0]となる、
でも、配列に順番が、最後に0が来て、adc[0]に一番最後にサンプリングされた値が入るので、
サンプリングにより平均値を出すという考えと合っているのか??と思いますが、
どうかなって感じです。 ただ一定しているので良いような気もします。
maboさんは、どう思いますか??
テスターの数値を見ていると、スムースじゃないんですよ。
プログラム処理では無理なのかな。
つまり、
サンプリングを一定間隔で、とっていている中、VRが変わると、急遽、UP/DOWNをし、
それが終わると、また、サンプリングをする という流れでしょ!?
テスターの数値が滑らかに動かないのは、こういった計算処理の所為かなって思います。
maboさんもやってみてください。
それと、自分の場合、今のままじゃ、コンパイルできませんでした。
自分が変えた内容は、下記のとおりです。
target1とし、targetと分けることによって、安定しました。
記
for (char i = 0; i < 64; i++)target += adc[i];
target1 = target / 511.5;__delay_us(250);//PWMサンプリング間隔
if (target1 > AD5220_val) {
AD5220_up();
} else if (target1 < AD5220_val) {
>for (char i = 0; i < 64; i++){
adc[i] = adconv();
target += adc[i];
}
有難うございます。
この方が見やすいですね、今、このようにしました。
ついでに、
for文について解釈を教えて下さい。
キットで遊ぼうより抜粋 ↓
*******************
初期化式の値が変化式によって変化した後、継続条件式が真ならば処理を繰り返し実行。
継続条件式が偽ならば、処理は実行されない。
******************
for文に来た時、継続条件式をすべて実施した後、やっと、for文を抜けることができるのでしょうか????
長文になりましたが、ご容赦願います。
で、
ローパスの注意点があります。
10μと22kだと、抵抗が大きすぎて、電圧が分圧される度合いが大きすぎます。
自分は、今は、75Ωにし、その分、コンデンサ10μを2個並列にしています。並列によって、コンデンサ容量は2倍になる。
続11ーPWM
TRさん,忘れてました。
プルアップしてましたね。
今日はできないのですが,
明日,モーター回して見ます。
****追記****
猛牛ロックさんおおっしゃる通りでした。
ただ,直してしまうと,きっと,ワンクロック多くなりますかね。
プルアップしてましたね。
今日はできないのですが,
明日,モーター回して見ます。
****追記****
猛牛ロックさんおおっしゃる通りでした。
ただ,直してしまうと,きっと,ワンクロック多くなりますかね。
Re: 続11ーPWM
えーと、添付図左がX9Cのものです。右がAD5220です。まず、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
maboさん、おはようございます。>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
TRさん,頭にあった構想の配線図です。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
TRさん,猛牛ロックさん,こんにちは。前掲の絵間違いありましたので,再掲します。
細かいことは,やってみないと分からないかなあ。
プログラムですが,キー判定に 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
maboさんこんばんは、頂いた写真をもとに、直感を頼りに、実験しました。
仕掛けが何とか分かりました。
短絡箇所は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さん,猛牛ロックさん,こんばんは。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
> MABOさん> モニター用に作った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
maboさんへおはようございます。
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
相変わらずdowmになっています。downです。プログラム的にはおかしな所は見つかりませんでした。
その図はデジタルポテンショとして、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);
}
- JoyfulNote v6.02 -
++ Edited by Hamel ++
Home
Item
新規投稿
アルバム
ワード検索
過去ログ
Topic
Notice
Admin
mabo
2019/06/27(Thu) 10:56
TR 

