トピック関連記事
48時間以内の記事は で表示されます
Re: 続10 PWM
> posについて、ネット検索しましたが、分かりませんでした。難しく感じました
ただの変数名です。a,b,c等と同じです。
が、一応、x9c_valのvalはvalue(値)から来ています。posもPOSITION(位置)です。
そんな感じで何となく頭に浮かんだのを付けているだけです。
> __delay_us(500);
> が無い点が気になります。
> 抵抗値変更に要する時間が有るのと無いのでは、差がでると推測します。
どのプログラムの事でしょうか?今まではどれも入れていると思うのですけど。(X9Cに関して)
ただの変数名です。a,b,c等と同じです。
が、一応、x9c_valのvalはvalue(値)から来ています。posもPOSITION(位置)です。
そんな感じで何となく頭に浮かんだのを付けているだけです。
> __delay_us(500);
> が無い点が気になります。
> 抵抗値変更に要する時間が有るのと無いのでは、差がでると推測します。
どのプログラムの事でしょうか?今まではどれも入れていると思うのですけど。(X9Cに関して)
猛牛ロック 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より先に届きました。
疲れているので,のんびり行きます。
草刈りで,少々,ばて気味です
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の初期化関数が自分的にはしっくり来ていません。
ゆっくりと考えてください。
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となって進行していました。
なので、その部分を直しました。
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ではまずいのでしょうか?
抵抗値変換に必要な時間を超えてまで待つ理由は何かあるのでしょうか?
必要以上に待つように見えてしまいますが。
それとも、解釈が違うのでしょうか。
>実際の初期化は
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でも問題は無いと思います。
でも、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;
}
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;
}
//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;
}
← ********この部分が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/
この際、自分も、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とのやり取りは
うまくいくのだろうかということです。
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ビットマイコンでは出来ない、というわけではありません。
これは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;
プログラムが変わりましたね。
迷いますね。
色々と言われていますが、良くわからないのです。
やっと、分解能という単語を調べたところですから。
ともかく、
問題アリなら、プログラムは変えます。
できたら、部分的に書き出すのではなく、
全体がこうで、内、変更箇所はこうだと言ってくれた方が良いのです。
行き違いが少なくなります。
でも、それも、手間もかかるでしょうから、お任せします。
この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を繋いで電圧を計測してください。
> 以前でのやり取りで以下の通り説明してくれました。
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全部破損したりと,
トラブル続きでした。
もうちょっとで,確認できるかと思います。
レス遅くなりました。
このところ,実家の草刈りで,時間取られています。
作業の途中で,激安の刈払機のネジがなくなったり,
で,何度か中断です。
後一日ぐらいで,終わるかなあ。
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からの速度になるように、フォトリフレクタからの実測値で合わせる。
みたいな感じの物を想像しています。
> モニター用に作った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の電源の入れ方で,
コントロールできなくなる場合があるようです。
ちょっと原因は?です。
>あれあれ、どうしちゃったんですか?
タクトスイッチ使って,アップダウンのできる基盤作成してたのですが,
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さん,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