035833
48時間以内の記事は New Mark で表示されます
ステッピングモータドライバ
ユニポーラステッピングモータドライバ&コントローラを作ろうと思っています。
まぁ、ネタとしては今更なんですけど。

最近ステッパーもバイポーラが主流ですよね。以前はユニポーラが押していたように思うのですけど。
ドライバも安いのはバイポーラのみです。

バイポーラなら、A4988、MRV8825、L6470、TB6560、TB6600と色々ドライバボード(モジュール)となっています。
一方ユニポーラは、相変わらずサンケンのSLAシリーズ位です。更にボード化はあまり見当たりません。
いや、まぁ見つけてはあるのですけど、https://www.monotaro.com/p/5630/7265/
です。価格の約1万円は社用なので良いのですけど、「出荷目安:44日」ではどうにもなりません。
SECさんの所も休業状態ですし…。

※先週、「1個動かなくなったから見てくれ!」と言われて、オリエンタルモータのステッパーを見たのですけど、
ドライバがやられているようでした。取りあえず、他の用途で用意してあったTB6560ボードで、バイポーラ接続で回して急場をしのぎました。

で、調べてみても、オリエンタルモータもユニポーラドライバは販売していません。それどころか、コントローラで使っている
SG8030まで生産中止になるそうです。
https://www.orientalmotor-shop.jp/shop/product_details_ec.action?hinmei=SG8030J-D&seriesCd=O000
※こんなのが4万もするんですよね。(*_*;

うちの会社の場合、ほぼ、定速で回すだけです。その程度なら作っちゃうか、という事で、Arduino+1602+自作ドライバボード
という感じで行こうと思っています。

で、ドライバはSLA7073か7078に決めたのですけど、回路図を見ていて思いついたのがカレントダウンです。

抵抗値の切り替えかぁ?そう言えば…

という事で、今回は、添付図の赤線部分をX9Cで2値切り替えて動かそうと思います。
※X9Cは5個200円程度で購入しました。
残念ながら私のは10kΩ(実測9.0kΩ)で、回路図の1kΩものではありませんけど、それでも、R1を22kΩにすれば30段階になりそうです。
ほぼ、0.1A毎に指定できます。
(R1を付けなくても9段階あり、それでも十分なんですけど。)

※実はもう一つMCP42010というのも安かったんで買ってあります。でも脇役としてはちょっと邪魔なんですよね。

猛牛ロック 2019/07/16(Tue) 00:17 No.1748  記事編集
Re: ステッピングモータドライバ
猛牛ロックさん,こんばんは。

レス遅くなりました。

ドライバーの自作ですか。

ちょっとうらやましいです。

お役にはとうてい立てそうにもありませんが,

以前,オリジナルマインドの

https://www.originalmind.co.jp/goods/07961

のモーターのドライバーについて,メーカーに問い合わせたことがあります。

型番等は,失念してしまったのですが,確か Yahoo ショッピング等で,

商品を紹介してもらったように記憶してます。

結局高いのでやめて,SECさんのところろの買ったのかな,
と思います。


=====
ところで,別件なのですが,ご教示お願いできますでしょうか。

4×4のキーパッドのarduinoのライブラリーながめているのですが,

今まで,C 等では,みたことのない記述がありました。

ネットでくぐっても不明で,ちょっと頭抱えてます。

// TwiKeypad::KeyToChar

int16_t TwiKeypad::ReadReg(uint8_t RegAdr)
{
if(ptw==NULL) return -1;
ptw->beginTransmission(TwiAdr);
ptw->write(RegAdr);
ptw->endTransmission(false);
ptw->requestFrom(TwiAdr,uint8_t(1));
int16_t result=-1;
while(ptw->available()) {
result=ptw->read();
} // while
return result;
} // TwiKeypad::ReadReg

ここの,「−>」はどういう意味なのでしょうか。
mabo   2019/07/18(Thu) 23:06 No.1749 記事編集
Re: ステッピングモータドライバ
71mmのステッパーですか。大きいですね。
「TRIOに接続してお使い頂けます。」となっているので、SLA7078で大丈夫なのでしょう。

このあたりは判りにくい所ですね。
NEMA23モータの大き目のものでも電流は1.5A以下の物も結構あります。
それならA4988(最大2A)やDRV8825(最大2.5A)でも、良いんじゃないか?とも思いますけど、
それらはNEMA17専用の気がします。
電流値が低いという事はその分電圧が高い、という事で、より発熱に繋がり駄目という事なのでしょうかね。
爪サイズのヒートシンクでは無く、もっと大きいのを付ければ大丈夫なのかな?

いずれにしても、ユニポーラの安いドライバはありませんね。
TRIOも3軸で49800円です。以前のクワトロは4軸で31,290円だったのに。


I2C接続4×4キーパッドですか。
これって、しなぷすさんが作ったやつですね。(中はPIC16F1503)

「->」はアロー演算子ですね。
私も、使った事はありません。

式の左辺がポインタ変数の場合はアロー演算子を使うのだと思います。
ただ、これはライブラリ側ですよね?
ユーザー側は

TwiKeypad A;

と実体を作った後は

int data=A.ReadReg(レジスタアドレス);

という形で、レジスタアドレスに入っている値を取得するんだと思います。
猛牛ロック   2019/07/19(Fri) 04:37 No.1750 記事編集
Re: ステッピングモータドライバ
猛牛ロックさん,おはようございます。

ご説明ありがとうございます。

私の一番苦手な,構造体がらみの演算子だったんですね。

アロー演算子ということで,くぐったら,

詳しい説明のサトあったので,なんとなく理解できました。


========
>I2C接続4×4キーパッドですか。
>これって、しなぷすさんが作ったやつですね。(中はPIC16F1503)

そうです。

マトリックスにダイオード使ってない安いものをamazonで,
注文して,使おうと思いました。

キーセンスのプログラム自分で作るようかなと思い,
しなぷすさんがお作りになった,PIC書き込みのプログラムと,

arduino 用のライブラリー眺めていたところです。

arduino で使えば,専用のライブラリーがあるようようですし,

I2Cの通信をするのに,wire.h をインクルードすれば使える手軽さも魅力なのですが,

無謀にも,ものたりなさ感じで,できるかどうかわかりませんが,

PICでやろうともがいでいるところです。

やりたい事はいろいろあるのですが,なかなか,進みませんね。
mabo   2019/07/19(Fri) 11:52 No.1751 記事編集
Re: ステッピングモータドライバ
基板の線を引いて、じゃあ削ろうかな!と思った矢先に問題が発生しました。

現在使っているコントローラSG8030S-Dの半互換品にしようと思っているのですけど、
SG8030S-Dの出力クロックは30000Hzまでサポートしています。
じゃあ、その位まで出せるようにしよう、と思ってちょっとcalc(エクセルみたいなもの)で、表を作ってみたのですけど、
一番長くかかる=遅い設定にすると何と45000クロックにもなる事が判明しました。
こんなになると、テーブル(配列)に保存して、使う訳にはいきません。
じゃあ、1回ごとに次の周期を計算したらどうかな?と思い、周期計算のみをUNOで計算させて、計測したのですけど、
ちょっと工夫を凝らして計算しても、一向に速くなりません。具体的には下記のコードです。

float V=100;
float Va=100;
uint32_t target=30000;
long time;
void setup() {
word cnt=1;
Serial.begin(115200);
time=millis();
while(target>V) {
cnt++;
V=V+1000000UL/Va/V;
}
time=millis()-time;
Serial.println(time);
Serial.println(cnt);
Serial.println(V);
}

実際に計測しているのは
while(target>V) {
cnt++;
V=V+1000000UL/Va/V;
}
です。次の(加速した)速度Vを出していって、30000Hzまで、何回パルスかかって、その時間は何msになるのか見ています。
その結果が
1890ms
44998回(ステップ)
30000.17[Hz]
です。1ステップあたりの計算時間が42usもかかってしまいます。
でも、30000Hzですから、その速度では周期は33.333usしかありません。
自分としては「それ以外の作業」を考えると、10us程度以下じゃないと難しいと感じました。

floatがいけないのかと思い、uint32_tにしたりして試しましたけど、誤差、時間共に悪化しました。

で、手元にあった、STM32F1ボード(BLUE PILL)でやらせた所、
352
44998
30000.17
7.82us/step
になりました。
なので、こちらで行こうと考えています。でも、3.3Vなので、1602キーパッドも使えません。
(元々シールドなので、UNOタイプのボードじゃないと意味は無いのですけど)
そして、X9Cも5V専用なので使えません。

今の所、表示器はNOKIA5110にしようと検討しています。
猛牛ロック   2019/07/22(Mon) 23:42 No.1752 記事編集
Re: ステッピングモータドライバ
猛牛ロックさん,こんばんは。

===========
猛牛ロックさんのやられているプログラム,

なんとなく理解できるのですが,細かいところは,

私の能力超えてるかななんて思います。

処理速度等のことも考えなきゃいけないようなので,

その辺,難しいんでしょうね。

遙か昔ですが,短時間で処理したいもの(ソート処理)がプログラムのなかにあったので,

その部分だけ,市販のアセンブラーのプログラム買って,

Cとリンクさせたことあります。

フロートの処理だと,やはり時間かかるんでしょうね。

===========
開発するには,遙かにarduino系(細かい分類わかりません)が便利なような気がします。

デバッカー等使わなくても,PCのモニターに書き込めるので。

PICだと,LCD使って表示するのに不具合がどこにあると,確かめるだけでも,あれこれ考えないいけないので,

無駄に時間かかると思います。



========
私には,

>なので、こちらで行こうと考えています。でも、3.3Vなので、1602キーパッドも使えません。

この,3.3Vが,ちょっとやっかいでした。PICに3.3VのLCDそのままつないで,破損させました。(汗)

これは,私のおっちょこちょい?のなせる技ですけど。(笑)

ということで,5V電源の

https://www.amazon.co.jp/gp/product/B07C2TCWFD/ref=ppx_yo_dt_b_asin_image_o00_s00?ie=UTF8&psc=1

購入しました。

購入の予定なかったのですが,

https://www.amazon.co.jp/gp/product/B079Q6X5Q6/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&psc=1

を購入して届いたのですが,なんと,LCDは別売だったのでした。(がっかりしました。これもトホホでした。)

「シェル」というのは,ケースなのでしょうかね。

◯zonは不親切です。
mabo   2019/07/24(Wed) 23:12 No.1753 記事編集
Re: ステッピングモータドライバ
PCF8574を使ったI2C-1602ですけど、あまり好きじゃないです。
表示にえらい時間を喰います。
100kHzしか出せないのに、1ピン上げるのにも8ビット送信しなければならないし、通信のプロトコル?が4ビットモードなので、
無駄が多すぎます。
多分、秋月の本来のI2C-1602と比べると3倍位は送信回数が必要なのではないでしょうか。更に速度が1/4なので、(秋月のは400kHz)
10倍以上、作業時間がかかります。

私もそのモジュールは所有していますけど、使う気にはならないですね。74HC595の方が、よりシンプルで速いと思います。まぁ1ピン増えてしまいますけど。
1602(通常サイズ)は、ほぼそのまま使っています。

LCDはケースに固定して、そのピンヘッダにマイコン基板を差し込む形で固定して…、というのがケーブルを使わずに済むので楽です。


そうそう、X9Cですけど、よく検討してみたら、BLUE PILL(STM32F1ボード)に載ってる3.3Vの電圧レギュレータって、入力は5.5V以下なんですよね。
元々UNOに9Vを入れる予定でいたのですけど、BLUE PILLは、外からは5.0Vを入れて3.3Vを出力するように設計されています。

なので、その点も方針変更で、ACアダプタ?から5Vを基板に入れて、それを利用することにしました。
かえって、カレントダウン的には良くなったかもしれません。

※私もこの間、方針が決まらないばかりに、無駄な買い物をしてしましました。

1602キーパッド 2個
9VのACアダプタ 4個
arduino uno互換品 4個
LGT8F328Pボード  数個
などです。

LGT8F328PボードはニセATMEGA328Pなのですけど、倍の32MHzまで出て、チョコチョコ高性能になっています。これにしようかとも思ったのですけど、データシートが中国語のみのようなので、今回は見送りました。

猛牛ロック   2019/07/30(Tue) 23:47 No.1754 記事編集
Re: ステッピングモータドライバ
取り敢えず、基板切削→取り付けまでしました。
まだ電気は流していません。

X9Cが見えなかったので、右下画像も入れました。BLUE PILLの下に隠れる形です。

幾つかの小さな失敗がありましたけど、今の所、おおむね順調です。
(とはいえ、電気を流したわけでは無いので、基板パターンが正しいかも未確認ですけど)

でも、問題はこれからです。
LCDのメニューを作るのが一番面倒なんですよね。
今回は初のARMマイコンなので、その点もデータシートとにらめっこです。
(日本語マニュアルはあるのですけど、実際にArduino IDEでどのように記述すればいいのか?
マイコン&レジスタの理解と、コンパイラの問題と2段階あるので大変です。)

猛牛ロック   2019/08/02(Fri) 13:47 No.1755 記事編集
Re: ステッピングモータドライバ
猛牛ロックさん,こんばんは。亀レスになって,すみません。

このところ,実家の草刈りやらなんやらで,ばてぎみで,

工作?していませんでした。

猛牛ロックさんのドライバー基盤,いいですね。

CNCで削れれば余分な配線しなくてもいいかなと思いますが,

なかなか,実行できないでいます。

私の方もやっと部材がそろってきたので,暇見てあれこれやろうかな,と思います。

キーボードですが,ダイオードとバッファプログラム等のついているしなぷすさんのと,

単なるマトリックスの中華製のものと二つ買ってしまいました。

中華製のものは,キーセンスのプログラムくまないとなので,

ちょっと面倒かなと思います。



=======

74HC595の情報もありがとうございます。

この辺,私は,無知で,表示スピードのことは,

考えずに選んでしまいました。

私の場合は,実用面もさることながら,とりあえず,試せれば満足な気持ちなれるかなと思います。

mabo   2019/08/07(Wed) 22:31 No.1756 記事編集
疑似抵抗ー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

mabo 2019/06/27(Thu) 10:56 No.1728  記事編集
Re: 疑似抵抗ー1
maboさんこんにちは。
今日は仕事です。
>この辺もよく分からないところなのですが,

no1728にある__delay_ms(1);
これが、サンプリング間隔です。
__delay_ms(1)でサンプリングをとりつつ、upとdownにも対応していますので、
テスターの動きがスムースでわないと思いました。


サンプリング回数を当初4から増やした理由は、電圧を拾いきれない感じで、電圧の幅が狭かったからです。平均なので、そうなると思いました。


後、エクセルは、帰宅後に
見させて頂きます。
TR   2019/06/27(Thu) 11:35 No.1729 記事編集
Re: 疑似抵抗ー1
maboさんこんにちは。
サンプリングはとらないと駄目という話でした。

理由は
PWM基本周波数により、信号が送られて来るからだそうです。

no1728にある__delay_ms(1);
これが、サンプリング間隔です。
__delay_ms(1)でサンプリングを

今は、マッハのPWM基本周波数を250ヘルツから実験するつもりなので250usにしています。
無論、実験なのでスタートはマッハの基本周波数を100ヘルツから様子を見ます。
TR   2019/06/27(Thu) 12:57 No.1730 記事編集
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++;
}
TR   2019/06/27(Thu) 15:14 No.1731 記事編集
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年半程度でしたけど、「初級の終わりあたり」だと自分で認識していました。

