トピック関連記事
48時間以内の記事は
で表示されます

疑似可変抵抗

デジタルポテンションに代えて、maboさんの疑似可変抵抗を制御するプログラムを始めようと思います。
宜しくお願いします。
と思いましたが、
Trはシンク駆動ですよね
駆動するもののがないから電流が流れない
最上段のTr
返事は急ぎません。
追記
ワイパと電源端子間の抵抗を計測する場合、TRを通じるようになるのでは。


Re: 疑似可変抵抗

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: 疑似可変抵抗

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

>いろいろやってみて,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: 疑似可変抵抗

午後から、粘っていましたが、まったく動作しません。
プログラムは、No1671です。
テスト用プログラムがないので、使いました。
テスト方法は写真のつなぎ方です。
今回は、壊れないように2kオームの抵抗です。


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: 疑似可変抵抗

いつもレスありがとうございます。
>それと,お使いの部プログラムは,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: 疑似可変抵抗

先程、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: 疑似可変抵抗

添付図は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倍になる。

