トピック関連記事
48時間以内の記事は で表示されます
PWM/ADリレー無し SWもなし全てプログラム
替えるのは 以下の1行でよろしいですか?
num=(num-50.0)*(1023-500)/(1023-50)+500;
num=(num-50.0)*(1023-500)/(1023-50)+500;
Re: PWM/ADリレー
> MABOさん
音量調整以外ではBカーブが良いんじゃないですか?
音量でも、直接のアナログ制御ではなく、マイコンなどに入れるのなら
やはりBカーブが良いと思います。
で、疑似手パですけど、現在、添付画像のようなところまで来ています。
で、見れば解るようにPRO MICROにしました。
でも、作っていて気付いたのですけど、STM32でもピンヘッダを逆向き、つまり、
ブートジャンパーと同じ側に付ければ差し込んだ時に下を向いて何も問題が無い事に気づきました。
いやー、そんな単純な事に気づかなかったとは…(;'∀')
プログラムも初期的な動作は確認しました。
幾つかの点で当初の予定から変更になりそうです。
>TRさん
前の数行の内のその行を差し替えてください。
式は正しかった?のですが、桁あふれが起こったのでしょう。
実際は前の数行の内の50→50.0と「.0」を付けてほしい、と言う事です。
音量調整以外ではBカーブが良いんじゃないですか?
音量でも、直接のアナログ制御ではなく、マイコンなどに入れるのなら
やはりBカーブが良いと思います。
で、疑似手パですけど、現在、添付画像のようなところまで来ています。
で、見れば解るようにPRO MICROにしました。
でも、作っていて気付いたのですけど、STM32でもピンヘッダを逆向き、つまり、
ブートジャンパーと同じ側に付ければ差し込んだ時に下を向いて何も問題が無い事に気づきました。
いやー、そんな単純な事に気づかなかったとは…(;'∀')
プログラムも初期的な動作は確認しました。
幾つかの点で当初の予定から変更になりそうです。
>TRさん
前の数行の内のその行を差し替えてください。
式は正しかった?のですが、桁あふれが起こったのでしょう。
実際は前の数行の内の50→50.0と「.0」を付けてほしい、と言う事です。
猛牛ロック 2018/12/29(Sat) 07:02 No.1386
Re: PWM/ADリレー無し SWもなし全てプログラム
>前の数行の内のその行を差し替えてください。
確認させてください。
以下でいいのでしょうか?
良い品ができましたね。
while (1) {
if(RB7==0){__delay_ms(10);break;}
LATA0=LATA1=RB7;//SEC基板ポート2のSL-13の1番ピン
num= adconv(); // RB3→RB4から半固定抵抗の値を読み込む
if(num<50){
CCPR1L = 0;
CCP1CONbits.DC1B = 0;
}else{
num=(num-50.0)*(1023-500)/(1023-50)+500;
CCPR1L =num>>2 ;
CCP1CONbits.DC1B = num&3;
}
CCPR1L = num / 4; // アナログ値からのデータでデューティ値を設定
CCP1CONbits.DC1B = num & 0b11;
__delay_ms(10);
}
確認させてください。
以下でいいのでしょうか?
良い品ができましたね。
while (1) {
if(RB7==0){__delay_ms(10);break;}
LATA0=LATA1=RB7;//SEC基板ポート2のSL-13の1番ピン
num= adconv(); // RB3→RB4から半固定抵抗の値を読み込む
if(num<50){
CCPR1L = 0;
CCP1CONbits.DC1B = 0;
}else{
num=(num-50.0)*(1023-500)/(1023-50)+500;
CCPR1L =num>>2 ;
CCP1CONbits.DC1B = num&3;
}
CCPR1L = num / 4; // アナログ値からのデータでデューティ値を設定
CCP1CONbits.DC1B = num & 0b11;
__delay_ms(10);
}
Re: PWM/ADリレー無し
既にif〜else〜でduty比を入れているのですから、もう一度
CCPR1L = num / 4;
CCP1CONbits.DC1B = num & 0b11;
と入れるわけないでしょ。つまり、この部分は不要です。
追伸
とはいえ、もう一度入れてもそれほど大きな影響はないような気がします。
駄目そうなら、
unsigned int num;
を
long num;
に変えてください。その場合は50.0じゃなくて50が良いです。
ていうか、こちらの対処の方が良いです。
※
if〜else〜文で添付図のようにしています。
num=(num-50)*(1023-500)/(1023-50)+500;
がなぜ駄目だったのかは、ちゃんと理解した方が良いです。
最初の(num-50)*(1023-500)の計算で、桁あふれ=65535以上になる、
という事です。
なので、32ビットで計算させるか、浮動小数点(float)で計算させるか、をしなければなりません。
CCPR1L = num / 4;
CCP1CONbits.DC1B = num & 0b11;
と入れるわけないでしょ。つまり、この部分は不要です。
追伸
とはいえ、もう一度入れてもそれほど大きな影響はないような気がします。
駄目そうなら、
unsigned int num;
を
long num;
に変えてください。その場合は50.0じゃなくて50が良いです。
ていうか、こちらの対処の方が良いです。
※
if〜else〜文で添付図のようにしています。
num=(num-50)*(1023-500)/(1023-50)+500;
がなぜ駄目だったのかは、ちゃんと理解した方が良いです。
最初の(num-50)*(1023-500)の計算で、桁あふれ=65535以上になる、
という事です。
なので、32ビットで計算させるか、浮動小数点(float)で計算させるか、をしなければなりません。
猛牛ロック 2018/12/29(Sat) 12:29 No.1388
PWM/ADリレー無し S全てプログラム
Re: PWM/ADリレー無し SWもなし全てプログラム
> VRを絞った状態が凄く不安定です。
それなら、止める部分はPWMのduty比が0では無く、デジタルにして止めないと駄目かもしれません。
取り敢えずは、if〜else〜では無くelseの部分だけにした方が良いかもしれません。
つまり、
num= adconv();
num=(num-50.0)*(1023-500)/(1023-50)+500;
CCPR1L =num>>2 ;
CCP1CONbits.DC1B = num&3;
__delay_ms(10);
です。
3と0b11と0x3は全く同じです。表記法が違うだけ=人が数えやすい形をそれぞれ作っただけです。
コンピュータにとってはどれも同じです。
それなら、止める部分はPWMのduty比が0では無く、デジタルにして止めないと駄目かもしれません。
取り敢えずは、if〜else〜では無くelseの部分だけにした方が良いかもしれません。
つまり、
num= adconv();
num=(num-50.0)*(1023-500)/(1023-50)+500;
CCPR1L =num>>2 ;
CCP1CONbits.DC1B = num&3;
__delay_ms(10);
です。
3と0b11と0x3は全く同じです。表記法が違うだけ=人が数えやすい形をそれぞれ作っただけです。
コンピュータにとってはどれも同じです。
猛牛ロック 2018/12/29(Sat) 15:17 No.1391
PWM/ADリレー無し S全てプログラム
駄目です。
不安定です。
if(ADRES > 500 ) {//ボリューム50%=500/1000μs
まだ始めて間もない自分なので、間違いかもしれないと思います。
先ず断ります。
自分はこう思いました。
上記が、シンプルでAD変換も早いですし、安定している感があります
この式を思いついたのは、ツールラボさんの AD変換の中で、以下の言葉使い
「さて、500を2進数に変換して、その上位8ビットや下位2ビットを求めるのは面倒ですので、楽な方法でプログラムを書くことにしましょう。」
https://tool-lab.com/make/pic-app-4/
上記ページの中ごろを過ぎたあたりにあります。
それと、PWMの制御ログラム %で制御しています。
https://tool-lab.com/make/pic-app-5/
この考えは、AD変換にも使えると思います。
10ビットには変わりないのでそう思いました。
%は、動作速度を1MHzにすれば、1μs 最大で1000μsの関係があるから、
50%は500と出来ると思いました。
500とすれば、50%×5V=2.5Vのところ、
実験の結果でも、約2.54Vを示しています。
勿論、いっぱい開けたら。約5.1Vです。
追記
スタートを、今からMOSFETのスレッショル電圧に変えます。
スレッショルドでしたっけ?」
不安定です。
if(ADRES > 500 ) {//ボリューム50%=500/1000μs
まだ始めて間もない自分なので、間違いかもしれないと思います。
先ず断ります。
自分はこう思いました。
上記が、シンプルでAD変換も早いですし、安定している感があります
この式を思いついたのは、ツールラボさんの AD変換の中で、以下の言葉使い
「さて、500を2進数に変換して、その上位8ビットや下位2ビットを求めるのは面倒ですので、楽な方法でプログラムを書くことにしましょう。」
https://tool-lab.com/make/pic-app-4/
上記ページの中ごろを過ぎたあたりにあります。
それと、PWMの制御ログラム %で制御しています。
https://tool-lab.com/make/pic-app-5/
この考えは、AD変換にも使えると思います。
10ビットには変わりないのでそう思いました。
%は、動作速度を1MHzにすれば、1μs 最大で1000μsの関係があるから、
50%は500と出来ると思いました。
500とすれば、50%×5V=2.5Vのところ、
実験の結果でも、約2.54Vを示しています。
勿論、いっぱい開けたら。約5.1Vです。
追記
スタートを、今からMOSFETのスレッショル電圧に変えます。
スレッショルドでしたっけ?」
Re: PWM/ADリレー無し
ちょっと状況が呑み込めません。
> VRを絞った状態が凄く不安定です。
これは私の書いたグラフで、最初の0のライン=停止部の事を言っているかと思ったのですが、違うのでしょうか?
動き出しの斜めの部分ですか?
> if(ADRES > 500 ) {//ボリューム50%=500/1000μs
おおよそ、「つまみの位置が半分以上なら」という意味合いになりますけど、
何を言っているのか、また言いたいのかは良く判りません。
ちょっとページ検索してみたら、No.1380 の
> @ if(ADRES > 300 ) {
> temp = ADRESH; //上位8bit
> temp = (temp << 8) + ADRESL; //RB3→RB4で読み込んだ値をtempに代入
> return temp;} //読み込んだtempをnumに返す
> }
これの事ですか?
これの意味合いとしては
「もしツマミの位置が約30%以上」ならもう一度つまみの位置を確認する、というコードに見えます。
何処にこのコードを入れるつもりなのでしょうか?
> 上記が、シンプルでAD変換も早いですし、安定している感があります
この「上記」とは「if(ADRES > 500 ) {」のことですか?
これは変換結果=つまみの位置に応じてなにかをしようとしているのではないのですか?
「変換が早い」も「安定」もどこにも要素自体がありませんけど。
また、それ以降も何を言いたいのかさっぱり解りません。
> 「さて、500を2進数に変換して、その上位8ビットや下位2ビットを求めるのは面倒ですので、楽な方法でプログラムを書くことにしましょう。」
なぜこんな言葉がここで出てきたのでしょうか?
> %は、動作速度を1MHzにすれば、1μs 最大で1000μsの関係があるから、
> 50%は500と出来ると思いました
これは10ビット=最大1023の分解能のPWMなので、50%は約500です。動作速度とは関係ありません。
追記します。
今気づきましたけど、No.1387の
> if(RB7==0){__delay_ms(10);break;}
> LATA0=LATA1=RB7;//SEC基板ポート2のSL-13の1番ピン
は、
RB7がLレベルなら再起動。
(それ以外なら、)RA0ピンとRA1ピンをHIGHにする。
という意味合いですけど、これでいいのでしょうか?
> VRを絞った状態が凄く不安定です。
これは私の書いたグラフで、最初の0のライン=停止部の事を言っているかと思ったのですが、違うのでしょうか?
動き出しの斜めの部分ですか?
> if(ADRES > 500 ) {//ボリューム50%=500/1000μs
おおよそ、「つまみの位置が半分以上なら」という意味合いになりますけど、
何を言っているのか、また言いたいのかは良く判りません。
ちょっとページ検索してみたら、No.1380 の
> @ if(ADRES > 300 ) {
> temp = ADRESH; //上位8bit
> temp = (temp << 8) + ADRESL; //RB3→RB4で読み込んだ値をtempに代入
> return temp;} //読み込んだtempをnumに返す
> }
これの事ですか?
これの意味合いとしては
「もしツマミの位置が約30%以上」ならもう一度つまみの位置を確認する、というコードに見えます。
何処にこのコードを入れるつもりなのでしょうか?
> 上記が、シンプルでAD変換も早いですし、安定している感があります
この「上記」とは「if(ADRES > 500 ) {」のことですか?
これは変換結果=つまみの位置に応じてなにかをしようとしているのではないのですか?
「変換が早い」も「安定」もどこにも要素自体がありませんけど。
また、それ以降も何を言いたいのかさっぱり解りません。
> 「さて、500を2進数に変換して、その上位8ビットや下位2ビットを求めるのは面倒ですので、楽な方法でプログラムを書くことにしましょう。」
なぜこんな言葉がここで出てきたのでしょうか?
> %は、動作速度を1MHzにすれば、1μs 最大で1000μsの関係があるから、
> 50%は500と出来ると思いました
これは10ビット=最大1023の分解能のPWMなので、50%は約500です。動作速度とは関係ありません。
追記します。
今気づきましたけど、No.1387の
> if(RB7==0){__delay_ms(10);break;}
> LATA0=LATA1=RB7;//SEC基板ポート2のSL-13の1番ピン
は、
RB7がLレベルなら再起動。
(それ以外なら、)RA0ピンとRA1ピンをHIGHにする。
という意味合いですけど、これでいいのでしょうか?
猛牛ロック 2018/12/29(Sat) 20:56 No.1393
Re: PWM/ADリレー無し SWもなし全てプログラム
TRさん,猛牛ロックさん,こんばんは。
プログラムの方は,混乱しないように,差し控えます。
プログラムではないのですが,以前,ADCのボリュームと
同じ役目させるのに,オシレーターの制御で,多回転のポテンショメーターを使ったことあります。
これ,どうなんでしょうね。
通常のボリュームより,正確な数値になるような気がしますが。
プログラムの方は,混乱しないように,差し控えます。
プログラムではないのですが,以前,ADCのボリュームと
同じ役目させるのに,オシレーターの制御で,多回転のポテンショメーターを使ったことあります。
これ,どうなんでしょうね。
通常のボリュームより,正確な数値になるような気がしますが。
mabo 2018/12/29(Sat) 21:03 No.1394
Re: PWM/ADリレー無し SWもなし全てプログラム
> MABOさん
私も使った事はありますよ。それと回転数表示付きのツマミですね。
電圧としては安定していますよね。それに細かい制御が出来ます。
けれども多回転すぎるのは使いにくさもありますね。
微調整が利くのとトレードオフです。
私の場合は確か、インバータの外部ツマミとして使いました。
っていうか、元々それが付いていたのですけど、マシンが調子が悪くなって組み直したんです。
で、やはり前に付いていたそのタイプのボリュームが良いと言う事で使いました。
もっとも、今回の件はボリュームの性能とはあまり関係が無いと思っています。
「不安定」の原因がボリュームの読み取りなのか、プログラムの問題なのか、出力先の問題なのか不明です。
ボリュームの読み取りが不安定と言う事が解っていれば、その対処もあるんですけどね。
私も使った事はありますよ。それと回転数表示付きのツマミですね。
電圧としては安定していますよね。それに細かい制御が出来ます。
けれども多回転すぎるのは使いにくさもありますね。
微調整が利くのとトレードオフです。
私の場合は確か、インバータの外部ツマミとして使いました。
っていうか、元々それが付いていたのですけど、マシンが調子が悪くなって組み直したんです。
で、やはり前に付いていたそのタイプのボリュームが良いと言う事で使いました。
もっとも、今回の件はボリュームの性能とはあまり関係が無いと思っています。
「不安定」の原因がボリュームの読み取りなのか、プログラムの問題なのか、出力先の問題なのか不明です。
ボリュームの読み取りが不安定と言う事が解っていれば、その対処もあるんですけどね。
猛牛ロック 2018/12/29(Sat) 21:38 No.1395
PWM/ADリレー無 全てプログラム
>動き出しの斜めの部分ですか?
不安定な部分は、スタートを始めるあたりでした。
>何を言っているのか、また言いたいのかは良く判りません。
私が見たページを見てください。その方が早いと思います。
それとも、見てくださったうえで聞いているのかな〜。
私が感じた点はすべて言いました。これ以上の説明はできません。
なので、紹介したページを見ていただいた方が早いと思います。
申し訳ないです。
> @ if(ADRES > 300 ) {
> temp = ADRESH; //上位8bit
> temp = (temp << 8) + ADRESL; //RB3→RB4で読み込んだ値をtempに代入
> return temp;} //読み込んだtempをnumに返す
> }
紹介したページに、%でプログラムが入っています。
見た方が早いともいます。
私の場合は、ADRESの値が30%以上だったら、読み込むと理解しました。
間違えかもしれませんよ。
でも、いい具合に動いています。
若し見ていないようでしたら、見てください。
拙い自分には、これ以上、猛牛ロックさんのようなレベルの高い人にはうまく説明できません。
>RB7がLレベルなら再起動。
(それ以外なら、)RA0ピンとRA1ピンをHIGHにする。
という意味合いですけど、これでいいのでしょうか?
再起動という表現が正しいのかどうかわかりません。
ただ、自分としては、
SEC基板からの信号とPICの動作が一体となれればいいなと思いました。
その結果が、
> if(RB7==0){__delay_ms(10);break;}
> LATA0=LATA1=RB7;//SEC基板ポート2のSL-13の1番ピン
これです。
実際、RB7に、信号がなければ、止まるし、信号が入れば、動作します。
今までもLEDとSWの関係のプログラムがありましたよね。
それと、猛牛ロックさんに教わったbreak文、これをミックス
したらどうだろうかと思った次第です。
今のところ、RB7とPWM、RA0、RA1は全て同調しています。
不安定な部分は、スタートを始めるあたりでした。
>何を言っているのか、また言いたいのかは良く判りません。
私が見たページを見てください。その方が早いと思います。
それとも、見てくださったうえで聞いているのかな〜。
私が感じた点はすべて言いました。これ以上の説明はできません。
なので、紹介したページを見ていただいた方が早いと思います。
申し訳ないです。
> @ if(ADRES > 300 ) {
> temp = ADRESH; //上位8bit
> temp = (temp << 8) + ADRESL; //RB3→RB4で読み込んだ値をtempに代入
> return temp;} //読み込んだtempをnumに返す
> }
紹介したページに、%でプログラムが入っています。
見た方が早いともいます。
私の場合は、ADRESの値が30%以上だったら、読み込むと理解しました。
間違えかもしれませんよ。
でも、いい具合に動いています。
若し見ていないようでしたら、見てください。
拙い自分には、これ以上、猛牛ロックさんのようなレベルの高い人にはうまく説明できません。
>RB7がLレベルなら再起動。
(それ以外なら、)RA0ピンとRA1ピンをHIGHにする。
という意味合いですけど、これでいいのでしょうか?
再起動という表現が正しいのかどうかわかりません。
ただ、自分としては、
SEC基板からの信号とPICの動作が一体となれればいいなと思いました。
その結果が、
> if(RB7==0){__delay_ms(10);break;}
> LATA0=LATA1=RB7;//SEC基板ポート2のSL-13の1番ピン
これです。
実際、RB7に、信号がなければ、止まるし、信号が入れば、動作します。
今までもLEDとSWの関係のプログラムがありましたよね。
それと、猛牛ロックさんに教わったbreak文、これをミックス
したらどうだろうかと思った次第です。
今のところ、RB7とPWM、RA0、RA1は全て同調しています。
Re: PWM/ADリレー無し SWもなし全てプログラム
maboさんこんばんは。
今回、VRも考えました。
手持ちに東京コスモスのいい奴があったので、現在試作中のボードに使ってみました。
でも、思ったんです。
MOSFETの場合、電圧制御なんですよね。
なので、プログラムで、SWを作れるって、
FETのVgsでしたっけ、
調べると、1〜2Vでした。
現在は、目標2Vにしました。
あとは実機につけて、微調整します。
これで、リレーも要らないし、SW代わりのフォトカプラーも要らない。
それと、やっとわかったんですが、
SEC基板のOUTPUTには、信号とGNDがセットになっています。
それは、直接、リレーなどを操作するために、信号線とGNDがセットになっていたんですね。
今回は、SEC基板の端子からは、信号線だけをRB7に繋げます。 その辺、図面が誤っていました。
勿論、電源は、全て一緒。スムースステッパー、SEC基板、今回のボードはすべて同じ電源です。
今回、VRも考えました。
手持ちに東京コスモスのいい奴があったので、現在試作中のボードに使ってみました。
でも、思ったんです。
MOSFETの場合、電圧制御なんですよね。
なので、プログラムで、SWを作れるって、
FETのVgsでしたっけ、
調べると、1〜2Vでした。
現在は、目標2Vにしました。
あとは実機につけて、微調整します。
これで、リレーも要らないし、SW代わりのフォトカプラーも要らない。
それと、やっとわかったんですが、
SEC基板のOUTPUTには、信号とGNDがセットになっています。
それは、直接、リレーなどを操作するために、信号線とGNDがセットになっていたんですね。
今回は、SEC基板の端子からは、信号線だけをRB7に繋げます。 その辺、図面が誤っていました。
勿論、電源は、全て一緒。スムースステッパー、SEC基板、今回のボードはすべて同じ電源です。
Re: PWM/ADリレー無し SWもなし全てプログラム
> 不安定な部分は、スタートを始めるあたりでした。
というのは斜めの部分と言う事ですか?平らでは無くて?
> 私が見たページを見てください。その方が早いと思います。
勿論、両方のページを見ていますよ。
で、別にそのページでは%では書いてありませんよ。
っていうか、単に1023の23の部分を切り捨てて単純に考えたい、という意味ですか?
> @ if(ADRES > 300 ) {
> temp = ADRESH; //上位8bit
> temp = (temp << 8) + ADRESL; //RB3→RB4で読み込んだ値をtempに代入
> return temp;} //読み込んだtempをnumに返す
> }
このプログラムを解説すれば、
> @ if(ADRES > 300 ) {
「もしADRESが300より大きければ、」と言う事です。
ADRESレジスタが存在すればそれを読み込みます。
レジスタが無ければ、自分で作った変数でしょうから、前回ADCを読んだ値だと思います。
> temp = ADRESH; //上位8bit
> temp = (temp << 8) + ADRESL; //RB3→RB4で読み込んだ値をtempに代入
2行で、新たにADCの値10bitをtempに代入しています。
> return temp;} //読み込んだtempをnumに返す
問題はここです。そのADC値をリターンして「関数を終わらせます。」なので、どこでこのコードを使うのかが気になったのです。
普通に考えれば、ADCの読み取り関数の部分に書かれているのだと思いますけど、もしかしてここでも再起動させていませんか?
で、自分の作った変数なら、一度300以下になったら更新されないような気がするのですけど?
ちょっと全体のコードを見ないと判断が付きません。
例えば、私のコードで、__delay_ms(10);の部分を10000(10秒)にするとどうなりますか?
つまり、10秒おきに更新しますから、それでその10秒間が安定しないならハードの問題です。=動き出しの力が弱すぎて
モータが回るか止まるかが安定しないのでしょう。もう少し上の数値から行えばいいと思います。
それで、安定しているのなら、ADCの取得値がばらばらと言う事でしょう。
> MOSFETの場合、電圧制御なんですよね。
> なので、プログラムで、SWを作れるって、
> FETのVgsでしたっけ、
> 調べると、1〜2Vでした。
> 現在は、目標2Vにしました。
ちょっと良く判らないのですけど、「SW」とは何の意味でしょうか?
Vgsはゲートに入れる電圧の事です。1〜2Vとは?また、「目標」も何のことを差しているのですか?
もう少し略さずに書いてください。「SWを作れるって、」はどこに繋がるのですか?
「何が」「どうしたか」という部分が理解できません。
> 直接、リレーなどを操作するために、信号線とGNDがセットになっていたんですね。
直接リレーを駆動できるかは別問題です。GNDは必ず必要です。でないと信号線の電圧が解りません。
電圧計(テスター)も2本ありますよね?それと同じです。1本を繋いでも電圧は測れません。
あとはその出力にどの位の駆動能力があるかです。本当の信号のみなのか、LED程度は駆動できるのか、リレーも可能なのか?
ただ、普通はICの出力端子が繋いであるのでLED程度までです。トランジスタアレイあたりが繋がっていればリレーも大丈夫です。
※SEC基板やスムースステッパーの事はかなり忘れています。TRさんのポンプ制御も回路の方はすっかり忘れています。
というのは斜めの部分と言う事ですか?平らでは無くて?
> 私が見たページを見てください。その方が早いと思います。
勿論、両方のページを見ていますよ。
で、別にそのページでは%では書いてありませんよ。
っていうか、単に1023の23の部分を切り捨てて単純に考えたい、という意味ですか?
> @ if(ADRES > 300 ) {
> temp = ADRESH; //上位8bit
> temp = (temp << 8) + ADRESL; //RB3→RB4で読み込んだ値をtempに代入
> return temp;} //読み込んだtempをnumに返す
> }
このプログラムを解説すれば、
> @ if(ADRES > 300 ) {
「もしADRESが300より大きければ、」と言う事です。
ADRESレジスタが存在すればそれを読み込みます。
レジスタが無ければ、自分で作った変数でしょうから、前回ADCを読んだ値だと思います。
> temp = ADRESH; //上位8bit
> temp = (temp << 8) + ADRESL; //RB3→RB4で読み込んだ値をtempに代入
2行で、新たにADCの値10bitをtempに代入しています。
> return temp;} //読み込んだtempをnumに返す
問題はここです。そのADC値をリターンして「関数を終わらせます。」なので、どこでこのコードを使うのかが気になったのです。
普通に考えれば、ADCの読み取り関数の部分に書かれているのだと思いますけど、もしかしてここでも再起動させていませんか?
で、自分の作った変数なら、一度300以下になったら更新されないような気がするのですけど?
ちょっと全体のコードを見ないと判断が付きません。
例えば、私のコードで、__delay_ms(10);の部分を10000(10秒)にするとどうなりますか?
つまり、10秒おきに更新しますから、それでその10秒間が安定しないならハードの問題です。=動き出しの力が弱すぎて
モータが回るか止まるかが安定しないのでしょう。もう少し上の数値から行えばいいと思います。
それで、安定しているのなら、ADCの取得値がばらばらと言う事でしょう。
> MOSFETの場合、電圧制御なんですよね。
> なので、プログラムで、SWを作れるって、
> FETのVgsでしたっけ、
> 調べると、1〜2Vでした。
> 現在は、目標2Vにしました。
ちょっと良く判らないのですけど、「SW」とは何の意味でしょうか?
Vgsはゲートに入れる電圧の事です。1〜2Vとは?また、「目標」も何のことを差しているのですか?
もう少し略さずに書いてください。「SWを作れるって、」はどこに繋がるのですか?
「何が」「どうしたか」という部分が理解できません。
> 直接、リレーなどを操作するために、信号線とGNDがセットになっていたんですね。
直接リレーを駆動できるかは別問題です。GNDは必ず必要です。でないと信号線の電圧が解りません。
電圧計(テスター)も2本ありますよね?それと同じです。1本を繋いでも電圧は測れません。
あとはその出力にどの位の駆動能力があるかです。本当の信号のみなのか、LED程度は駆動できるのか、リレーも可能なのか?
ただ、普通はICの出力端子が繋いであるのでLED程度までです。トランジスタアレイあたりが繋がっていればリレーも大丈夫です。
※SEC基板やスムースステッパーの事はかなり忘れています。TRさんのポンプ制御も回路の方はすっかり忘れています。
猛牛ロック 2018/12/29(Sat) 23:11 No.1398
Re: PWM/ADリレー無し SWもなし全てプログラム
割合で書いてあった内容です。
ADCのプログラムでは、10ビット 0〜1023ですよね。
ADRESの判定を次のように記載してありました。
例
// (ADコンバート値が250未満の場合)
if( ADRES < 250 ) {
一部抜粋
// (ADコンバート値が250未満の場合)
if( ADRES < 250 ) {
timerValue--; // タイマー時間を減らす
// タイマー時間をLEDの点滅回数で表現する
RA5 = 0; // いったんLEDを消して
__delay_ms(500);
// 設定時間分LEDを点滅して、
for(i=0; i<timerValue; i++) {
RA5 = 0;
__delay_ms(200);
RA5 = 1;
__delay_ms(200);
}
RA5 = 0; // ちょっとの間LEDを消して、
__delay_ms(800);
RA5 = 1; // LEDを点灯する
} else {
// タイマー時間を増やすスイッチの処理
// (ADコンバート値が250以上750未満)
if( 250 <= ADRES && ADRES < 750 ) {
timerValue++;// タイマー時間を増やす
// タイマー時間をLEDの点滅回数で表現する
// 点滅制御方法は減らす場合と同じ
RA5 = 0;
__delay_ms(800);
for(i=0; i<timerValue; i++) {
RA5 = 0;
__delay_ms(200);
RA5 = 1;
__delay_ms(200);
}
RA5 = 0;
__delay_ms(800);
RA5 = 1;
}
}
例のようにADRESを1023の内、0〜250としています。
なので、自分も
if(ADRES > 400 ) {//ボリューム40%=400/1000μs
としたんだけど、
//ボリューム40%=400/1000μs 正しくは、
400/1023かな。
でも、5Vからとスレッショルド電圧2Vを考えた場合
2/5V×1023=約400となるから、
仮に、例のような使い方ができるのであれば、
if(ADRES > 400 ) {//2/5V×1023=約400
でいいような。
>レジスタが無ければ、自分で作った変数でしょうから
自分で作るとは、変数宣言をすることですか?
だとすれば、変数宣言をしていませんので、自分では作っていませんよ。
>直接リレーを駆動できるかは別問題です。GNDは必ず必要です。でないと信号線の電圧が解りません。
電圧計(テスター)も2本ありますよね?それと同じです。1本を繋いでも電圧は測れません。
あとはその出力にどの位の駆動能力があるかです。本当の信号のみなのか、LED程度は駆動できるのか、リレーも可能なのか?
ただ、普通はICの出力端子が繋いであるのでLED程度までです。トランジスタアレイあたりが繋がっていればリレーも大丈夫です。
※SEC基板やスムースステッパーの事はかなり忘れています。TRさんのポンプ制御も回路の方はすっかり忘れています。
こういった込み入った話になると、やはり、誤解を招かないように、SECさんの以下のページを見ていただいた方が良いと思います。
http://sec-suzuki.com/PALA-CNC-V2.pdf
あとの事はもっと時間がかかりそうです。
なにせ、あちこち調べてプログラムを並べた状態ですから。
これ以上は、誤解を招く言動になりそうです。
ADCのプログラムでは、10ビット 0〜1023ですよね。
ADRESの判定を次のように記載してありました。
例
// (ADコンバート値が250未満の場合)
if( ADRES < 250 ) {
一部抜粋
// (ADコンバート値が250未満の場合)
if( ADRES < 250 ) {
timerValue--; // タイマー時間を減らす
// タイマー時間をLEDの点滅回数で表現する
RA5 = 0; // いったんLEDを消して
__delay_ms(500);
// 設定時間分LEDを点滅して、
for(i=0; i<timerValue; i++) {
RA5 = 0;
__delay_ms(200);
RA5 = 1;
__delay_ms(200);
}
RA5 = 0; // ちょっとの間LEDを消して、
__delay_ms(800);
RA5 = 1; // LEDを点灯する
} else {
// タイマー時間を増やすスイッチの処理
// (ADコンバート値が250以上750未満)
if( 250 <= ADRES && ADRES < 750 ) {
timerValue++;// タイマー時間を増やす
// タイマー時間をLEDの点滅回数で表現する
// 点滅制御方法は減らす場合と同じ
RA5 = 0;
__delay_ms(800);
for(i=0; i<timerValue; i++) {
RA5 = 0;
__delay_ms(200);
RA5 = 1;
__delay_ms(200);
}
RA5 = 0;
__delay_ms(800);
RA5 = 1;
}
}
例のようにADRESを1023の内、0〜250としています。
なので、自分も
if(ADRES > 400 ) {//ボリューム40%=400/1000μs
としたんだけど、
//ボリューム40%=400/1000μs 正しくは、
400/1023かな。
でも、5Vからとスレッショルド電圧2Vを考えた場合
2/5V×1023=約400となるから、
仮に、例のような使い方ができるのであれば、
if(ADRES > 400 ) {//2/5V×1023=約400
でいいような。
>レジスタが無ければ、自分で作った変数でしょうから
自分で作るとは、変数宣言をすることですか?
だとすれば、変数宣言をしていませんので、自分では作っていませんよ。
>直接リレーを駆動できるかは別問題です。GNDは必ず必要です。でないと信号線の電圧が解りません。
電圧計(テスター)も2本ありますよね?それと同じです。1本を繋いでも電圧は測れません。
あとはその出力にどの位の駆動能力があるかです。本当の信号のみなのか、LED程度は駆動できるのか、リレーも可能なのか?
ただ、普通はICの出力端子が繋いであるのでLED程度までです。トランジスタアレイあたりが繋がっていればリレーも大丈夫です。
※SEC基板やスムースステッパーの事はかなり忘れています。TRさんのポンプ制御も回路の方はすっかり忘れています。
こういった込み入った話になると、やはり、誤解を招かないように、SECさんの以下のページを見ていただいた方が良いと思います。
http://sec-suzuki.com/PALA-CNC-V2.pdf
あとの事はもっと時間がかかりそうです。
なにせ、あちこち調べてプログラムを並べた状態ですから。
これ以上は、誤解を招く言動になりそうです。
Re: PWM/ADリレー無し
ちょっと検索してみたのですけど、これは違うページの物ですね。
ただし、プログラムとしては、最大値1023のなかで、閾値として250と750を使っている、
というだけです。
私のプログラムのif(num==50)と閾値を50にしているのと何も変わりません。
そして、やはり%ではありません。
それは単にTRさんが簡単に理解しようと置き換えただけでしょう。
> 変数宣言をしていませんので、自分では作っていませんよ。
となるとレジスタを参照しているのですね。
で、御免なさい。No.1380 はADC読み取りのadconv関数自体が書いてあったのですね。
最期の}まで書いてありません。最後に付けただけの
unsigned int adconv() {
unsigned int temp;
GO_nDONE = 1; // アナログ値読取り開始指示
while (GO_nDONE); // 読取り完了まで待つ
if(ADRES > 300 ) {
temp = ADRESH; //上位8bit
temp = (temp << 8) + ADRESL; //RB3→RB4で読み込んだ値をtempに代入
return temp;
} //読み
}
なのかと思いますけど、これはあまり良くありません。
↓のようにすべきです。
unsigned int adconv() {
GO_nDONE = 1; // アナログ値読取り開始指示
while (GO_nDONE); // 読取り完了まで待つ
if(ADRES > 300 ) return ADRES;
else return 0;
}
まず、if(ADRES > 300 )の部分ですけど、
ADRES自体がコンパイラが、
ADRES=(ADRESH<<8)+ADRESL;
として、自動で値を取得してくれています。なので、もう一度同じ値を取得し直す必要はありません。
で、もっと重要な事はそれ以外の場合は0を返す(return 0;)、と言う事です。
※何も返さないのは、返す値が何でも良い場合のみにして下さい。「書かない場合は0を返す」と言う事ではありません。
それと、前にも言ったと思いますけど、こういった使いまわすような関数を弄るのはあまり良くありません。
つまり、ここで弄っているのでつまみの位置が約30%までがおかしくなっています。
なので、ここでは、
@
unsigned int adconv() {
GO_nDONE = 1; // アナログ値読取り開始指示
while (GO_nDONE); // 読取り完了まで待つ
return ADRES;
}
として、メイン関数のループの方で、
num=adconv();//adcを読み込んで
if(num<=300)num=0;//300以下なら0にする。
とした方が間違いが無くなります。
で、私のプログラムでは上記の@で、ストレートにADCの値を取得した上で、
num=adconv();//adcを読み込んで
num=(num-50.0)*(1023-500)/(1023-50)+500;//変換式
CCPR1L =num>>2 ;
CCP1CONbits.DC1B = num&3;
です。
SEC基板の出力段は74HC540なので、直接制御ならLED程度ですよ。
ただし、プログラムとしては、最大値1023のなかで、閾値として250と750を使っている、
というだけです。
私のプログラムのif(num==50)と閾値を50にしているのと何も変わりません。
そして、やはり%ではありません。
それは単にTRさんが簡単に理解しようと置き換えただけでしょう。
> 変数宣言をしていませんので、自分では作っていませんよ。
となるとレジスタを参照しているのですね。
で、御免なさい。No.1380 はADC読み取りのadconv関数自体が書いてあったのですね。
最期の}まで書いてありません。最後に付けただけの
unsigned int adconv() {
unsigned int temp;
GO_nDONE = 1; // アナログ値読取り開始指示
while (GO_nDONE); // 読取り完了まで待つ
if(ADRES > 300 ) {
temp = ADRESH; //上位8bit
temp = (temp << 8) + ADRESL; //RB3→RB4で読み込んだ値をtempに代入
return temp;
} //読み
}
なのかと思いますけど、これはあまり良くありません。
↓のようにすべきです。
unsigned int adconv() {
GO_nDONE = 1; // アナログ値読取り開始指示
while (GO_nDONE); // 読取り完了まで待つ
if(ADRES > 300 ) return ADRES;
else return 0;
}
まず、if(ADRES > 300 )の部分ですけど、
ADRES自体がコンパイラが、
ADRES=(ADRESH<<8)+ADRESL;
として、自動で値を取得してくれています。なので、もう一度同じ値を取得し直す必要はありません。
で、もっと重要な事はそれ以外の場合は0を返す(return 0;)、と言う事です。
※何も返さないのは、返す値が何でも良い場合のみにして下さい。「書かない場合は0を返す」と言う事ではありません。
それと、前にも言ったと思いますけど、こういった使いまわすような関数を弄るのはあまり良くありません。
つまり、ここで弄っているのでつまみの位置が約30%までがおかしくなっています。
なので、ここでは、
@
unsigned int adconv() {
GO_nDONE = 1; // アナログ値読取り開始指示
while (GO_nDONE); // 読取り完了まで待つ
return ADRES;
}
として、メイン関数のループの方で、
num=adconv();//adcを読み込んで
if(num<=300)num=0;//300以下なら0にする。
とした方が間違いが無くなります。
で、私のプログラムでは上記の@で、ストレートにADCの値を取得した上で、
num=adconv();//adcを読み込んで
num=(num-50.0)*(1023-500)/(1023-50)+500;//変換式
CCPR1L =num>>2 ;
CCP1CONbits.DC1B = num&3;
です。
SEC基板の出力段は74HC540なので、直接制御ならLED程度ですよ。
猛牛ロック 2018/12/30(Sun) 12:37 No.1400
Re: PWM/ADリレー無し SWもなし全てプログラム
猛牛ロックさん、すでに実機に取り付けましたので、
いただいた改良案は、今後の参考にしたいと思います。
それで、色々と書いてあるので。
全て記載してください。
私のようなものには、間違って受け取る恐れがあるからです。
%の件ですがありますよ。
PWMのページです。私が紹介したページにあります。
最初自分はPWMの方で、何とかしたいと考えていましたので、何回か見ました。
それと、もう一言、耳が痛いかもしれません。
それは、「前にも言いましたが」という言い方を何度もするのは、止めた方が良いですよ。
まるで人の話を聞いていないだろうといわんばかりに聞こえます。
猛牛ロックさんが言われても理解できないでいたり、興味がなかったりして忘れてしまうとか、色々とありますので。
他にもありますが、この辺で辞めます。ともかく悪気があっての行動ではないのです。
なので、何度も言われると気分が良くないです。
いただいた改良案は、今後の参考にしたいと思います。
それで、色々と書いてあるので。
全て記載してください。
私のようなものには、間違って受け取る恐れがあるからです。
%の件ですがありますよ。
PWMのページです。私が紹介したページにあります。
最初自分はPWMの方で、何とかしたいと考えていましたので、何回か見ました。
それと、もう一言、耳が痛いかもしれません。
それは、「前にも言いましたが」という言い方を何度もするのは、止めた方が良いですよ。
まるで人の話を聞いていないだろうといわんばかりに聞こえます。
猛牛ロックさんが言われても理解できないでいたり、興味がなかったりして忘れてしまうとか、色々とありますので。
他にもありますが、この辺で辞めます。ともかく悪気があっての行動ではないのです。
なので、何度も言われると気分が良くないです。
Re: PWM/ADリレー無し
> TRさんへ
私が「%とは何のことを言っているのか判らない」といったので、No.1399の例を載せたのですよね?
これを見ると
・if( ADRES < 250 ) {
・if( 250 <= ADRES && ADRES < 750 ) {
あたりを指しているのだと思ったのですが、閾値、つまり250や750辺りの事を言っているのだと思うのですが
違うのでしょうか?
正確には%というよりも、千分率とみなして考えた方が簡単、ということですよね?
で、数値としては千分率として250で比較しても、%として考えて250で比較しても、1023まであるとして250で比較しても
それは個人の頭の中の問題です。やっている事は
if( ADRES < 250 )
とADRESと250を比較していれば同じ事です。
私が
if(num<50){
としているのとどこに違いを感じるのかが解りません。
> 全て記載してください。
このあたりも、どこの部分を言っているのか、逆に記載してください。
私の中では、自分が同じ事をくどいように説明しているように感じています。
逆に、どの部分を言っているのか、範囲を絞って1つずつ消化する方がいいと思うのですけど。
> %の件ですがありますよ。
> PWMのページです。私が紹介したページにあります。
> 最初自分はPWMの方で、何とかしたいと考えていましたので、何回か見ました。
そのページのどの部分かを具体的に言ってください。
「そのページにあります」「何回か見ました」では判りません。
似たような部分は
> // 5% -> 100%の制御
> for(duty=50; duty<=1000; duty++) {
があります。これの事ですか?
これはduty比を1000までにして上の部分の23を切り捨てて簡単に考えています。
でも、既にNo.1398で、
> で、別にそのページでは%では書いてありませんよ。
> っていうか、単に1023の23の部分を切り捨てて単純に考えたい、という意味ですか?
と聞きました。でもそこでは無いような感じのNo.1399のレスを返されました。
なので、一体どの部分を言っているのか、全く不明です。
<<追記>>
普通、%で制御というのは、10ビットの場合は1023が上限なので、そこが100%にあたります。なので、
int percent_adc=ADRES*100.0/1023;
のようなことをして、100分率に直して使います。
なので、面倒なひと手間が入ります。
勿論、PWMへの出力なら逆に100(%)→1023変換になります
これは、表示器で入出力を%で表示したい場合によく使われる手法です。
私が「%とは何のことを言っているのか判らない」といったので、No.1399の例を載せたのですよね?
これを見ると
・if( ADRES < 250 ) {
・if( 250 <= ADRES && ADRES < 750 ) {
あたりを指しているのだと思ったのですが、閾値、つまり250や750辺りの事を言っているのだと思うのですが
違うのでしょうか?
正確には%というよりも、千分率とみなして考えた方が簡単、ということですよね?
で、数値としては千分率として250で比較しても、%として考えて250で比較しても、1023まであるとして250で比較しても
それは個人の頭の中の問題です。やっている事は
if( ADRES < 250 )
とADRESと250を比較していれば同じ事です。
私が
if(num<50){
としているのとどこに違いを感じるのかが解りません。
> 全て記載してください。
このあたりも、どこの部分を言っているのか、逆に記載してください。
私の中では、自分が同じ事をくどいように説明しているように感じています。
逆に、どの部分を言っているのか、範囲を絞って1つずつ消化する方がいいと思うのですけど。
> %の件ですがありますよ。
> PWMのページです。私が紹介したページにあります。
> 最初自分はPWMの方で、何とかしたいと考えていましたので、何回か見ました。
そのページのどの部分かを具体的に言ってください。
「そのページにあります」「何回か見ました」では判りません。
似たような部分は
> // 5% -> 100%の制御
> for(duty=50; duty<=1000; duty++) {
があります。これの事ですか?
これはduty比を1000までにして上の部分の23を切り捨てて簡単に考えています。
でも、既にNo.1398で、
> で、別にそのページでは%では書いてありませんよ。
> っていうか、単に1023の23の部分を切り捨てて単純に考えたい、という意味ですか?
と聞きました。でもそこでは無いような感じのNo.1399のレスを返されました。
なので、一体どの部分を言っているのか、全く不明です。
<<追記>>
普通、%で制御というのは、10ビットの場合は1023が上限なので、そこが100%にあたります。なので、
int percent_adc=ADRES*100.0/1023;
のようなことをして、100分率に直して使います。
なので、面倒なひと手間が入ります。
勿論、PWMへの出力なら逆に100(%)→1023変換になります
これは、表示器で入出力を%で表示したい場合によく使われる手法です。
猛牛ロック 2018/12/30(Sun) 16:25 No.1402
Re: PWM/ADリレー無し SWもなし全てプログラム
この話題は、一旦止めにしましょう。
本日のちょい試運転では、動作しましたので、
今後、様子を見ます。
本日のちょい試運転では、動作しましたので、
今後、様子を見ます。
Re: PWM/ADリレー無し SWもなし全てプログラム
それが良いですね。年末ですし(^^)/
猛牛ロック 2018/12/30(Sun) 17:55 No.1404