トピック関連記事
48時間以内の記事は New Mark で表示されます
続9 PWM
maboさん

我がx9cが壊れて、ad5220見ました。
AD5220の方が出力10ma
使い易いかな。

ただ、プログラム変更に
必要な時間を読み取れませ。
分かりますか?
TR 2019/06/11(Tue) 16:34 No.1641
Re: 続9 PWM
maboさん、今晩は、
続けて失礼します。
AD5220用の初期設定関数ですが、
2行目のカッコ内は、データシートのTCLの25nsとなり
4行目のカッコ内は、分からない、、。

写真は、左ページがx9cで、右ページがAD5220です。

初期設定関数
1 inc = 0;
2 __delay_us(1);
3 inc = 1;
4 __delay_us(500);

TR   2019/06/11(Tue) 19:49 No.1642
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段階のコントロールができるものが可能のような気がします。
 
mabo   2019/06/11(Tue) 22:46 No.1643
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クラスの遅れはあるでしょうけど)
猛牛ロック   2019/06/12(Wed) 02:33 No.1644
Re: 続9 PWM
猛牛ロックさん,TRさん,おはようございます。



猛牛ロックさん,詳しい解説ありがとうございます。

いつもながら,勉強になります。

ところで,一つ教えていただきたいのですが,

電圧参照と電流調整の見分け方ですが,

ボリュームを外した状態で,3本の線の2本を選んで,

抵抗を計って,抵抗0になる組み合わせがあるものは,

電流調整の方だた考えていいのでしょうか。

また,こんな調べ方して,回路等に,悪影響はないのでしょうか。

それと,もし,電圧参照の回路でしたら,アースの線と,

ワイパーの線を使って,外部からかける電圧を変更することで,

コントロールできるのでしょうか。



今日は,これから,実家の畑の草刈りです。

ああ,です。
mabo   2019/06/12(Wed) 07:37 No.1645
Re: 続9 PWM
maboさんへ
おはようございます。

AD5220用プログラムの件、すみませんでした。



>それから,X9C破損しましたか。

原因は,過電流?静電気?



x9cのつなぎ方をよく知りませんでした。
最初は、写真の右側半分の左で実験していたら、動作していましたが、突然不動となりました。
LEDとx9cを並列に繋いだ感じです。
この使い方で、故障前は、LED15mA流れていました。
x9cのPower rating の表記は、10mAといなっていますが、これは、x9cに流れる上限電流だと思うんですよね、
並列接続で、分圧されて使っていた状態で、x9cにどれほど電流が流れていたかは、
測ったような測らなかったような、記憶があいまいです。


故障後は、合成写真右半分の右で繋いでいます。
可変抵抗としての機能はだめですが、一定の明るさで点灯はしています。
つまり調整が利きません。

原因は、繋ぎ方が悪かったのでしょうか?





>PIC(18ピン)→→エンコーダー→→トランジスタアレイ→→抵抗アレイ

の組み合わせて,32個程度のトランジスタコントロールできますので,


こういった方法もあるんですね!!
よくわかりませんが、行けそうですね(^^♪

TR   2019/06/12(Wed) 07:47 No.1646
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);

}

TR   2019/06/12(Wed) 08:45 No.1647
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ループでも、動かすのは同じことです。

あと、その変更後のプログラムでは駄目です。
適切な時間を取っていません。
猛牛ロック   2019/06/12(Wed) 12:43 No.1648
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);
}

TR   2019/06/12(Wed) 14:41 No.1649
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;
です。
猛牛ロック   2019/06/12(Wed) 15:40 No.1650
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;
}

TR   2019/06/12(Wed) 17:02 No.1651
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の抵抗部の先は何も接続しないで計測して下さい。、

猛牛ロック   2019/06/12(Wed) 17:57 No.1652
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空ける
}
TR   2019/06/12(Wed) 18:15 No.1653
Re: 続9 PWM
そうです。X9C用のプログラムです。