またまた、話が脱線しました。

私が作ったプログラムを改悪されるのも、それが一因でなにかおかしな事になっていくのも私にとってストレスです。
なので、

今後一切、私が作ったプログラムは改変=使わないで下さい。
猛牛ロック   2019/06/27(Thu) 17:45 No.1732 記事編集
Re: 疑似抵抗ー1
猛牛ロックさんへ

言い合いをする気はありません。

猛牛ロックさんに色々と教えて頂いて感謝しています。
でも、分からないことは分からないんですよ。
今回ご教示頂いたプログラムは、つい最近までうまく動作しなかったのです。
折角、教えて頂いたプログラムなので、内容を理解し、動作したいと思いました。
決して、改悪するつもりはありません。
上手く動作するプログラムにしたいと思っています。
悪くはとらえないで下さい。
TR   2019/06/27(Thu) 18:20 No.1733 記事編集
Re: 疑似抵抗ー1
maboさんへ

理由はどうであれ、脇で見ていて気分を害されたと思います。
自分は、もうこの場所に来ません。

というのも、誰とも仲良くしたいのですが、
多分、うまくいかないと思うからです。

これまで、色々と教えていただき感謝申し上げます。
本当に残念ですが、失礼します。
TR   2019/06/27(Thu) 18:53 No.1734 記事編集
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さんの方には原因が無いような言い方ですけど?

