050157
48時間以内の記事は New Mark で表示されます
Eagle断念
皆さんこんにちは。
少し前からここで、PICによるポンプ制御をやってきましたが、
昨日、壊れたポンプを写真のポンプに交換しました。
今度も中華製ですが、少し弄って思いましたけど、
最近の中華製は、品が良くなってきたと思いました。
安いし、、、ますます日本製が負けそうです。


表題ですが、
プリント基板作成ソフト Eagleを少しかじってみました。
それでなんですが、FISION360に取り込むのが、めんどくさそうです。
あまり手掛けない基板なので、断念しました。
以下のURLをみたら、げんなりしました(苦笑
https://ehbtj.com/electronics/make-circuit-board-with-cnc/

TR 2019/01/16(Wed) 11:13 No.1423  記事編集
Re: Eagle断念
TRさん,猛牛ロックさん,こんばんは。

またまた亀レスです。

Eagleですけど,Autodeskの傘下に入ったようですね。

詳しくみてないのですが,Gコードも楽にだせるかも・・・。





猛牛ロックさん,ちょっとお聞きしたいのですが,

PIC等のヘッダーファイルから,

コンパイルが通る正しい表記が推測できるのでしょうか?

#deefine

の部分は分かるのですが,

その後に書かれている構造体の意味がちょっと不明です。

具体的に書くと,

次のような記述から, PCONbits.OSCF という表記がわかるのでしょうか。

// Register: PCON
#define PCON PCON
extern volatile unsigned char PCON __at(0x08E);
#ifndef _LIB_BUILD
asm("PCON equ 08Eh");
#endif
// bitfield definitions
typedef union {
struct {
unsigned nBOR :1;
unsigned nPOR :1;
unsigned :1;
unsigned OSCF :1;
};
struct {
unsigned nBO :1;
};
struct {
unsigned nBOD :1;
};
} PCONbits_t;
extern volatile PCONbits_t PCONbits __at(0x08E);
mabo   2019/01/22(Tue) 23:16 No.1424 記事編集
Re: Eagle断念
eagleからdxfやNCコードの出力は、ulpを選べば出来ます。
ただ、雑多にいろんな物があるので選択するのも大変です。
印象ではJWWの外部変形みたいな感じで、同種類のものが複数あります。
fusionに取り込むならdxfからになるのかな?

一番面倒なのは新規部品を作らなければならない所ですね。


> MABOさん

私の場合はちゃんと学習した訳ではないので、何となくしか判りません。
そしてこのような記述を私自身がしたことはありません。

で、私の理解ではこの記述部分は、「その機能はあるけれど、アドレスしかないレジスタの場所に
名前を付けている」所です。

・変数PCONのレジスタの番地が0x8Eにある。=0x8eのアドレスを変数PCONと名付けている
・共用体変数PCONbits_tは下位から、nBOR(1bit),nPOR(1bit),※空き=リザーブ(1bit),OSCF(1bit),nBO(1bit),nBOD(1bit)となっている。
 ※多分上位2bitは空きだと思います。
・共用体変数PCONbits_tもアドレスは0x8eである

と言う事だと思います。で、
PCONbits_t.OSCF=0;
と書けばこの0x8eにあるレジスタ(PCON)の下から4番目が0になります。


<追記>
ちょっと間違えたかもしれません.

extern volatile PCONbits_t PCONbits __at(0x08E);

の部分はPCONbits_tの形をしたPCONbits変数という意味で、変数名としてはPCONbitsになるのかもしれません。
それだと
PCONbits.OSCF=0;
という形ですね。
猛牛ロック   2019/01/23(Wed) 01:21 No.1425 記事編集
Re: Eagle断念
皆さんこんにちは。
PIC、やっていますね。

構造体って言葉をつい最近耳にしました。
理解しようとしたけど、資料が見つからず断念しています。
分かりやすく解説されていたらいいのに。


実は、今日、やっと、SEC基板へのインターフェース(自作)を直せました。
作った当時は、電気が分からなくて、大変でした。
図面も引けずに、なんちゃって実態配線図(笑
その祟りで、分かるまで時間がかかりました。
今思えばってことが、出てきました。
時間ができたら、改良したいです。


写真は、自作インターフェースを収めた操作盤の中です。

今回、ついでに、最新のMach3とスムースステッパーのソフトも入れなおしました。
が、相変わらず、一度だけでしたが、エラーを起こして停止しました。
ま〜、今回のソフトの入れなおしたことによって、エラーは断然減った感じです。

TR   2019/01/23(Wed) 16:10 No.1426 記事編集
Re: Eagle断念
TRさん,猛牛ロックさん,こんにちは。



******TRさん*****

TRさん,制御基板ののボックご紹介ありがとうございます。

きれいにまとまってるので,うらやましく思いました。

私はいつもそうなんですけど,後で自作のもの見てみると,

なんでこんなことやったのか,わからなくなりますので,

いつも記録は大事だななんで毎回思ってます。

まあ,そのためのブログでもあるんですけど。


構造体は,

http://www.isl.ne.jp/pcsp/beginC/C_Language_14.html

あたりにも説明ありますよ。私も一番苦手な部分です。

構造体やポインタの操作になると,頭かかえてしまいます。


======猛牛ロックさん=====

猛牛ロックさん,丁寧なご説明ありがとうございます。

やっと,なんとなく分かりかけました。(笑)

PCONbits_t.OSCF になるか PCONbits.OSCFなるのか,

明確に分かるような記述がヘッダーファイルにでもあると,とても親切だと思うのですが,

諸兄のみなだんは,この辺は,難なくクリアーなのかなあと思ったりしてます。


それから,もう一つ相談なのですが,今,カラーセンサーの読み取りに挑戦してます。

秋月のS9706というセンサーなんですが,プログラムで,

ポーリングがいいか,割り込みがいいか,思案してます。

読み取りに手順は,

   10ms程度,データを積算で取り込む
   次の36パルスでデータを読み込む

という動作なのですが,これ,割り込みで処理する意味あるでしょうか。

諸兄のプログラム見ると,みなポーリングのようです。



本日,部品が届いたので,変換基板に半田付け線をつけました。

mabo   2019/01/24(Thu) 14:33 No.1427 記事編集
Re: Eagle断念
遅レスになりました。

データシートを見ましたけど、基本的にはどちらでも良いと思います。
積算時間も10ms固定なら__delay_ms(10)で済みますけど、
暗い条件だと100msや1sにしないと測定できません。
どうするかは「その他の処理」次第ですね。

センサーも1個なのか複数なのか?1回測定するだけなのか、測定し続けて処理するものをつくるのか?
そして、その結果を受けて、単に表示するだけなのか、連続して動作させるものを作るのか?とか、全体の条件です。
猛牛ロック   2019/01/27(Sun) 10:47 No.1428 記事編集
Re: Eagle断念
TRさん,猛牛ロックさん,こんにちは。



***************TRさん,

MACHの情報ありがとうございます。

後で,試してみたいと思います。





***********猛牛ロックさん,

猛牛ロックさん,アドバイスありがとうございます。

まあ,どっちでもいいといいうことで,

備忘録かねて,後日割り込み使おうと思います。


センサーは一つで,一回限りの測定の予定で,

処理は,センサーの青と緑で,スイッチを短時間,ONにするだけなので,

超単純な処理です。
mabo   2019/01/28(Mon) 14:36 No.1431 記事編集
ワーク原点
皆さん、こんにちは。
ひょんなことから、MACH3のワーク原点の使い方が分かりました。
これで、切削が簡単になりました。
今更かもしれませんが、超ハッピー
写真は、Alt5の画面にある、ワーク原点SAVEをクリックすると、現れるエディターです。
これをSAVEすれば、セットされます。
後は、機械原点に戻り、MACH3にロードしたTAPファイルをスタートさせれば、
切削をし、その後、機械原点に自動で戻ります。

TR 2019/01/27(Sun) 11:00 No.1429  記事編集
Re: ワーク原点
写真は、ワーク座標がセットされ、且つ、機械座標の原点 0を保持している画面です。
みんなにも知ってほしいと思ったので、HPに詳しくアップしなおしました。

TR   2019/01/27(Sun) 11:28 No.1430 記事編集
謹賀新年
皆さん明けましておめでとうございます。

今日は、超久しぶりに、元朝参りに行きました。
区長ってご存知ですか?
都会では死語かも。
実は、今年度、区長になりまして、地域住民と行政のパイプ役を担っています。

元朝参りも、区長の仕事の一つです。
神社でお札を預かってきて、希望者に配ってきました。
勿論、希望者はお金を払っています。


話題替わって、昨年末からのAD変換ですが、
以下のように、ひと工夫をして、
ボリュームの開き具合に応じて、低中高の3段階に分けて、
点滅速度に変化を付けました。
結構楽しんでいます。

今年も、どうぞ、宜しくお願いします。

unsigned int adconv() {
GO_nDONE = 1; // アナログ値読取り開始指示
while (GO_nDONE); // 読取り完了まで待つ
//3段階動作表示用LED点滅
if (RB7 = 1 && ADRES < 500) {
LATA1 = LATA0 = 1;
__delay_ms(50);
LATA1 = LATA0 = 0;
__delay_ms(20);
}
else if (RB7 = 1 && 500 <= ADRES && ADRES < 800) {
LATA1 = LATA0 = 1;
__delay_ms(25);
LATA1 = LATA0 = 0;
__delay_ms(10);
}
else if (RB7 = 1 && 800 <= ADRES) {
LATA1 = LATA0 = 1;
__delay_ms(10);
LATA1 = LATA0 = 0;
__delay_ms(5);
} else {
LATA1 = LATA0 = 0;
}
return ADRES;
TR 2019/01/01(Tue) 20:49 No.1412  記事編集
Re: 謹賀新年
あけましておめでとう御座います。
今年もよろしくお願いいたします。

元朝参りも、ずーっとしていませんね。
それどころか、ここ数年は初詣もしていません。
寒いのは苦手なんです。それに大酒のみなので。
昨日はタクシーで実家に行きました。


> if (RB7 = 1 && ADRES < 500) {
文法的に間違いでは無いのでエラーにはなりませんけど、多分思っている事とは違います。
本当は「==」だと思います。

で、その文の意味は
RB7=1
の部分はRB7に1が代入されて評価されます。
1で代入なので常に真です。
なので、そのままの意味なら

RB7=1;
if(ADRES < 500) {
と同等の意味になります。
※そこ部分をRB7=0とした場合は常にRB7は偽なので、if文も常に偽になります。

あと、もう一つは、この位の点滅間隔だと「点滅の速さ」では無く「明るさ」の違いになります。
でも、3つの点滅パターンは点灯:消灯の割合は50:20(71%)、25:10(71%)、10:5(67%)と、どれも同じ程度の明るさです。、
「チラ付き具合の区別」という感じです。
点滅間隔での判断なら、全点灯/0.6s毎の切り替え/0.2秒毎のきりかえ、のような3段階が良いと思います。
明るさで判断したいなら、全点灯/40%/10%等のduty比にした方が良いです。そして、チラつきがを感じないような
100Hz程度以上の周波数にした方が良いです。
※でも識別としてはどうしても点滅間隔には敵いません。明るさは変化して比較対象が無いと難しいです。
プログラムのデバッグとしても、明確に、「どこの部分で止まっている」かを識別できるようにした方が良いです。


void adconv(void) {//戻り値が必要でないなら
GO_nDONE = 1;
while (GO_nDONE);

if (RB7 == 1) { //RB7がHIGH
if (ADRES < 500) {
LATA1 = LATA0 = 1;
} else if (ADRES < 800) {
LATA1 = LATA0 = 1;
__delay_ms(600);
LATA1 = LATA0 = 0;
__delay_ms(600);
} else {
LATA1 = LATA0 = 1;
__delay_ms(200);
LATA1 = LATA0 = 0;
__delay_ms(200);
}
} else {//RB7がLOW
LATA1 = LATA0 = 0;
}
}
猛牛ロック   2019/01/02(Wed) 15:39 No.1413 記事編集
Re: 謹賀新年
猛牛ロックさん、おめでとうございます。

お〜!
大酒のみだったんですか。
自分は、ほどほどの程度です。 でも、晩酌はやっています、習慣になています。


>> if (RB7 = 1 && ADRES < 500) {
文法的に間違いでは無いのでエラーにはなりませんけど、多分思っている事とは違います。
本当は「==」だと思います。


これ、掲示板に書き込んだ後に気づきまして、速攻で治しました(笑い。
この件も、何度も言われていましたので、気付きました。


>void adconv(void) {//戻り値が必要でないなら

本当にそうでした。
何故か、PWMが動作しなくなりました。

それと、点滅を加えたら、動作が緩慢になりました。
32MHzにしないと駄目かもしれません。
テスト中の話ですが、気のせいか、PICがほんのりと暖かなったような気がします。

追記
自作の基板は、プリントですか?

それと、はんだ付けの際、ピンセットを使いますか?
https://www.amazon.co.jp/dp/B07C4MPJSW/?coliid=I38WVPZXS6XWWP&colid=1PYQ17QDJ13GR&psc=0&ref_=lv_ov_lig_dp_it
TR   2019/01/02(Wed) 19:53 No.1414 記事編集
Re: 謹賀新年
> 何故か、PWMが動作しなくなりました。
> それと、点滅を加えたら、動作が緩慢になりました。
何ででしょうね?多分、動作クロックのせいではないと思います。

> PICがほんのりと暖かなったような気がします。
これが関連しているのかも知れません。暖かくなるというのはそれだけPICの出力があると言う事です。
全体のプログラムや回路が解らないのですけど、もしかしたら出力が多すぎるのかも知れません。
※大きく見れば、PICも1つの抵抗のような物です。PICの内部を流れる電流の量によって、PICが発熱します。


今回は片面の生基板を使っています。大抵は?CNCで削っています。
添付図はその図面です。
(大小1つずつでよかったのですけど、それだけ同時に作りました。)

手配線は苦手です。また、ケースなどに綺麗に収めるのも苦手です。


そのピンセットは良さそうですね。セラミックですか。
かっこいいのに安くあるんですね。
はんだ付けの時にはちょっとだけ使いますね。でも普段使っているステンレスのやつです。

基板のはんだ付けは、左手に半田、右手にコテなので、前後の作業ですね。
あっ、SMDの抵抗とかはピンセットも使います。
でも、はんだ付けも素人レベルですよ。
一番重要なのは顕微鏡だと思います。

猛牛ロック   2019/01/02(Wed) 23:52 No.1415 記事編集
Re: 謹賀新年
TRさん,猛牛ロックさん,新年おめでとうございます。

今年もよろしくお願いいたします。

=====================
TRさん,私も何年構えに,やったことあります。

私の地区は,いくつかの組が集まって,藩が組織され,

藩がいくつか集まって,町の組織になり,その上に市の組織があります。

私がやったのは一番下の組の組長です。

まあ,仕事と言えば町内会費を集めることと,回覧板を

まとめて,回覧できるようにする手はずぐらいです。

私も,例年通り元旦参りいきましたよ。


**************************

猛牛ロックさん,

>今回は片面の生基板を使っています。大抵は?CNCで削っています。
>添付図はその図面です。
(大小1つずつでよかったのですけど、それだけ同時に作りました。)

いいですねえ。CNCで基盤削れれば,配線のミスもすくなくなりますよね。

今年は,挑戦してみるかなあ。
mabo   2019/01/03(Thu) 21:08 No.1416 記事編集
Re: 謹賀新年
配線を描いて、mach3用プログラムの為のソフトは何を使っていますか?
TR   2019/01/04(Fri) 14:59 No.1417 記事編集
Re: 謹賀新年
配線はJWWです。ここでの投稿も作図したものは殆どJWWで書いています。
基板自体は、EAGLEやKiCADを使って見たことはありますけど、暫く使っていません。
部品図面や高さなどの検討だとどうしても、JWWが必須となります。
そうなると、そのままそこに配線も書きだしていく、という感じになっています。

で、それをNCVCでNCコードにしています。

プログラミング(IDE)はPRO MICROでもSTM32ボードでも、ARDUINO IDEです。

あとよく使うのは(OPEN OFFICEの)CALCです。(EXCEL相当のソフト)
ダイヤル部の加工などは、JWWでの座標(点)を拾って、CALCで編集しています。


<追記>
> 配線を描いて、mach3用プログラムの為のソフトは何を使っていますか?

もしかして、これはドライバ的な事を聞いたのでしょうか?
それなら何もありませんよ。
私の作ったのは変形キーボードです。なので、ウィンドウズの標準ドライバで、HIDキーボードと認識します。
MACHにとっては通常のキーボードの↑↓→←等のキーで操作するのと何も変わりません。

猛牛ロック   2019/01/05(Sat) 05:29 No.1418 記事編集
Re: 謹賀新年
因みに、回路図もさっき書きましたけど、添付図のような簡単な物です。
STM32なら、右側は「+」「-」「STOP」と同じ様にSWのみです。
(なので、簡単すぎて図面も書く必要が無かったのです)

添付図にある、抵抗値だけはちょっと気を使っています。
※この部分は以前やった事のある抵抗値を使いまわしています。

この割合にすると、
char num=(analogRead(A1)+72)>>7;//72は適当な幅を持たせるためのもの
とすると、numが
8の時はどのボタンを押していない。
0〜7ならその数字に相当するボタンを押している
となります。同時押しは通用しません。

LED出力はありますけど、それはマイコン外でのSW処理です。
(でもマイコンコントロールにした方がよかったかも?)
本当は単色=白を予定していたのですけど、丁度いい高さのスライドスイッチが見つからず、
他で使っているのと同じ3ポジションの物を使って、半ば仕方なく赤青2色LEDにしました。

今更ですけど、ボタン確認用のブザー、或いはLEDを付けておいても良かったな、と思っています。

猛牛ロック   2019/01/05(Sat) 06:17 No.1419 記事編集
Re: 謹賀新年
>配線はJWWです。ここでの投稿も作図したものは殆どJWWで書いています。

そうでしたか。

抵抗等の穴あけピッチは、逐一、インチで計算して作図しているのですか?
そして、Z軸の掘り下げる深さはどれくらいにしているのでしょうか?
きっと、FUSION360でも出来そうですね。
TR   2019/01/05(Sat) 10:25 No.1420 記事編集
Re: 謹賀新年
電気系の場合は等倍で、目盛(GRID)を2.54で、1/2を標準にしていますね。
もちろん、途中で、切り替えることもあります。

新規部品を書くときには寸法を入れますけどインチを入れる事は殆ど無いです。
大抵の図面でもmmでかいてありますから。

基板のパターン切削なら、0.1mmです。穴は2.3か2.4程度だと思います。
勿論、FUSIONでも出来るでしょうけど、基板パターンだけならやはり基板CADの方が簡単でしょうね。
線がくっ付いて連動して動きますし、配線チェック機能もあったりしますから。

※はんだ付けはやはりプリント基板の方がやりやすいですよ。
何といっても予備半田がしてありますから、SOPとかTQFPなんかだと小手を押しあてただけでも綺麗にくっついたりします。
猛牛ロック   2019/01/05(Sat) 11:03 No.1421 記事編集
Re: 謹賀新年
こんなページを発見してしまった。(フォルムさんの所です)

arduino テパ
http://forme26a.blogspot.com/2017/02/arduino.html

やっぱりSTMボードにしておけば良かったなぁ〜。
PRO MICROは誰でもやりそうだし。(といっても誰もいないと寂しいかも)
でもこれ、何でPRO MICROを同じ面に付けてるんだろう?
単に試作用、と言う事かな?

基板も超シンプルです。GNDは思いっきり共通ですね。こうした方が良いのかなぁ?
猛牛ロック   2019/01/06(Sun) 16:31 No.1422 記事編集
大晦日のご挨拶

今年もいよいよ終わりですね。
大変お世話になりました。

今年は例年になく、あっという間に終わったって感じがします。
お陰様で、病気や怪我もなく過ごせました。

今日は、最後の大掃除、適当にやって、後は好きな事でもやります。

それから、モーターのPWM制御ですが、写真がそれです。一応、完成としました。
以前のものは、秋月のPWMキットと、SEC基板からの信号を受けるボードの2枚が必要で、大きなものでしたが、
PICにより、便利になり且つ、小さくなりました。
これも、皆様方のお陰です。
来年も宜しくお願いします。

TR 2018/12/31(Mon) 08:13 No.1406  記事編集
Re: 大晦日のご挨拶
私の疑似手パの方は、一応、完成目前です。
あと残るのは
・若干のコードの書き換え
・表示シール
・USBケーブル(1.5mのケーブルだとちょっと短かったので3mのを発注)
位になりました。

動作確認をしたのですけど、例えば1クリックあたり1mmや0.1mmだと
速く回すとバッファに溜まった分が、ダイヤル停止後もマシンが動きます

この辺りがやりにくいように感じました。
というか、1mmのレンジは逆に誤動作に繋がりやすいので付けない方が賢明でした。
MABOさんの手パはその辺りはどうなっているのでしょうか?

私はその位置(1mmのレンジを予定していたスライドスイッチ位置)は疑似パワーオフ=操作不可にしようかと思っています。


それと、ダイヤルを回すと↑→などのキーを送っているのですけど、STEP指定は送っていません。
デフォルトでSTEPにしているからです。
でも、途中で、PC画面上でCONTに切り替えた場合に、切り替えた事を、疑似手パが判っていないのでCONTモードに
なってしまっています。
そのあたりの、例えば
・前回動作から1秒以上経過していてダイヤルが回ったらSTEP指定のコードを入れる&誤動作防止の為に
 1クリック目は回さない
 つまり、前回から1秒経過していたら、最初のクリックはSTEP指定を入れて、経過していなければ動かすキーコードをいれる
という対処にしようと思います。
ていうか、その部分のコードは既に書き換えました。疑似パワーオフの方は全体を見なければならないのでまだです。

もう一つ残念な点は、おもちゃエンコーダなので、ダイヤルを付けると径が大きくてクリック感が少なくなります。
そうなると、回りやすくなってしまい、誤動作に繋がりやすいと思います。
なので、自分で割りを入れて、停止位置を作るかもしれません。でも、それは後に置いといて、取りあえずそのまま使おうと思います。


いやー、実は新PCの方なのですけど、使っていたら何故かMACHが立ちあがらなくなってしまって、
「MACH3を起動すると同時にPCが再起動する」、という現象に見舞われました。
PCとしては何の異常も感じられずサクサク動きます。
で、パラレルドライバやMACHの再インストール等をしてなんとかMACHを起動させるところまで行っても、
何故か軸は動かない(けれども、リミットスイッチ等は反応している)という状況でした。
で、パラレルドライバ?を違う設定に変えたら、またPCの再起動になったり…と、堂々巡りです。
結局、OSのリカバリーから始めて、前のPCに付いていたグラフィックボードを取り付けたら安定しました。

その後に、手パの基板切削やダイヤル部の加工などを、テストを兼ねてしていたのですけど、その間は何も問題無しです。


プログラム上で一番困難だったのは、文字コード→キーコード変換でした。
送った2バイトのコードはMACH3に付いているSCREEN4で、ホットキー入力の時に確認できるのですけど、
実際に、マイコンから送られるコードが、ちょくちょくそれと一致しないんですよね。
特にCtrl+Altを使うと全然違うキーコードが生成されたりします。
ALTだけでも、例えばMACH3の停止(STOP)はALT+Sキーですけど、
Keyboard.press(KEY_LEFT_ALT);
Keyboard.press('s');
とSが小文字の方じゃないと駄目だったりです。
マイコンからは、コードを書いてマイコンに書き込んで、SCREEN4のその画面で試して同じ数字になるかを確認、
みたいなことをしないと何番を実際に送っているのか判らないので大変でした。
また、WINDOWSやMACH3自体に使われているショートカットキーがはっきりしないので、どのキーに割り当てていいのか?という部分が
思いのほか手間取りました。

探せばどこかに一覧表みたいなものがあるのでしょうか?

まぁ、思わぬ所に落とし穴はあるものです。

猛牛ロック   2018/12/31(Mon) 10:06 No.1407 記事編集
Re: 大晦日のご挨拶
完成まじかまで来てよかったですね。
猛牛ロックさんならできるのでしょうけど、凄いですよ。

ちょっとだけ教えてください。

No.1386で、
>実際は前の数行の内の50→50.0と「.0」を付けてほしい、と言う事です。
と言っていますが、どうして0を付けないといけないのでしょうか?
宜しくお願いします。


追記
ネットで「浮動小数点」で検索したら、ありました。
コンピューターの世界のことのようですね。
桁数あふれを起こさないように、小数点以下第1位の0を付けて計算させた訳ですね。
TR   2018/12/31(Mon) 11:50 No.1408 記事編集
Re: 大晦日のご挨拶
これにはintが何ビットなのか、つまり何ビットを標準にしているコンパイラなのか?という問題があります。
ウィンドウズのCコンパイラなら大抵は32bitですけど、8ビットマイコンのコンパイラは大抵は、16bitがint=基準となる
整数の型です。XC8もintは16bitです。

で、計算する過程は標準で16bitまでの計算になります。つまり計算用に16bitのメモリが用意されます。
例えば
unsigned char a=256*256/512;
とした場合、通常の計算なら128ですけど、256*256の計算ですでに0x10000(65536)なので、0x「1」0000の
1はメモリ範囲外になるので消えて0になります。つまり0/512でaが0になります。
※ただしこの式の場合は、マイコンには計算式は入らす、コンパイル過程で、すでに「256*256/512」を計算して
元々unsigned char a=128;と書かれているプログラムとして、コンパイルされると思います。256が変数として考えてください。

long a=
とした場合は最初から32bitが計算用のメモリとしてあてがわれます。

計算順序は四則演算はおおよそ普通の計算と同じです。
()カッコが付いている部分が優先され、次に*/%が優先され、次に+-で最後は=です。
そして、x/%+-は左から右に計算されます。=は右から左です。

num=(num-50)*(1023-500)/(1023-50)+500;
は、ちょっと変形(計算)すると
num=(num-50)*523/973+500;
なので、最初の(num-50)*523の段階で、numが175程度の段階で桁が溢れます。

あとは暗黙の型変換、というものを理解する必要があります。
charとintとの計算ではintとして計算されます。
intとlongではlongとして計算されます。
charやintやlongとfloatの計算ではfloatとして計算されます。
つまり範囲の広い方で計算されます。

なので、50ならばintとして16bitの整数ですけど、50.0と「.0」を付けるとそれはfloat型の浮動小数のメモリに配置されます。
で、(num-50.0)はfloatとして計算され、次に*523もまたfloat×intなのでfloatとして計算され、…となり、桁あふれにはなりません。
そして、最期の「num=」の時にそのfloat値がintとして変換されて代入されます。
猛牛ロック   2018/12/31(Mon) 13:17 No.1409 記事編集
Re: 大晦日のご挨拶
猛牛ロックさん早速にありがとうございます。

しかし、猛牛ロックさんが今回作った品は、お値段によると思いますが、
興味のある人に売れるんじゃないですか?
USB対応のようですが、自分のスムースステッパーに差し込んで使えるかな〜。
今の手パは、配線が凄いんです。
それと、作品は、自作の基板ですか?
いいですね〜。
自分はユニバーサルですよ。
流石です。
USB接続OKなら、すっきりとしますね。きっと。
TR   2018/12/31(Mon) 14:53 No.1410 記事編集
Re: 大晦日のご挨拶
猛牛ロックさん,TRさん,こんばんは。

===================
今年もおしせまりましたね。

いろいろありがとうございました。

勉強になりました。

来年もよろしくお願いいたします。
=================


*************************
猛牛ロックさん,

>というか、1mmのレンジは逆に誤動作に繋がりやすいので付けない方が賢明でした。
>MABOさんの手パはその辺りはどうなっているのでしょうか?

これ,すみません。私の環境では,確認していません。

というか,CNC等,を含めて,工房が実家の方にあるので,

このところ,いじってないのです。

という訳で,なんともいえないので,申し訳ありません。

それと,

>結局、OSのリカバリーから始めて、前のPCに付いていたグラフィックボードを取り付けたら安定しました。

は,原因はグラフィックボードだったんでしょうかね。

私も,念のためCNC用のPCには,ONボードのグラフィック外して,安いグラフィックボード挿してます。

もう一つ,

>マイコンからは、コードを書いてマイコンに書き込んで、SCREEN4のその画面で試して同じ数字になるかを確認、
みたいなことをしないと何番を実際に送っているのか判らないので大変でした。

察するに,猛牛ロックさんでも,ご苦労なさるんですから,難しいのかなあと思ってます。

ちなみに,くぐってみると,

http://blog-imgs-70-origin.fc2.com/g/a/r/garagejb/mkp13.jpg
http://blog-imgs-70-origin.fc2.com/g/a/r/garagejb/mkp14.jpg
https://blogs.yahoo.co.jp/borog_602/19815995.html

がヒットしました。
****************************


////////////////////////////////////////////////////////
TRさん,完成おめでとうございます。

ご自分で考えられて,それ,実用にしてしまうのですから,

いつも感心させられます。

私は,いつも,発想はいいのですが,途中挫折,

なんていうパターンが多いので,困ります。
mabo   2018/12/31(Mon) 19:50 No.1411 記事編集
PWM/ADリレー無し SWもなし全てプログラム
替えるのは 以下の1行でよろしいですか?

num=(num-50.0)*(1023-500)/(1023-50)+500;
TR 2018/12/29(Sat) 06:47 No.1385  記事編集
Re: PWM/ADリレー
> MABOさん
音量調整以外では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);
}
TR   2018/12/29(Sat) 12:05 No.1387 記事編集
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)で計算させるか、をしなければなりません。

猛牛ロック   2018/12/29(Sat) 12:29 No.1388 記事編集
PWM/ADリレー無し S全てプログラム
今やってみました。
完成したばかりの基板です。
VRを絞った状態が凄く不安定です。


CCP1CONbits.DC1B = num & 3;
マスク処理ですか?
この書き方は初めて見た感じです。
でも、2桁だけじゃないのかな〜。


グラフ有難うございます。
良く分かります。

TR   2018/12/29(Sat) 14:01 No.1390 記事編集
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は全く同じです。表記法が違うだけ=人が数えやすい形をそれぞれ作っただけです。
コンピュータにとってはどれも同じです。
猛牛ロック   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のスレッショル電圧に変えます。
スレッショルドでしたっけ?」
TR   2018/12/29(Sat) 16:48 No.1392 記事編集
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にする。

という意味合いですけど、これでいいのでしょうか?
猛牛ロック   2018/12/29(Sat) 20:56 No.1393 記事編集
Re: PWM/ADリレー無し SWもなし全てプログラム
TRさん,猛牛ロックさん,こんばんは。

プログラムの方は,混乱しないように,差し控えます。

プログラムではないのですが,以前,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は全て同調しています。
TR   2018/12/29(Sat) 22:03 No.1396 記事編集
Re: PWM/ADリレー無し SWもなし全てプログラム
maboさんこんばんは。

今回、VRも考えました。
手持ちに東京コスモスのいい奴があったので、現在試作中のボードに使ってみました。
でも、思ったんです。
MOSFETの場合、電圧制御なんですよね。
なので、プログラムで、SWを作れるって、
FETのVgsでしたっけ、
調べると、1〜2Vでした。
現在は、目標2Vにしました。
あとは実機につけて、微調整します。
これで、リレーも要らないし、SW代わりのフォトカプラーも要らない。


それと、やっとわかったんですが、
SEC基板のOUTPUTには、信号とGNDがセットになっています。
それは、直接、リレーなどを操作するために、信号線とGNDがセットになっていたんですね。
今回は、SEC基板の端子からは、信号線だけをRB7に繋げます。 その辺、図面が誤っていました。
勿論、電源は、全て一緒。スムースステッパー、SEC基板、今回のボードはすべて同じ電源です。
TR   2018/12/29(Sat) 22:21 No.1397 記事編集
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さんのポンプ制御も回路の方はすっかり忘れています。
猛牛ロック   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

あとの事はもっと時間がかかりそうです。
なにせ、あちこち調べてプログラムを並べた状態ですから。
これ以上は、誤解を招く言動になりそうです。
TR   2018/12/30(Sun) 06:47 No.1399 記事編集
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程度ですよ。
猛牛ロック   2018/12/30(Sun) 12:37 No.1400 記事編集
Re: PWM/ADリレー無し SWもなし全てプログラム
猛牛ロックさん、すでに実機に取り付けましたので、
いただいた改良案は、今後の参考にしたいと思います。
それで、色々と書いてあるので。
全て記載してください。
私のようなものには、間違って受け取る恐れがあるからです。


%の件ですがありますよ。
PWMのページです。私が紹介したページにあります。
最初自分はPWMの方で、何とかしたいと考えていましたので、何回か見ました。

それと、もう一言、耳が痛いかもしれません。
それは、「前にも言いましたが」という言い方を何度もするのは、止めた方が良いですよ。
まるで人の話を聞いていないだろうといわんばかりに聞こえます。
猛牛ロックさんが言われても理解できないでいたり、興味がなかったりして忘れてしまうとか、色々とありますので。
他にもありますが、この辺で辞めます。ともかく悪気があっての行動ではないのです。
なので、何度も言われると気分が良くないです。
TR   2018/12/30(Sun) 14:18 No.1401 記事編集
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変換になります
これは、表示器で入出力を%で表示したい場合によく使われる手法です。
猛牛ロック   2018/12/30(Sun) 16:25 No.1402 記事編集
Re: PWM/ADリレー無し SWもなし全てプログラム
この話題は、一旦止めにしましょう。
本日のちょい試運転では、動作しましたので、
今後、様子を見ます。
TR   2018/12/30(Sun) 17:00 No.1403 記事編集
Re: PWM/ADリレー無し SWもなし全てプログラム
それが良いですね。年末ですし(^^)/
猛牛ロック   2018/12/30(Sun) 17:55 No.1404 記事編集
Re: PWM/ADリレー無し SWもなし全てプログラム
猛牛ロックさん、こんばんは。
先ほど、寒かったけど、頑張ってフライス盤の部屋で、PICを交換しました。
猛牛ロックさんのプログラムです。
結果 OKでしたよ。
TR   2018/12/30(Sun) 20:34 No.1405 記事編集

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