> 抵抗値変更に必要な時間、100〜500μsの時間関数を入れるのでは?

ほんの10行ちょっとのプログラムです。
その中に
__delay_us(500);
が2回も書いてあるのに何でそれが目に入らないのか不思議です。
既に書いてあります。

追記です。
御免なさい誤解したようです。
そのx9c_up関数の事ですね。

付ければ無駄な時間です。
その間にADCの取得や計算、etcをすれば、自然に経過するだろう、という考えて付けていません。
ADCの間隔を優先させる考えです。
そこで付けてしまうと、ADCの間隔がまばらになってしまいます。
猛牛ロック   2019/06/12(Wed) 22:54 No.1654
Re: 続9 PWM
猛牛ロックさんおはようございます。

>ADCの間隔を優先させる考えです。
そこで付けてしまうと、ADCの間隔がまばらになってしまいます。


色々とお聴きしてよかったです。
有難うございます。

新めてローパスフィルターも考えてみようかと思いました。

ML4についている可変抵抗なんですが、ML4についた状態で、抵抗値を計測したら、1kΩでした。
MD5220の方が性能が良いので、MD5220にしたかったが、1kΩがないようです。
まいりました〜。
TR   2019/06/13(Thu) 07:02 No.1655
Re: 続9 PWM
可変抵抗の抵抗値は、まずは、記載が無いかを確認して下さい。
多くのものは103Bのような表示があると思います。
また、どのクラス(何Wモノ)のものを使っているのか、とかも参考になります。


もし記載がなければ外して計測です。
それは添付図左のように、接続されている何かとの合成抵抗になるからです。
その何かの抵抗値が圧倒的に高い場合のみ、正確な抵抗値が判ります。

また、添付図右のように配線されている場合も多いです。(MABOさんもこの配線のようです)
この場合は左の固定端子から可動端子の抵抗値を計測している事になります。
(更に並列回路になっています)

猛牛ロック   2019/06/13(Thu) 09:42 No.1656
Re: 続9 PWM
MD5220用プログラムですが、初期化がおかしいと思いますが。どうだろうか
TR   2019/06/13(Thu) 11:24 No.1657
Re: 続9 PWM
> MD5220用プログラムですが、初期化がおかしいと思いますが。

どの点をみて、そう思うのでしょうか? No.1651ですよね?
私も完全では無い、と思ってはいますけど、「おかしい」と思うのなら、私の考えている部分では無いような気がします。
猛牛ロック   2019/06/13(Thu) 14:21 No.1658
Re: 続9 PWM
MD5220の初期化関数ですが、最後の}の前に、MD5220_val=0;
が抜けていると思います。
 ただ、電源ONと共に、抵抗値ポジションが64になるという事が条件です。
TR   2019/06/13(Thu) 14:46 No.1659
Re: 続9 PWM
あぁ、その通りですね。

で、MD5220関数の最後の行に
MD5220_val=pos;
の一行を入れておいて下さい。
※指定した位置に移動した後に、その位置(変数)も変更しておく
猛牛ロック   2019/06/13(Thu) 15:10 No.1660
Re: 続9 PWM
posについて、ネット検索しましたが、分かりませんでした。難しく感じました。

まだ、実験前で、大きな事は言えません。ご容赦願います。

No1652のx9cテスト用プログラム(下記一部抜粋、気になる点のみ)は、実験していませんが、

>に変えてGND-Vw間を計測して下さい。0〜5Vまで変化する筈です。

同感です。
ただ、運転用のx9c用プログラムは、
__delay_us(500);
が無い点が気になります。
抵抗値変更に要する時間が有るのと無いのでは、差がでると推測します。
   記
x9c_down();
__delay_us(500);
}
TR   2019/06/13(Thu) 15:46 No.1661

処理 記事No 暗証キー

- JoyfulNote v6.02 -
++ Edited by Hamel ++