猛牛ロック   2019/06/27(Thu) 22:58 No.1735 記事編集
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間抵抗)

猛牛ロック   2019/06/28(Fri) 12:44 No.1736 記事編集
Re: 疑似抵抗ー1
TRさん,猛牛ロックさん,こんばんは。

猛牛ロックさん,詳しい実験結果のありがとうございます。

>つまり、A側は抵抗1つ分、存在しているようです。

これは,どうんなんでしょうかね。

仕様なのか,それとも,ワイパーの移動に使ってる半導体が,

製造時に不具合起こしたのか,ちょっと?でしょうか。

実際に使用するには,安定して動作するための条件等,いろいろ調べる必要ありですね。

トランジスタかフォットカプラーと秋月の安いロータリーエンコーダーとエンコーダーを使って,

自作のデジタルポテンショメーター作ってみようかな,

なんて思ってます。
mabo   2019/06/29(Sat) 21:38 No.1737 記事編集
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);
}

猛牛ロック   2019/07/01(Mon) 00:53 No.1738 記事編集
Re: 疑似抵抗ー1
猛牛ロックさん,こんばんは。

AD5220の細かい検証の資料ありがとうございます。

いつもながら,猛牛ロックさんのくださる資料の緻密さにびっくりしてます。

私は,おおざっぱな検証しかしてないので,なんともいえないのですが,

