趣味を楽しむ Enjoy your hobby
Share my hobby experience
| ホーム |
2016-05-28 17:50 |
カテゴリ:PIC応用回路
現在の仕様は、SWでサーボを決まった角度に振る、いわゆるON・OFFの制御です。
できれば、模型の仕様によっては、VRを操作してRCサーボの動きをVRに比例的に動作させたい場合もあるかと思い、検討してみました。
ミッドレンジのPICの16F876には、AD変換機能複数CH分が内蔵されています。
今回は、PINの数の制限もあるので、RA0ポートに備わっている、AN0のCHを一つ使用することにしました。
まずは、動作状況をご覧ください。
(注)一番上のLEDは、AD変換にRA0を使いましたので、点灯しません。
さて、AD変換を利用する方法は、それほど難しくありません。
手順的には
割り込み処理を使用しない場合
1)使用するポート(今回はRA0)を入力モードに設定する。
2)A/Dモジュールの構成を設定 (初期化処理)
アナログポート、基準電圧ポート、デジタルポートを構成 ADCON1/PCFG0-3
3)A/D変換クロックを選択 ADCON0/ADCS0-1
4)A/DモジュールをON状態にする ADCON0/ADON
5)入力チャネル指定(今回はRA0)
6)A/D入力ポートを選択 ADCON0/CHS0-2
7)サンプル/ホールド・コンデンサ充電時間確保として、入力取得時間経過を待つ(20マイクロ秒)
8)変換開始を指示 変換開始ビットを設定 ADCON0/GO=1
9)変換終了確認
変換開始ビットがクリアされるのを周期的にチェックする ADCON0/GO=0?
10)変換結果読み込み
変換結果レジスタを読み込む ADRESH,ADRESL
11)次の変換のために(5)から必要に応じて実行
文書にすると長いようですが、実際は簡単です。
//---------------------------------------------
// PICのPORT設定の初期化 AD変換RA0ポートに設定
//---------------------------------------------
//PICのポート設定
ADCON0 = 0b10000001; //アナログ使用AD0
//ADはRA0 結果はADRESHに左寄せ8ビット
ADCON1 = 0b00001110; //For A/D0 & degital I/O
TRISA = 0b00000001; // A/D変換はRA0で行うのでRA0を入力に設定
および
//-------------------------------------------------------------------
// RA0のchでAD変換を実行し結果をservoに代入する
// AD変換結果は0-256となるので、250以上は250として処理
//-------------------------------------------------------------------
void ad_conv(void) {
ADCON0 = 0b10000001; // AD変換準備RA0チャンネル
__delay_us(20); // 20usecの準備待ち
GO = 1; // AD変換開始
while (GO) {
// GOビットが1の間待つ(0になるまで待つ)
}
servo = ADRESH;
if (servo >= 250) servo = 250;
}
が、AD変換部分を記述したところです。
GOの変数は、AD変換の開始を指示(1にする)すると同時に、AD変換が完了(0になる)した合図にもなっています。
また、サーボの処理の部分を一部変更します。
//------------------------------------------------------------------
// TMR0に割り込み時間をセットして、サーボ信号出力をONに
// 660マイクロ秒をDelay関数で待って、
// TMR0に時間をセットして割り込み処理を許可するが、そのまま割り込み
// 発生をLOOPで待ち、割り込み検出後に、ポートをOFFにして次の処理にすすむ
//------------------------------------------------------------------
void sv_on(void) {
//------- 変更分 -------------------------------------------
// target = parameter[portcnt][2]; //サーボ設定値を読み取り(値=0-255)
//
// if (target != current) {
// if (target <= current) current = current - step; //目標値が現在値よりちいさければstepを減算
// else current = current + step; //そうでなければ加算
// if (current <= 0) current = 0; //下限値チェック
// if (current >= 250) current = 250; //上限値チェック
// }
// servo = current; //値(0-255)をservoに渡す
//--------ここまで--------------------------------------------
ad_conv(); // AD変換実行。結果はservoに格納
port_off(); //サーボ接続ポートをON(負論理)
__delay_us(660); //サーボ制御パルスの最初の基本部分750マイクロ秒をここで指定する
TMR0 = servo;
T0IF = 0; // TMR0 割り込みフラッグクリア
T0IE = 1; // タイマー割り込み解除
while (T0IF == 0) {
// TMR0割り込みが発生するまで待つ
}
}
なお、SW入力部分は使用しませんから、今回はコメントアウトしていきます
//---------------------------------------------
// サーボの制御はAD変換で行うのでSWは使用しない
//---------------------------------------------
// if (sw0 == 0)parameter[12][2] = 0; //SWがON(0)ならサーボパラメータを20に
// else {
// parameter[12][2] = 250; //そうでなければ、250にセット
// }
また、RA0はLEDには使用しませんので、メインのLOOP部分は
//-----------------------------------------------------------
// 配列の設定データにしたがって、LEDを接続したポートをON/OFFする
//-----------------------------------------------------------
// ADにRA0を使用するためportcntは、1から13とする
//-----------------------------------------------------------
for (portcnt = 1; portcnt <= 13; portcnt++) {
if (parameter[portcnt][0] == scnt) seri();
if (parameter[portcnt][0] == 0) rndm();
if (parameter[portcnt][0] == 13) regular();
if (parameter[portcnt][0] == 14) port_pwm();
if (parameter[portcnt][0] == 15) sv_on();
}
このように修正します。
最終的なプログラムをここに置きます。
v030_AD.txt
御参考になれば幸いです。
できれば、模型の仕様によっては、VRを操作してRCサーボの動きをVRに比例的に動作させたい場合もあるかと思い、検討してみました。
ミッドレンジのPICの16F876には、AD変換機能複数CH分が内蔵されています。
今回は、PINの数の制限もあるので、RA0ポートに備わっている、AN0のCHを一つ使用することにしました。
まずは、動作状況をご覧ください。
(注)一番上のLEDは、AD変換にRA0を使いましたので、点灯しません。
さて、AD変換を利用する方法は、それほど難しくありません。
手順的には
割り込み処理を使用しない場合
1)使用するポート(今回はRA0)を入力モードに設定する。
2)A/Dモジュールの構成を設定 (初期化処理)
アナログポート、基準電圧ポート、デジタルポートを構成 ADCON1/PCFG0-3
3)A/D変換クロックを選択 ADCON0/ADCS0-1
4)A/DモジュールをON状態にする ADCON0/ADON
5)入力チャネル指定(今回はRA0)
6)A/D入力ポートを選択 ADCON0/CHS0-2
7)サンプル/ホールド・コンデンサ充電時間確保として、入力取得時間経過を待つ(20マイクロ秒)
8)変換開始を指示 変換開始ビットを設定 ADCON0/GO=1
9)変換終了確認
変換開始ビットがクリアされるのを周期的にチェックする ADCON0/GO=0?
10)変換結果読み込み
変換結果レジスタを読み込む ADRESH,ADRESL
11)次の変換のために(5)から必要に応じて実行
文書にすると長いようですが、実際は簡単です。
//---------------------------------------------
// PICのPORT設定の初期化 AD変換RA0ポートに設定
//---------------------------------------------
//PICのポート設定
ADCON0 = 0b10000001; //アナログ使用AD0
//ADはRA0 結果はADRESHに左寄せ8ビット
ADCON1 = 0b00001110; //For A/D0 & degital I/O
TRISA = 0b00000001; // A/D変換はRA0で行うのでRA0を入力に設定
および
//-------------------------------------------------------------------
// RA0のchでAD変換を実行し結果をservoに代入する
// AD変換結果は0-256となるので、250以上は250として処理
//-------------------------------------------------------------------
void ad_conv(void) {
ADCON0 = 0b10000001; // AD変換準備RA0チャンネル
__delay_us(20); // 20usecの準備待ち
GO = 1; // AD変換開始
while (GO) {
// GOビットが1の間待つ(0になるまで待つ)
}
servo = ADRESH;
if (servo >= 250) servo = 250;
}
が、AD変換部分を記述したところです。
GOの変数は、AD変換の開始を指示(1にする)すると同時に、AD変換が完了(0になる)した合図にもなっています。
また、サーボの処理の部分を一部変更します。
//------------------------------------------------------------------
// TMR0に割り込み時間をセットして、サーボ信号出力をONに
// 660マイクロ秒をDelay関数で待って、
// TMR0に時間をセットして割り込み処理を許可するが、そのまま割り込み
// 発生をLOOPで待ち、割り込み検出後に、ポートをOFFにして次の処理にすすむ
//------------------------------------------------------------------
void sv_on(void) {
//------- 変更分 -------------------------------------------
// target = parameter[portcnt][2]; //サーボ設定値を読み取り(値=0-255)
//
// if (target != current) {
// if (target <= current) current = current - step; //目標値が現在値よりちいさければstepを減算
// else current = current + step; //そうでなければ加算
// if (current <= 0) current = 0; //下限値チェック
// if (current >= 250) current = 250; //上限値チェック
// }
// servo = current; //値(0-255)をservoに渡す
//--------ここまで--------------------------------------------
ad_conv(); // AD変換実行。結果はservoに格納
port_off(); //サーボ接続ポートをON(負論理)
__delay_us(660); //サーボ制御パルスの最初の基本部分750マイクロ秒をここで指定する
TMR0 = servo;
T0IF = 0; // TMR0 割り込みフラッグクリア
T0IE = 1; // タイマー割り込み解除
while (T0IF == 0) {
// TMR0割り込みが発生するまで待つ
}
}
なお、SW入力部分は使用しませんから、今回はコメントアウトしていきます
//---------------------------------------------
// サーボの制御はAD変換で行うのでSWは使用しない
//---------------------------------------------
// if (sw0 == 0)parameter[12][2] = 0; //SWがON(0)ならサーボパラメータを20に
// else {
// parameter[12][2] = 250; //そうでなければ、250にセット
// }
また、RA0はLEDには使用しませんので、メインのLOOP部分は
//-----------------------------------------------------------
// 配列の設定データにしたがって、LEDを接続したポートをON/OFFする
//-----------------------------------------------------------
// ADにRA0を使用するためportcntは、1から13とする
//-----------------------------------------------------------
for (portcnt = 1; portcnt <= 13; portcnt++) {
if (parameter[portcnt][0] == scnt) seri();
if (parameter[portcnt][0] == 0) rndm();
if (parameter[portcnt][0] == 13) regular();
if (parameter[portcnt][0] == 14) port_pwm();
if (parameter[portcnt][0] == 15) sv_on();
}
このように修正します。
最終的なプログラムをここに置きます。
v030_AD.txt
御参考になれば幸いです。
- 関連記事
-
- お手軽、小物電子工作 (2016/06/03)
- 電子工作:PICによる汎用LED制御器(その後4:AD変換の利用方法) (2016/05/30)
- 電子工作:PICによる汎用LED制御器(その後3) (2016/05/28)
- 電子工作:PICによる汎用LED制御器(追加検討その2) (2016/05/27)
- 電子工作:PICによる汎用LED制御器(追加検討) (2016/05/25)
6jiro
こんばんは!
またまたプログラムが進化していますね。
今回はAD変換を使ってつまみに合わせてサーボが動くとは・・・・。こりゃまた色々な製作物に使えそうですね!
今回のプログラム正直なところAD変換の方法自体がわかっていないです^^;GOというのはあらかじめ決められた変数なんですかね?そこ以降のプログラムの変更部分は理解できるのですが。まだまだ勉強しないといけないことばかりでなかなか大変です^^;
ちなみにあのボリュームは何Ωのものを使用されているのですか?早速取り寄せてトライしてみたいと思います。
またまたプログラムが進化していますね。
今回はAD変換を使ってつまみに合わせてサーボが動くとは・・・・。こりゃまた色々な製作物に使えそうですね!
今回のプログラム正直なところAD変換の方法自体がわかっていないです^^;GOというのはあらかじめ決められた変数なんですかね?そこ以降のプログラムの変更部分は理解できるのですが。まだまだ勉強しないといけないことばかりでなかなか大変です^^;
ちなみにあのボリュームは何Ωのものを使用されているのですか?早速取り寄せてトライしてみたいと思います。
2016-05-29 21:52 URL [ 編集 ]
yangmin
うぉ~!
AD変換でサーボコントロールまで!?
これはサーボ操作ができて、更に楽しくなりますね!
パーツ注文早まったかなぁ(笑)
ボリューム抵抗は何Ωを使っていらっしゃいますか?
10KΩでも大丈夫でしょうか?
AD変換でサーボコントロールまで!?
これはサーボ操作ができて、更に楽しくなりますね!
パーツ注文早まったかなぁ(笑)
ボリューム抵抗は何Ωを使っていらっしゃいますか?
10KΩでも大丈夫でしょうか?
2016-05-29 22:45 URL [ 編集 ]
Re: タイトルなし
Vivid
6jiroさん、こんばんは!
いつもありがとうございます。
>GOというのはあらかじめ決められた変数なんですかね?そこ以降のプログラムの変更部分は理解できるのですが。まだまだ勉強しないといけないことばかりでなかなか大変です^^;
==>いつも端折った説明ばかりで、分かりづらくて申し訳ありません。
次回のブログで、もう少し簡単で分かりやすい説明をさせていただこうと思います。
> ちなみにあのボリュームは何Ωのものを使用されているのですか?早速取り寄せてトライしてみたいと思います。
==>私は、手持ちの10KΩのVRを使用して、抵抗の両端をGNDと5V電源に接続し、可変抵抗部の端子をアナログポート(AN0)につなぎました。
PICのマニュアルには、「アナログ信号源の推奨インピーダンスは10kΩ 以下です」とありますので、大丈夫かと思いますが、たとえば100KΩを使用しても、0V(GND)付近の精度が低下するくらいで、実験的に使用するには問題ないと思うのですが。
アナログ回路の詳しいことは分かりませんが、このAD変換は、毎回の計測時に入力電流を内蔵の小さなコンデンサーに蓄えて、それを放電させる時間を計測していると思いますので、AD変換に必要な手順があるのだと思います。
いつもありがとうございます。
>GOというのはあらかじめ決められた変数なんですかね?そこ以降のプログラムの変更部分は理解できるのですが。まだまだ勉強しないといけないことばかりでなかなか大変です^^;
==>いつも端折った説明ばかりで、分かりづらくて申し訳ありません。
次回のブログで、もう少し簡単で分かりやすい説明をさせていただこうと思います。
> ちなみにあのボリュームは何Ωのものを使用されているのですか?早速取り寄せてトライしてみたいと思います。
==>私は、手持ちの10KΩのVRを使用して、抵抗の両端をGNDと5V電源に接続し、可変抵抗部の端子をアナログポート(AN0)につなぎました。
PICのマニュアルには、「アナログ信号源の推奨インピーダンスは10kΩ 以下です」とありますので、大丈夫かと思いますが、たとえば100KΩを使用しても、0V(GND)付近の精度が低下するくらいで、実験的に使用するには問題ないと思うのですが。
アナログ回路の詳しいことは分かりませんが、このAD変換は、毎回の計測時に入力電流を内蔵の小さなコンデンサーに蓄えて、それを放電させる時間を計測していると思いますので、AD変換に必要な手順があるのだと思います。
2016-05-29 23:41 URL [ 編集 ]
Re: タイトルなし
Vivid
Yangminさん、こんばんは!
いつもありがとうございます。
つまみを廻して、模型の動きが変わると楽しいかと想像しています。
私が使用したVRは10KΩです。
GNDと5V電源に両端をつないで、中央の可変抵抗部分をPICの穴六端子に入れました。
是非、トライしてみてください!
いつもありがとうございます。
つまみを廻して、模型の動きが変わると楽しいかと想像しています。
私が使用したVRは10KΩです。
GNDと5V電源に両端をつないで、中央の可変抵抗部分をPICの穴六端子に入れました。
是非、トライしてみてください!
2016-05-29 23:45 URL [ 編集 ]
yangmin
おはようございます。
早速のご回答ありがとうございました。
PICのマニュアルにも書いてあるんですねf(^^;)
ちゃんと読まないで聞いちゃってすみませんm(_ _;)m
早速のご回答ありがとうございました。
PICのマニュアルにも書いてあるんですねf(^^;)
ちゃんと読まないで聞いちゃってすみませんm(_ _;)m
2016-05-30 08:40 URL [ 編集 ]
6jiro
こんばんは!
いつもご丁寧な説明ありがとうございます。
ボリュームの件すみません。マニュアルもちゃんと読まないといけませんね。反省です。
早速秋月に注文しておきました^^。
GOの変数についてはフラッグになっているのはわかるのですが、変数設定のところにもないので、AD変換特有の何か変数なのかなと思いまして^^;またまたお手間をとらせてすみません。
いつもご丁寧な説明ありがとうございます。
ボリュームの件すみません。マニュアルもちゃんと読まないといけませんね。反省です。
早速秋月に注文しておきました^^。
GOの変数についてはフラッグになっているのはわかるのですが、変数設定のところにもないので、AD変換特有の何か変数なのかなと思いまして^^;またまたお手間をとらせてすみません。
2016-05-30 18:55 URL [ 編集 ]
Re: タイトルなし
Vivid
6jiroさん、こんばんは!
いえいえ、どういたしまして。
自分も調べて始めて分かりました。これまでは、適当に10Kとか100Kでしていました(笑)
変数GOの件ですが、PICの内部で定義されているレジスタの変数で、AD変換時に便利に使えるように配慮されています。
さきほど、ブログを更新して、AD変換の説明を書かせていただきました。
分かりやすいかどうか分かりませんが、よろしければそちらも御参照頂ければと思います。
宜しくお願いいたします。
いえいえ、どういたしまして。
自分も調べて始めて分かりました。これまでは、適当に10Kとか100Kでしていました(笑)
変数GOの件ですが、PICの内部で定義されているレジスタの変数で、AD変換時に便利に使えるように配慮されています。
さきほど、ブログを更新して、AD変換の説明を書かせていただきました。
分かりやすいかどうか分かりませんが、よろしければそちらも御参照頂ければと思います。
宜しくお願いいたします。
2016-05-30 20:18 URL [ 編集 ]
こんばんは!
6jiroさんのブログよりきました。
PICを始めるきっかけを頂き、できることが凄すぎて感動と驚きでいっぱいです。
模型制作がさらに楽しくなりました。
わからない事ばかりですが、これからもよろしくお願いしますm(._.)m
6jiroさんのブログよりきました。
PICを始めるきっかけを頂き、できることが凄すぎて感動と驚きでいっぱいです。
模型制作がさらに楽しくなりました。
わからない事ばかりですが、これからもよろしくお願いしますm(._.)m
Re: タイトルなし
Vivid
mitachi39さん、おはようございます!
はじめまして!
6jiroさんブログからお越し頂きありがとうございます。
PICを始められるとの事、心から歓迎いたします!!
PICは、アセンブラやXC8言語でプログラミングできますが、最初はやや、敷居が高いところがあるかもしれませんが、ワンチップ・コンピュータですから、ある意味何でも出来ます。
是非その醍醐味を味わっていただければと、応援させていただきます。
小ブログには、他にもPICの記事をご紹介していますので、お時間が有るときにでもごらん頂ければうれしいです。
なにか御質問があればいつでも大歓迎です!
今後とも宜しくお願いいたします!!
はじめまして!
6jiroさんブログからお越し頂きありがとうございます。
PICを始められるとの事、心から歓迎いたします!!
PICは、アセンブラやXC8言語でプログラミングできますが、最初はやや、敷居が高いところがあるかもしれませんが、ワンチップ・コンピュータですから、ある意味何でも出来ます。
是非その醍醐味を味わっていただければと、応援させていただきます。
小ブログには、他にもPICの記事をご紹介していますので、お時間が有るときにでもごらん頂ければうれしいです。
なにか御質問があればいつでも大歓迎です!
今後とも宜しくお願いいたします!!
2016-05-31 08:54 URL [ 編集 ]
yangmin
こんにちは。
ご無沙汰しております。
皆さん、騒動の前にリアルで交流を深めていらっしゃったようですし、その後もLineなどでやりとりされているご様子なので羨ましい限りです!
40ピンPICを使用してのシービュー号の操作パネルの電飾が凄いことになりそうで楽しみです!
そのような作業を進めていらっしゃるところへ、またもや以前の記事への書き込みで失礼します(^^;)
この記事ももう4年前の記事になるんですねぇ。
ということは皆様から"遅れること4年"になりますが、Vividさんのこのv030_AD.txtを利用させていただいて、6jiroさんのお知恵もお借りして3年前に弄ってそのままになっていたプログラムがあったのですが、今回やっとのことで、このプログラムを使用した製作に再度手を付けており、お伺いしたいことがありましてこちらに書き込みをさせていただきました。
SWのON OFFにて、プログラムでのサーボ制御orAD変換でボリューム抵抗によるサーボを切り替えられるようにしましたが、プログラム制御のサーボ稼働時はスムースに動くのですが、AD変換でボリュームを途中で止めた場合、サーボからジジジと音がして、ほんの少しだけ震える(ハンチング?)現象が出ています。
SWには10Kオームの抵抗を付けていますし、VDDとVSS間は0.01μFのコンデンサも入れています。
抵抗を1Kオームに変更したりコンデンサを大きめのものにしたり、サーボだけ別電源にしたりもしましたが現象が変わりません。
何か思い当たることがありましたらご教示していただけないでしょうか?
ご無沙汰しております。
皆さん、騒動の前にリアルで交流を深めていらっしゃったようですし、その後もLineなどでやりとりされているご様子なので羨ましい限りです!
40ピンPICを使用してのシービュー号の操作パネルの電飾が凄いことになりそうで楽しみです!
そのような作業を進めていらっしゃるところへ、またもや以前の記事への書き込みで失礼します(^^;)
この記事ももう4年前の記事になるんですねぇ。
ということは皆様から"遅れること4年"になりますが、Vividさんのこのv030_AD.txtを利用させていただいて、6jiroさんのお知恵もお借りして3年前に弄ってそのままになっていたプログラムがあったのですが、今回やっとのことで、このプログラムを使用した製作に再度手を付けており、お伺いしたいことがありましてこちらに書き込みをさせていただきました。
SWのON OFFにて、プログラムでのサーボ制御orAD変換でボリューム抵抗によるサーボを切り替えられるようにしましたが、プログラム制御のサーボ稼働時はスムースに動くのですが、AD変換でボリュームを途中で止めた場合、サーボからジジジと音がして、ほんの少しだけ震える(ハンチング?)現象が出ています。
SWには10Kオームの抵抗を付けていますし、VDDとVSS間は0.01μFのコンデンサも入れています。
抵抗を1Kオームに変更したりコンデンサを大きめのものにしたり、サーボだけ別電源にしたりもしましたが現象が変わりません。
何か思い当たることがありましたらご教示していただけないでしょうか?
2020-06-04 17:18 URL [ 編集 ]
Re: タイトルなし
Vivid
yangminさん、こんにちは
お久しぶりです!
ご無沙汰です!
こんなソフトでもお役に立てそうで、良かったです。
さてご質問の件ですが、原因は二つあると思います。
1)サーボの問題
もしデジタルサーボをご使用奈良の話ですが、最近のデジタルサーボは、精度が高くちょっとした入力制御値の変化でも
それに対応しようと動作しますので、それが、ジジジという反応として出てしまいます。
2)プログラムの問題
この制御プログラムでは、main関数のwhile()文で、永久ループを構成しています。
while()分の最後に、
__delay_ms(20)
という遅延が入っています。これは、LEDやサーボを規則正しく制御する為の時間カウンター的な
役目なのですが、サーボにパルスを与える時間が20msecが標準なのですが、
色々な処理のために、20msec以上の間隔になっていますので、これを
__delay_ms(15)
とか
__delay_ms(10)
とか変えてみてください。
ただし、ここの値を小さくすると、全体の処理速度が速くなりますので、各LEDの点滅時間のカウンター(Zno係数)を大きくしないといけません。
一度お試しください。
お久しぶりです!
ご無沙汰です!
こんなソフトでもお役に立てそうで、良かったです。
さてご質問の件ですが、原因は二つあると思います。
1)サーボの問題
もしデジタルサーボをご使用奈良の話ですが、最近のデジタルサーボは、精度が高くちょっとした入力制御値の変化でも
それに対応しようと動作しますので、それが、ジジジという反応として出てしまいます。
2)プログラムの問題
この制御プログラムでは、main関数のwhile()文で、永久ループを構成しています。
while()分の最後に、
__delay_ms(20)
という遅延が入っています。これは、LEDやサーボを規則正しく制御する為の時間カウンター的な
役目なのですが、サーボにパルスを与える時間が20msecが標準なのですが、
色々な処理のために、20msec以上の間隔になっていますので、これを
__delay_ms(15)
とか
__delay_ms(10)
とか変えてみてください。
ただし、ここの値を小さくすると、全体の処理速度が速くなりますので、各LEDの点滅時間のカウンター(Zno係数)を大きくしないといけません。
一度お試しください。
2020-06-04 17:44 URL [ 編集 ]
yangmin
こんばんは。
早速の返信ありがとうございました。
アドバイス通りwhile()分の最後の__delay_ms(20)
を15 10 18 12さらにはコメントアウトなど、色々な値に変更してみました。
仰る通りLEDの点滅は早くなりましたが、残念ながらサーボのプルプル現象は変わりませんでした。
ボリューム抵抗が0Ωの時はピタリと止んでいます。
ボリューム抵抗の精度などが良くないのかと思い、
新たに購入してあった物が今日届いたので、
ボリューム抵抗を交換したりもしてみましたが、
良くも悪くもなりませんでした。
極性のある4.7μFのコンデンサをVDDとVSSに繋いでみた時は、
ほんの少しですが納まっていたような気がしますが、
それが良いのか悪いのかよく分からないので、
また0.1μFの極性無しコンデンサに戻しました。
ギミック自体はシビアな物ではないので、
この程度のプルプルだと影響は無くて、
動いていないのにジジジジと音がうるさく感じられる程度なので、
諦めようかと思います。
ちなみにLEDの点滅に合わせて、
キュイキュイーンっというような高周波な音が、
セラロックからと思われるような場所で鳴っていました。
今まで気が付きませんでしたが、
結構な音がしているものもんなんですねぇ。
マスターの言う通りやってみたものの、
不肖パダワンには無理なようです(苦笑)
ありがとうございました。
早速の返信ありがとうございました。
アドバイス通りwhile()分の最後の__delay_ms(20)
を15 10 18 12さらにはコメントアウトなど、色々な値に変更してみました。
仰る通りLEDの点滅は早くなりましたが、残念ながらサーボのプルプル現象は変わりませんでした。
ボリューム抵抗が0Ωの時はピタリと止んでいます。
ボリューム抵抗の精度などが良くないのかと思い、
新たに購入してあった物が今日届いたので、
ボリューム抵抗を交換したりもしてみましたが、
良くも悪くもなりませんでした。
極性のある4.7μFのコンデンサをVDDとVSSに繋いでみた時は、
ほんの少しですが納まっていたような気がしますが、
それが良いのか悪いのかよく分からないので、
また0.1μFの極性無しコンデンサに戻しました。
ギミック自体はシビアな物ではないので、
この程度のプルプルだと影響は無くて、
動いていないのにジジジジと音がうるさく感じられる程度なので、
諦めようかと思います。
ちなみにLEDの点滅に合わせて、
キュイキュイーンっというような高周波な音が、
セラロックからと思われるような場所で鳴っていました。
今まで気が付きませんでしたが、
結構な音がしているものもんなんですねぇ。
マスターの言う通りやってみたものの、
不肖パダワンには無理なようです(苦笑)
ありがとうございました。
2020-06-05 01:17 URL [ 編集 ]
Re: タイトルなし
Vivid
yangminさん、こんにちは
うですか、なかなか手ごわいですね。
どうやら原因は、AD変換とサーボの間にありそうですね。
もし、古い型のアナログサーボがあれば、一時換装してテストしてみるのも良いですが。
サーボ以外の対策としては、AD変換回りですが、AD変換に接続しているVRの、GNDとVRの中点の端子の間に、4uF程度(数値は適当に増減してみてください)のコンデンサーを入れて、AD変換値の平均安定化をしてはどうでしょうか?
あと、「キーン」という高周波の音については原因が思いつきません。
yangminさんの回路の固有の仕様に関するものかもしれません。
うですか、なかなか手ごわいですね。
どうやら原因は、AD変換とサーボの間にありそうですね。
もし、古い型のアナログサーボがあれば、一時換装してテストしてみるのも良いですが。
サーボ以外の対策としては、AD変換回りですが、AD変換に接続しているVRの、GNDとVRの中点の端子の間に、4uF程度(数値は適当に増減してみてください)のコンデンサーを入れて、AD変換値の平均安定化をしてはどうでしょうか?
あと、「キーン」という高周波の音については原因が思いつきません。
yangminさんの回路の固有の仕様に関するものかもしれません。
2020-06-05 09:32 URL [ 編集 ]
yangmin
こんばんは。
新たなアドバイスをありがとうございます!
ご指示通りVRのGNDと真ん中の端子の間に4.7uFを皮切りに0.01ufや0.001uFや10uFなど、色々なコンデンサを入れてみましたが症状は変わりませんでした(>_<)
3年前のプログラム作成当時も、サーボのメーカーや型名などによって個体差があり、サーボのディレイを"__delay_us(750);"やVividさんの初期値の"__delay_us(660);"などにしたり、サーボを交換したりしてハンチングしないサーボを選んでベースに取り付けたような記憶があります。
で、結局その時にベースに取り付けたサーボはSG92Rでした。
今回、試しに在庫で手元にあったSG90を接続してみたところ、"ジジジジ"という音とハンチングは少し大人しいようなきがします。
ただSG92Rはベースにガッツリ固定してあり、交換が難しいのですが…(苦笑)
VRによるAD変換なので、0Ω値以外の時はピタッと止まらず、ある程度"ジジジジ"となるのは、そういうものなんでしょうか(?_?)
高周波のような音の件は、セラロックを交換しても変わりはなく、やはりLEDの点滅周期に同期しているようでした。
RA2~RA4とRB2~RB4をランダム点滅でLEDに使用していて、RB2~RB4は早めの点滅周期で使用しているのですが、そのRB2~RB4の周期にあわせてキュィキュィーンと鳴っているようです。
だいぶ諦めムードではありますが、この内容を読んでまた気が付いたことがあるようでしたらアドバイスをいただけると助かります。
新たなアドバイスをありがとうございます!
ご指示通りVRのGNDと真ん中の端子の間に4.7uFを皮切りに0.01ufや0.001uFや10uFなど、色々なコンデンサを入れてみましたが症状は変わりませんでした(>_<)
3年前のプログラム作成当時も、サーボのメーカーや型名などによって個体差があり、サーボのディレイを"__delay_us(750);"やVividさんの初期値の"__delay_us(660);"などにしたり、サーボを交換したりしてハンチングしないサーボを選んでベースに取り付けたような記憶があります。
で、結局その時にベースに取り付けたサーボはSG92Rでした。
今回、試しに在庫で手元にあったSG90を接続してみたところ、"ジジジジ"という音とハンチングは少し大人しいようなきがします。
ただSG92Rはベースにガッツリ固定してあり、交換が難しいのですが…(苦笑)
VRによるAD変換なので、0Ω値以外の時はピタッと止まらず、ある程度"ジジジジ"となるのは、そういうものなんでしょうか(?_?)
高周波のような音の件は、セラロックを交換しても変わりはなく、やはりLEDの点滅周期に同期しているようでした。
RA2~RA4とRB2~RB4をランダム点滅でLEDに使用していて、RB2~RB4は早めの点滅周期で使用しているのですが、そのRB2~RB4の周期にあわせてキュィキュィーンと鳴っているようです。
だいぶ諦めムードではありますが、この内容を読んでまた気が付いたことがあるようでしたらアドバイスをいただけると助かります。
2020-06-06 18:03 URL [ 編集 ]
Re: タイトルなし
Vivid
yangminさん
こんばんは。
なかなか手強いですね。まずはサーボの問題に絞りましょう。
サーボに原因があるのか、それ以外にあるのかを切り分けます。
1)サーボが原因か?
AD変換の値を格納する変数に、固定値を上書きし、AD変換を無効にして
一定の値を常にサーボに送出する。
例えば、
void ad_conv(void)関数の変数servoに100をセットする。
これでもサーボがジジジというなら、サーボが原因。(サーボの仕様が合わない)
2)AD変換に使用するVRの中点をVRからではなく、別途、5VとGNDから抵抗で分圧した固定の
電圧を加えて、確認する。(10KΩくらいの抵抗2本を直列にして、5VとGNDに接続し
2本の抵抗の接続点から、AD変換へ入力する。
VRの値の変動をなくする。
これで、ジジジというなら、PICのAD変換にノイズか何かが影響していると思われます。
PICを交換してみて様子を見ましょう。
ちなみに、PICは何をどのくらいのクロック周波数でお使いですか?
こんばんは。
なかなか手強いですね。まずはサーボの問題に絞りましょう。
サーボに原因があるのか、それ以外にあるのかを切り分けます。
1)サーボが原因か?
AD変換の値を格納する変数に、固定値を上書きし、AD変換を無効にして
一定の値を常にサーボに送出する。
例えば、
void ad_conv(void)関数の変数servoに100をセットする。
これでもサーボがジジジというなら、サーボが原因。(サーボの仕様が合わない)
2)AD変換に使用するVRの中点をVRからではなく、別途、5VとGNDから抵抗で分圧した固定の
電圧を加えて、確認する。(10KΩくらいの抵抗2本を直列にして、5VとGNDに接続し
2本の抵抗の接続点から、AD変換へ入力する。
VRの値の変動をなくする。
これで、ジジジというなら、PICのAD変換にノイズか何かが影響していると思われます。
PICを交換してみて様子を見ましょう。
ちなみに、PICは何をどのくらいのクロック周波数でお使いですか?
2020-06-06 20:41 URL [ 編集 ]
yangmin
こんにちは!
数々の検証方法をありがとうございます。
PICは16F876Aを使用しています。
在庫があったので他の16F876Aに替えてみましたが症状は変わりませんでした。
クロック数はVividさんのプログラムを変更していませんので20MHzです。
在庫をひっくり返してサーボをかき集めたところ、以下のようなサーボがありましたので教えていただいた切り分け方法で実験してみました。
SG92R:3個(1個はジオラマベースに固定しているもの)
SG90:2個
TG9e:3個
1)の実験
SG92R:3個全部ピタリと止まり音も鳴りません。
SG90:2個全部ピタリと止まり音も鳴りません。
TG9e:3個全部ピタリと止まり音も鳴りません。
2)の実験
SG92R:3個全部ジジジと鳴ります。
SG90:2個全部ピタリと止まり音も鳴りません。
TG9e:3個全部ピタリと止まり音も鳴りません。
この結果から想像出来ることは、PIC(もしくは回路内)からノイズが発生していて、SG92Rのみそれに敏感に反応してしまっている。と言うことになるのでしょうかねぇ。
謎の高周波音がしているのも関係あるかもしれませんね。
自分は大したことは出来ないので、プログラムも回路や実装も、殆ど元のVividさんのプログラムのままに近い状態で利用しているのに…(悲)
更には3種類のサーボのうち、よりによって症状が出てしまうSG92Rを使用していたという結果になろうとは。
このような結果が出てしまってはもう仕方が無いので、ガッツリ固定してしまったサーボを他のサーボに取り替えてみます(苦笑)
沢山ご教示いただきまして、本当にありがとうございましたm(;_ _)m
数々の検証方法をありがとうございます。
PICは16F876Aを使用しています。
在庫があったので他の16F876Aに替えてみましたが症状は変わりませんでした。
クロック数はVividさんのプログラムを変更していませんので20MHzです。
在庫をひっくり返してサーボをかき集めたところ、以下のようなサーボがありましたので教えていただいた切り分け方法で実験してみました。
SG92R:3個(1個はジオラマベースに固定しているもの)
SG90:2個
TG9e:3個
1)の実験
SG92R:3個全部ピタリと止まり音も鳴りません。
SG90:2個全部ピタリと止まり音も鳴りません。
TG9e:3個全部ピタリと止まり音も鳴りません。
2)の実験
SG92R:3個全部ジジジと鳴ります。
SG90:2個全部ピタリと止まり音も鳴りません。
TG9e:3個全部ピタリと止まり音も鳴りません。
この結果から想像出来ることは、PIC(もしくは回路内)からノイズが発生していて、SG92Rのみそれに敏感に反応してしまっている。と言うことになるのでしょうかねぇ。
謎の高周波音がしているのも関係あるかもしれませんね。
自分は大したことは出来ないので、プログラムも回路や実装も、殆ど元のVividさんのプログラムのままに近い状態で利用しているのに…(悲)
更には3種類のサーボのうち、よりによって症状が出てしまうSG92Rを使用していたという結果になろうとは。
このような結果が出てしまってはもう仕方が無いので、ガッツリ固定してしまったサーボを他のサーボに取り替えてみます(苦笑)
沢山ご教示いただきまして、本当にありがとうございましたm(;_ _)m
2020-06-07 16:03 URL [ 編集 ]
Re: タイトルなし
Vivid
yangminさんへ
どうやら原因が分かりかけてきたようですね。
AD変換に同じ電圧を印加しても、AD結果が多少変動し、それにサーボが反応しているという事でしょうか。
実は今回のAD関連のソフトの分解能は、いろいろな制約で、0-250の範囲しか使用していません。
また、通常、ADはプラスマイナス1の誤差がありますので、その変化を拾っているのでしょう。
ソフト的に対応するには、読み込んだAD変換結果を10個くらい「移動平均」するような処理を加えると
改善する可能性があります。
yangminさん、一度トライされてはいかがでしょうか?
ソフトの勉強にもなると思います。
どうやら原因が分かりかけてきたようですね。
AD変換に同じ電圧を印加しても、AD結果が多少変動し、それにサーボが反応しているという事でしょうか。
実は今回のAD関連のソフトの分解能は、いろいろな制約で、0-250の範囲しか使用していません。
また、通常、ADはプラスマイナス1の誤差がありますので、その変化を拾っているのでしょう。
ソフト的に対応するには、読み込んだAD変換結果を10個くらい「移動平均」するような処理を加えると
改善する可能性があります。
yangminさん、一度トライされてはいかがでしょうか?
ソフトの勉強にもなると思います。
2020-06-07 16:46 URL [ 編集 ]
yangmin
こんばんは。
AD変換には誤差があるのですね。
考えてみればアナログなわけですから、十分あり得る話しですね。
仰る通りAD結果にサーボが敏感に反応指定るっぽい感じがします。
"移動平均"について少し調べてみました。
センサーなどに使用される誤差を吸収するような手法なんですね。
確かにこの処理を追加すると安定しそうな気がします。
毎度のことですが、理屈は分かるのですが実装するとなると恥ずかしながらなかなか…(苦笑)
少しずつ理解を深めて自分でも実装できるように頑張りたいと思いますが、今はとりあえずサーボの交換で対処しようと思います(^^;)
固定したサーボを剥がしてTG9eに交換した所、お陰様でジジジとブレる事は無くなりました。
いつもいつも、いつまで経っても素人の自分の相手をしていただきまして感謝します。
本当にありがとうございますm(_ _)m
AD変換には誤差があるのですね。
考えてみればアナログなわけですから、十分あり得る話しですね。
仰る通りAD結果にサーボが敏感に反応指定るっぽい感じがします。
"移動平均"について少し調べてみました。
センサーなどに使用される誤差を吸収するような手法なんですね。
確かにこの処理を追加すると安定しそうな気がします。
毎度のことですが、理屈は分かるのですが実装するとなると恥ずかしながらなかなか…(苦笑)
少しずつ理解を深めて自分でも実装できるように頑張りたいと思いますが、今はとりあえずサーボの交換で対処しようと思います(^^;)
固定したサーボを剥がしてTG9eに交換した所、お陰様でジジジとブレる事は無くなりました。
いつもいつも、いつまで経っても素人の自分の相手をしていただきまして感謝します。
本当にありがとうございますm(_ _)m
2020-06-07 18:03 URL [ 編集 ]
Re: タイトルなし
Vivid
yangminさんへ
サーボを交換されましたか。
一応正常に動作しているとのことで、良かったです。
RC飛行機(特に小さな模型)の一部のサーボでは、同様の「ジジジ」というノイズと振動が出るのを見たことがあります。
小型サーボの一部にはこういったものがあるようです。
また、何かあればお知らせください。
サーボを交換されましたか。
一応正常に動作しているとのことで、良かったです。
RC飛行機(特に小さな模型)の一部のサーボでは、同様の「ジジジ」というノイズと振動が出るのを見たことがあります。
小型サーボの一部にはこういったものがあるようです。
また、何かあればお知らせください。
2020-06-08 08:16 URL [ 編集 ]
| ホーム |