PWMコントローラーのボリュームと,AD5220を入れ替えて,

モーターを回したところ,

抵抗を小さくしていくと,モーターの回転は,順次上がっていくのですが,

ある場所で,上がらないで,むしろ下がるような印象を受けた箇所が何カ所かありました。

>あと、抵抗値は16ポジションごとに低いものがあります。(添付図右)
>(本来、差が8になるはずがそこだけ5になります)

もしかして,これが原因なのかなと思いました。

私の持ってるものは,100kΩのものなので,

もし同じような傾向があるのなら,単純計算の10倍で,30Ω程度でしょうか,低い物が混在してるのでしょうかね,検証の必要はあると思いますが。

この30Ω程度の抵抗が果たして,私か感じた回転数の低下にどの程度関係してるのかは,自信はありませんが・・・・・。


MACHのPIDの検証もやりたいなと思っているのですが,

グレイコードで頭抱えています。

なんとなく理解はできてきたのですが,通常のコードへの変換等,

ビット操作のオンパレードみたいなので,頭いたいです。
mabo   2019/07/01(Mon) 22:42 No.1739 記事編集
Re: 疑似抵抗ー1
MABOさんのは100kΩだったんですか。
でも、100kΩの方がデータシート的には誤差(の割合)が少なく書いてあります。
添付図では、どちらが50kΩか100kΩかは判りませんけど、10kΩよりはバラつきが少ないのが見て取れます。

私の通常8毎のはずが16ワイパーおきに5になっている、というのは添付図(グラフ)の黄線部分だと思います。
そこだけ-0.3LSB=30%程度、抵抗が低いので、8→5の変化は納得いく数字です。
よく見ると、その半分の所で、+1の9になっています。それはグラフのちょこっと山になっている部分(水色)の
せいだと思います。

まぁ、訳が分からない説明がありながらも、納得できる部分もある感じですね。

MABOさんの言っているのが16パイパー毎の事では無く、抵抗(ワイパー)が0Ωよりの全体的な動きの事でしたら、
多分、電流の流れすぎによる、電圧低下なのではないかと予想します。

猛牛ロック   2019/07/01(Mon) 23:21 No.1740 記事編集
Re: 疑似抵抗ー1
猛牛ロックさん,こんばんは。

またまた,詳しい資料ありがとうございます。

マニュアルに載っているんですよね。

グラフ見ただけで,毛嫌いして,解釈するのあきらめてました。

>多分、電流の流れすぎによる、電圧低下なのではないかと予想します。

こういうこともあるんですね。

この辺も私の理解の及ばないところかな,なんて思います。

AD5220にを使って,モーターを回したときには,

回転数等,詳しくみてないので,感覚で,回転数がさがった,

と判断してるところもあるので,回転数の表示させて,

後日,みてみようと思います。

今,部材をいろいろあたってます。
mabo   2019/07/03(Wed) 22:57 No.1741 記事編集
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接続)固定です。

猛牛ロック   2019/07/07(Sun) 09:22 No.1742 記事編集
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とかで更新すると、殆どの時間が「切り替え状態」になる可能性があります。

猛牛ロック   2019/07/07(Sun) 11:16 No.1743 記事編集
Re: 疑似抵抗ー1
猛牛ロックさん,こんばんは。

またまた細かい検証の資料ありがとうございます。

ワイパーの移動で,切り替えが追いつかない時間があるというか,これ,もしかして,意図的なのかもですね。

現在の接続を切断してから,隣の接続をする,というのではなくて,隣を接続してから,現在を切断,こんな手順なのでしょうか。

プログラム組むときは,その辺も考慮しないと,

思った結果にならないのでしょうが,私の場合,厳密な処理する訳ではないので,それほど気にならないと思います。

それから,部材のご紹介もありがとうございます。

私も,フォットリレーにしようかなと思ってましたが,

TLP3100 は,値段が高いんですよね。

それに,SMDだと,老眼の目には厳しいかななんてね。(笑)

とりあえず動けばいいかな,なんて思ってるので,

秋月の

http://akizukidenshi.com/catalog/g/gI-08029/

あたり使おうかなと思ってますが,お恥ずかしい話,

ON抵抗について,高いのか低いのか判別がつかないでいます。
mabo   2019/07/08(Mon) 00:13 No.1744 記事編集
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リレーは必要ないと思います。
猛牛ロック   2019/07/08(Mon) 16:41 No.1745 記事編集
Re: 疑似抵抗ー1
猛牛ロックさん,こんばんは。

いろいろアドバイスありがあとうございます。

本日,部材を◯月に注文しました。

送料ただいするべく,奮発してしまいました。

これで,しばらくおとなしくするようです。

エンコーダーは安いのにしようと思いましたが,

チャタリング対策等,手間取りそうなので,

マルツのこう光学式にする予定です。

ネットでくぐったのですが,102タイプの抵抗アレイは,

マルツとデジキーあたりしか取り扱いないんですよね。

マルツはもうちょっと検討してから,注文します。


それと,アナログスイッチなるICもあるのですね。

いろいろあさっていて,目にとまりました。

http://akizukidenshi.com/catalog/g/gI-05673/

アナログでも,デジタルでも高速スイッチングが可能,

とマニュアルには記載あります。

それに,低ON抵抗 50Ω とあります。

状況にもよるのでしょうが,これが高いのか,低いのか,

私にはちょっと判断できません。


いろいろあさっていて,

PIDの制御にも興味が向いてきました。

プログラムもそれほど難しくないようなので,

http://akiracing.com/2017/12/19/arduino_drone_pid/

後日,挑戦してみようかなと思います。

手始めに回転数取得のプログラムあれこれやってます。
mabo   2019/07/09(Tue) 23:25 No.1746 記事編集
Re: 疑似抵抗ー1
良いですねぇ、光学式。私はおもちゃエンコーダばっかりです。
秋月で売ってるLED付きも使いました。

アナログスイッチICは電気はあまり流せませんよ。
20mA程度まで流せますけど、流せば出力電圧は変わります。
この辺りは、マイコンの出力と同じです。
オン抵抗50Ωは9V駆動時の標準値です。
4.5V駆動だと、70Ω標準で、最大100Ωです。
で、100Ωだとしたら20mA流せば100x0.02=2Vも電圧が下降します。
なので、電圧値が重要な場合は電流を流してはいけません。


> 手始めに回転数取得のプログラムあれこれやってます。

単純なオフタイマー(7セグとリレーとロータリーエンコーダを使ったもの)で、よく使いますけど、
○○時○○分まであるので、ロータリーエンコーダといえども加速させないとなかなか目的値まで達しません。
で、早く回した時は+8/クリック位?までさせると思うのですけど、いい塩梅を見つけるのが面白い所かもしれません。
猛牛ロック   2019/07/09(Tue) 23:58 No.1747 記事編集
疑似可変抵抗
maboさんおはようございます。

デジタルポテンションに代えて、maboさんの疑似可変抵抗を制御するプログラムを始めようと思います。
宜しくお願いします。


と思いましたが、
Trはシンク駆動ですよね
駆動するもののがないから電流が流れない
最上段のTr

返事は急ぎません。


追記
ワイパと電源端子間の抵抗を計測する場合、TRを通じるようになるのでは。

TR 2019/06/20(Thu) 07:43 No.1700  記事編集
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と表記のあるものでしょうかね。

 残念ながら,秋月には,使えそうなタイプは,ないようでした。

mabo   2019/06/20(Thu) 22:49 No.1701 記事編集
Re: 疑似可変抵抗
maboさん、おはようございます。

自分も、投降した後に、フォトカプラを使った方法を思いつきました。
でも、ワイパーと電源側間の抵抗値のラインを電流が流れる形ですよね。
そういった、使い方は適当なんだろうかという疑問が残ります。

Tr内を利用しての抵抗を使って分圧するといったことを初めて考えてみたので、
疑問に感じました。
先達者の実例があればいいのですが。


後、今回の形の場合、当初からあったTrは、追加のフォトカプラがあるので
Trが2個になった形となるので、
当初のTrはいらないと思います。
このままだと、ダーリントン接続の形です。

さらに、
フォトカプラの使い方の場合、シンクでもソースでもOKなので、
右上に設けた抵抗は不要ですよ。
色々とすみません。

TR   2019/06/21(Fri) 06:20 No.1702 記事編集
Re: 疑似可変抵抗
簡単だったので、実験しました。
やはり想像していたとおりで、
Tr内を通じた場合、抵抗値が大きく変わります。
被計測抵抗値680Ωが写真の様に約0.9kになりました。



追記

maboさんは、No1681で、5220のテスト結果として

**********
ワイパー両端まで,動かすと,片側07kΩ 片側0.2kΩ程度残ります。

 それから,PIC AD5220の電源の入れ方で,

 コントロールできなくなる場合があるようです。
*******************************

この時の実験の際、PICのプログラムは、猛牛ロックさんのですか?
それとも、maboさんのNo1693ですか??
maboさんのと比べて、差があったのでしょうか??

それと、

電源の入れ方で、問題があったようですが、問題解消のために
No1693のプログラムでは、どのようにしたのでしょうか?


x9cきましたか、自分の5220は、明後日には来ると思います

TR   2019/06/21(Fri) 07:00 No.1703 記事編集
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を見てきましたが,

周辺機器の起動をハードで遅らせてる,ものは,なかったように思います。

手法的には,それほど手間かからないようなきがします。
mabo   2019/06/22(Sat) 00:16 No.1704 記事編集
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

TR   2019/06/22(Sat) 09:40 No.1705 記事編集
Re: 疑似可変抵抗
maboさんへ、5220が本日到着しました。
午後から、粘っていましたが、まったく動作しません。
プログラムは、No1671です。

テスト用プログラムがないので、使いました。
テスト方法は写真のつなぎ方です。
今回は、壊れないように2kオームの抵抗です。

TR   2019/06/22(Sat) 15:47 No.1708 記事編集
Re: 疑似可変抵抗
TRさん,猛牛ロックさん,こんばんは。

TRさん,いろいろやられていますね。


ちょっと,不明な点なのですが,

TRさんが今日,やられたのは,SECさんの基盤と切り離して,

MACHからのPWMの信号の代わりに,ボリュームで,

電圧調整して,PICに入れての実験でしたか。

それと,電圧計られたのは,入力に使ったボリュームでしょうか。

それとも,X9Cで計られたのですか。

ちょっと不明です。



今日は,昨日の草刈りの影響え疲れ切っていますので,

ボケ−ッ と,しました。



いろいろあさってたのですが,同じようなことやっている

諸兄を見つけました。

ただ,CNC等のコントロールではなく,オーディオのボリュームの調整のようです。

http://mikenekosou.blog76.fc2.com/blog-entry-140.html

この使い方は,電流制御 なんでしょうね。

初めて知りましたが,レオスタッド・モードとか言うみたいです。

プログラムがのってないので,よく分かりませんが,

この諸兄は,PICで 同時に複数のカプラーをONにして,

コントロールしてるような感じですかね。

それと,機械的なリレーと同等以上のフォットカプラーの紹介もありました。

高いです。500円前後するみたいですね。
mabo   2019/06/22(Sat) 22:14 No.1711 記事編集
Re: 疑似可変抵抗
今日の実験

実験の繋ぎ方ですね。

DC5.1V電源〜VR〜PIC(PWAM発生)〜ローパス〜PIC(0622/5220駆動プログラム)〜AD5220〜テスター

まだ、SEC基板やML4には触れていません。

ポテンションメーターは、AD5220が今日来たので、初めて使いました。
電圧測定箇所は、AD5220のワイパー〜Rl間です。
TR   2019/06/22(Sat) 22:32 No.1712 記事編集
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のコントロールしましたが,

秋月の安いエンコーダーで,やってみようかななんて,

いろいろ画策してます。

それと,自作のデジタルポテンショメーター(デジポット)に必要な部材,

まとめています。
mabo   2019/06/23(Sun) 22:01 No.1714 記事編集
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ですが、電圧を上げていく途中、
テスターを見ていると、一瞬ぐっと山が出ます。

後、残留電圧ですが、蛍光灯に反応しています。


やっぱり、安定しませんね。
TR   2019/06/24(Mon) 19:06 No.1717 記事編集
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();

とかやったらどうなのかなと思いました。


 
mabo   2019/06/24(Mon) 22:47 No.1718 記事編集
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故障かな、プログラム大丈夫かも。

TR   2019/06/25(Tue) 07:29 No.1719 記事編集
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);このように書きますが、
実際とはずれている感じがします。
実感と同じ時間にするには、どういった計算をするのでしょうか?
お願いします。

TR   2019/06/25(Tue) 10:52 No.1720 記事編集
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回ごとに,まっさらな状態で,

平均を取ることになると思います。

これを入れないと,一番古いデータの一つと,一番新しいデーターの一つを入れ替えて,

常に,平均を出すことになると思います。

どちらがいいのか分かりませんが,

個人的には,一番古いデーターと,一番新しいデーターを入れ替えて計算するのが,いいのかな,と思います。

まだ,確認してませんが,確かめてみたいと思います。



 
mabo   2019/06/25(Tue) 21:31 No.1721 記事編集
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]となるのかな。
[]内は、数字なんですね、分かりずらい!
TR   2019/06/26(Wed) 06:51 No.1722 記事編集
Re: 疑似可変抵抗
> TRさん

向こうにも書きましたけど、

OSCCON = 0b0111001; //クロック周波数を16MHzに設定

が違います。これではPICが動きません。

※間違いの入っている元レスも修正しておいた方が良いです。
コピペして使う可能性もありますから。


追記しておきます。

下の方のプログラムの幾つかは

#define _XTAL_FREQ

と実周波数部分が書かれていません。

基本的にMABOさんと同じ周波数(プログラム前半部)にした方が良いと思います。
猛牛ロック   2019/06/26(Wed) 07:38 No.1723 記事編集
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)が良い感じです。
TR   2019/06/26(Wed) 16:53 No.1724 記事編集
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: ストレスにより破壊する危険がありますので、不可です。

となっています。繋ぐ順番そして、切る順番も考慮する必要がありますね。どの程度シビアな要件なのかは判りませんけど。

猛牛ロック   2019/06/26(Wed) 17:06 No.1725 記事編集
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個追加しました。

安定して,動作するようになったんでしょうか。

ちょと,明るくなってきましたかね。

   
mabo   2019/06/26(Wed) 22:00 No.1726 記事編集
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倍になる。
TR   2019/06/27(Thu) 06:14 No.1727 記事編集
続11ーPWM
TRさん,忘れてました。

プルアップしてましたね。

今日はできないのですが,

明日,モーター回して見ます。

****追記****

 猛牛ロックさんおおっしゃる通りでした。

 ただ,直してしまうと,きっと,ワンクロック多くなりますかね。
mabo 2019/06/16(Sun) 23:17 No.1683  記事編集
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にすれば間違いないと思います。
更に、その後にワイパー部を繋ぐ、というシーケンスも必要なのかもしれません。

猛牛ロック   2019/06/17(Mon) 00:18 No.1684 記事編集
Re: 続11ーPWM
maboさん、おはようございます。

物には何でも仕掛けがありますよね。
工作室売店の専門家が言った言葉をもう一度再掲します。
工作室売店の記事 ↓
「抵抗値もばらつきがある。5kΩの物を購入しても4〜6kΩにばらつく。このばらつきは分圧の時には気にならなくなります。」
http://iizukakuromaguro.sakura.ne.jp/216_digitalPOT/216_digitalPOT.html

上記文章を見ると、
実験しないといけないんだけど、分圧して使うなら、使い物になるように読めます。
自分は、思い切って、ML4の可変抵抗を外して、抵抗を計測してみますよ。



追記
可変抵抗器ですが5kでした。
x9cも5220も該当なし。諦めます。
TR   2019/06/17(Mon) 06:59 No.1685 記事編集
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さんが気分を害されることも、多々あったでしょう。
それを承知で、指摘するのは良い状態では無いと感じています。

なので、しばらく静観させてもらう事にします。
猛牛ロック   2019/06/17(Mon) 13:04 No.1686 記事編集
Re: 続11ーPWM
プログラムを作っていただき、感謝申し上げます。
自分は、そう思っています。

猛牛ロックさんは、色々と言われていますが、自分は、多分半分も分かっていないと思います。
そう思ってください。
また、掲示板でのやり取りは、相手側に、自分が思った通りに伝わりづらいとも思います。



可変抵抗器換装の件ですが、ついていたものは5kなんですよ、ML4にくっついている状態だと1kでした。
多分何かの原因があると思います。
そこで、10kの可変抵抗器をつけたら、弊害や故障につながることが気になったので、
やめようかと考えました。
そういった心配が100%ないなら、続けて行こうかと思います。

それから、x9cは壊れていて、電圧などは計測できな状態で来ていましたよ。



***********
maboさんへ、
デジタルポテンションの方は、拙い自分ですが、一緒に進む気持ちでいます。
また、できるものなら、自分も理解したいと思っていますので、引き続きよろしくお願いします。
TR   2019/06/17(Mon) 13:37 No.1687 記事編集
Re: 続11ーPWM
猛牛ロックさん,TRさん,こんばんは。

猛牛ロックさん,16F88の件はご提案ありがとうございます。

私も,そろそろかな,なんて思いますが,HP上には,88の情報まだ,あるようなので,ちょと考えるんですが,

潮時ですね。

代替えですが,性能もさることながら,値段も大きいですね。
ちなみに秋月では,88は,270円でした。

値段考えると,一番安い,16F1827あたりかななんて思います。


TRさん,今晩,PWMコントローラーのボリュームを,
AD5220に置き換えて,モーター回してみました。

結論から言うと,モーターをコントロールすることは,
可能でした。

ただ,実際使うとなると,猛牛ロックさんがおっしゃったように,シーケンスをいろいろ考えるようでしょうね。

いろいろやってみて,手強い感じしてます。

おかしな動作が,いくつかありました。

一番端のポジションから,一つずワイパーを動かして行きました。

本来なら,回転数は,ワイパーを一定の方向に動かすにつれて,
上がる動作の傾向,あるいは,下がる動作の傾向を続けるはずですが,

他のポジションでは,回転数が下がるのに,ある特定のポジションでは,
回転数が上がる,次のポジションでは,また下がる,という現象がみられました。

何回か実験して,毎回同じ場所でおきますので,

プログラムの問題よりはハードの特性のような気がしますが,

キー判定で割り込み使ってますので,割り込みの影響もあるのか,

この辺はちょっとわかりません。

これ,抵抗値の誤差と同じで,ワイパーの動作に使ってる,
FET?トランジスタ?ダイオード?の特性の違いなのかなと
思いました。


それと,実際にモーターを回すと,ノイズが出てくるのか,

AD5220の電源を入れてから,モーターの電源いれると,

誤動作が多い感じです。

モーター電源ON→AD5220 ON→PIC ON

の順番の方がいいようです。

もうちょっといじって見ます。
mabo   2019/06/18(Tue) 00:08 No.1688 記事編集
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にそれらしき写真が見えます!!!

TR   2019/06/18(Tue) 05:57 No.1689 記事編集
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とは接続していません。
mabo   2019/06/18(Tue) 11:17 No.1690 記事編集
Re: 続11ーPWM
TRさん,頭にあった構想の配線図です。

X9C や AD5220を パクっただけです。



このデコーダIC(秋月)を使うと3本の線で,8個のトランジスター等のコントロールができるようです。

複数個つかって,コントロールするには,4本の線が必要に
なりますが,

18ピンか20ピンのPICを使うと,3個のデコーダコントロールできますので,

24個の抵抗を操作できそうです。

ただ,使う物の電気的な特性等について,知識が,かなり少ない状態ですので,

実験でのトライアンドエラーになるかなあ,と思います。

***追記です。****
よく分からないのですが,個人的には,5kΩのところに,
10kΩの抵抗使っても大きな危険はないような気がしてます。
この逆だと,ちょっと怖い感じです。

mabo   2019/06/18(Tue) 11:31 No.1691 記事編集
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のゲートとつながっているのか?
TR   2019/06/18(Tue) 13:44 No.1692 記事編集
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;
}

mabo   2019/06/18(Tue) 14:35 No.1693 記事編集
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)も引き続き検討してみます。

TR   2019/06/18(Tue) 21:25 No.1694 記事編集
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ピン位かなと思います。

または,もっとコントロールしたいのであれば,
足の多いのでしょうね。

***追記***
プログラムの方は,あまり細かくみないでください。
とりあえず動いたというもので,
細かいこと猛牛ロックさんのようにはかんがえていません。
細部にこだわると,多分,初期化の処理の後で,
割り込みの許可でしょうね。

mabo   2019/06/18(Tue) 22:33 No.1695 記事編集
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にする場合もでてくるので,

了解です。
サンキュウデス。
TR   2019/06/18(Tue) 23:01 No.1696 記事編集
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
TR   2019/06/19(Wed) 08:05 No.1697 記事編集
Re: 続11ーPWM
TRさん,猛牛ロックさん,こんにちは。


>5220は、うまく回っていますが、
>ローパスフィルターを使っていますか?

いえ,外部のPWMの信号はいれてないので,ローパスフィルターは,使ってません。

中華製PWMコントローラーのボリュームを,AD5220に置き換えただけです。

 PIC→→AD5220→→中華製コントローラ→→モーター

の配置です。

私が掲載した,写真ですが,ワイパーの部分に,抵抗入れておいた方がいいかもですね。

一番端に移動させたとき,短絡することになるので,
抵抗入れておいた方が安全かもですね。

TRさん,モノタロウ,いい値段しますね。

約,倍ぐらいかなあ。


>1秒以内に5220を動作せせるプログラムは、__delay_ms(500);__delay_ms(500);
>この2行で操作しているのでしょうか?

一応,そのつもりで,念のため2カ所にdelay_msいれました。

きいているかどうかは?ですけど。
mabo   2019/06/19(Wed) 12:15 No.1698 記事編集
Re: 続10 PWM
> posについて、ネット検索しましたが、分かりませんでした。難しく感じました

ただの変数名です。a,b,c等と同じです。
が、一応、x9c_valのvalはvalue(値)から来ています。posもPOSITION(位置)です。
そんな感じで何となく頭に浮かんだのを付けているだけです。

> __delay_us(500);
> が無い点が気になります。
> 抵抗値変更に要する時間が有るのと無いのでは、差がでると推測します。

どのプログラムの事でしょうか?今まではどれも入れていると思うのですけど。(X9Cに関して)
猛牛ロック 2019/06/13(Thu) 17:25 No.1662  記事編集
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);
}
}
TR   2019/06/13(Thu) 18:31 No.1663 記事編集
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より先に届きました。

疲れているので,のんびり行きます。
mabo   2019/06/13(Thu) 22:07 No.1664 記事編集
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の初期化関数が自分的にはしっくり来ていません。
ゆっくりと考えてください。
TR   2019/06/13(Thu) 22:23 No.1665 記事編集
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となって進行していました。
なので、その部分を直しました。
猛牛ロック   2019/06/13(Thu) 22:32 No.1666 記事編集
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ではまずいのでしょうか?
抵抗値変換に必要な時間を超えてまで待つ理由は何かあるのでしょうか?
必要以上に待つように見えてしまいますが。
それとも、解釈が違うのでしょうか。
TR   2019/06/14(Fri) 05:41 No.1668 記事編集
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でも問題は無いと思います。
猛牛ロック   2019/06/14(Fri) 06:52 No.1669 記事編集
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到着ということで、ゆっくりでいいですから、結果をご披露してください。
TR   2019/06/14(Fri) 07:58 No.1670 記事編集
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;
}
TR   2019/06/14(Fri) 13:39 No.1671 記事編集
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;
}
TR   2019/06/14(Fri) 13:43 No.1672 記事編集
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;
}
TR   2019/06/14(Fri) 17:14 No.1673 記事編集
Re: 続10 PWM
maboさん、おはようございます。

この際、自分も、AD5220を購入しようかと思います。
購入先は、RSでしょうか?
https://jp.rs-online.com/web/
TR   2019/06/15(Sat) 05:55 No.1674 記事編集
Re: 続10 PWM
maboさん、続けて失礼します。

AD5220です。
No1650で、
>あと、このデバイスは7ビットなので、
× target /=327.4;
○ target=target>>8;
です。


とあります。
自分としては、分解能を調べると、
少しわかったような。

今回の例で具体的に気になる点は、
8ビットのPICが計算した値で、7ビットの受信機であるAD5220とのやり取りは
うまくいくのだろうかということです。
TR   2019/06/15(Sat) 09:35 No.1675 記事編集
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ビットマイコンでは出来ない、というわけではありません。
猛牛ロック   2019/06/15(Sat) 10:45 No.1676 記事編集
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;

プログラムが変わりましたね。
迷いますね。
色々と言われていますが、良くわからないのです。
やっと、分解能という単語を調べたところですから。
ともかく、
問題アリなら、プログラムは変えます。
できたら、部分的に書き出すのではなく、
全体がこうで、内、変更箇所はこうだと言ってくれた方が良いのです。
行き違いが少なくなります。
でも、それも、手間もかかるでしょうから、お任せします。
TR   2019/06/15(Sat) 11:15 No.1677 記事編集
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を繋いで電圧を計測してください。
猛牛ロック   2019/06/15(Sat) 11:43 No.1678 記事編集
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全部破損したりと,

トラブル続きでした。

もうちょっとで,確認できるかと思います。
mabo   2019/06/15(Sat) 22:11 No.1679 記事編集
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からの速度になるように、フォトリフレクタからの実測値で合わせる。

みたいな感じの物を想像しています。

猛牛ロック   2019/06/16(Sun) 13:27 No.1680 記事編集
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の電源の入れ方で,

 コントロールできなくなる場合があるようです。

 ちょっと原因は?です。
mabo   2019/06/16(Sun) 21:23 No.1681 記事編集
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   2019/06/16(Sun) 22:15 No.1682 記事編集

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