==PWMモード==
理屈の理解がいまいちでしたが、サンプルプログラムの変数
を変えて、PWMモードで、パルスを発生させてみました。
/*****************************
STEP20_PWMMode.c
*****************************/
#define _LEGACY_HEADERS//以前のヘッダーファイルにするための宣言これがないと古いのではエラーに
// インクルードファイルの読み込み
#include
__CONFIG(UNPROTECT & LVPDIS & BOREN & MCLRDIS & PWRTEN & WDTDIS & INTIO);
//#pragma config CPD=OFF , LVP=OFF , BOREN=ON , MCLRE=ON , PWRTE=ON , WDTE=OFF , FOSC=INTOSCIO
(この宣言は、新しいコンパイラ用。古いのでは、エラーになるので、コメントアウト)
// プロトタイプ宣言
void InitPWM (void);
void InitTimer2 (void);
// メイン関数
void main (void)
{
// 1,2,17,18端子を入出力端子に設定
CMCON = 0x07;
// 電圧レベルの初期設定
PORTA = 0xFF;
PORTB = 0xFF;
// 入出力設定
TRISA = 0x20;
TRISB = 0x00;
// PWMモード設定関数の呼び出し
InitPWM();
// タイマ2設定関数の呼び出し
InitTimer2();
// 永久ループ(これがないとプログラムが終わって
パルスが持続しない。)
while(1)
{
}
}
// PWMモード設定関数
void InitPWM (void)
{
// RB3端子を出力端子に設定
TRISB3 = 0;
// CCPのモードをPWMモードに設定
CCP1M3 = 1;
CCP1M2 = 1;
CCP1M1 = 0;
CCP1M0 = 0;
// 周期を100μ秒に設定(99 + 1μ秒)
//PR2 = 0b01100011;//99μ+ 1μ秒(10khz)
//PR2 = 0b11000111;//199μ+ 1μ秒(5khz)
PR2 = 0b11111110;//254μ+ 1μ秒(985hz プリスケラー4)
// Hの時間を99μ秒に設定(396 × 0.25μ秒)
//CCPR1L = 0b01100011;99μ
//CCPR1L = 0b00110010;//50μ
//CCPR1L = 0b000011001;//25μ
//CCPR1L = 0b000000101;//10μ
CCPR1L = 0b00000101;//5μ
CCP1X = 0;
CCP1Y = 0;
}
// タイマ2設定関数
void InitTimer2 (void)
{
// プリスケーラ値を1に設定
//T2CKPS1 = 0;
//T2CKPS0 = 0;
// プリスケーラ値を4に設定
T2CKPS1 = 0;
T2CKPS0 = 1;
// TMR2レジスタをクリア
TMR2 = 0;
// タイマ2起動
TMR2ON = 1;
}
パルス幅5μsにして、周期を変えてみました。
PR2レジスタ・・・・・・・周期(周波数)の設定
CCPR1Lレジスタ・・・・・・・・パルスの時間を設定
目的の周波数にするのに、段階的にPR2レジスタの数値
を大きくしていきましたが、すんなりと周波数を大きくは
できませんでした。「255」の壁がありました。256にする
とこのまでは不具合が起きます。このままでは分からない
のですが、2進数にすると一目瞭然です。
255・・・・・ 11111111
256・・・・・ 100000000
10進数で、9から10に変わるのとおなじように、桁数が
ふえてしまうのです。PR2レジスタは、8桁の2進数しか
収納できないので、これだけでは、256以上の数値は、
収納できません。しかし、便利な機能があって、プリスケラ-
という数え方を何分の一かにする機能があります。
これと組み合わせると、周期(周波数)をさらに何分の一
かにできます。
PR2に254(実際は+1されるので、255を格納)
CCPR1Lで5μs幅のパルスに設定
T2CKPS1 = 0;T2CKPS0 = 1;でプリスケラ-を4に設定
プリスケラ-は1,4,16の設定しかないようですので、4
に設定して、数え方を1/4にして、
やっと目的が果たせます。
---「PIC」プログラミング再び (3)---
パルスを作るのにPICで、自分でプログラムを組みましたが、
自分でプログラム作らなくても、CCPモードというのがあって、
このなかにPWMモードという機能があって、パラメーター
さえ設定してやれば、パルスの生成ができるようです。
ただ、その設定のパラメーターの与え方は、私には複雑で、
まだ、よく理解できません。いずれ、マスターしたいと思いますが、
とりあえず、自作のプログラムでも動いたので、今日もあれこれ
やりました。
今日は、
の赤矢印(LOWの時間)の時間を変えることで、パルスの周波数を
変えてモーターの動きを試してみました。
2000HZのパルスで回転させていたときは、回転中にモーターの
軸を指で持つと、回転をストップすることができました。
このモーター壊れているのかのかなと思いましたが、
約1500HZぐらいに落とすと、手で止められないくらいのトルク
がでました。どうやら、設定があってなかったようです。
1500HZから200HZぐらいまで、段階的に変えてみましたが、
うまく動いたようです。
この間で、周波数を変更できれば、スピードのコントロール
ができそうです。
PICで可変抵抗を使うには、AD変換が必要なので、
次なる課題は、AD変換のプログラムです。
---「PIC」プログラミング再び (2)---
PICのプログラムについて、少しずつ思い出してきました。
とはいっても、完全にマスターなどしている訳ではないので、
何年か前の水準にもどっただけです。
今日は、PICで、ステッピングモーターのパルスを発生さて、
中古のステッピングモーターを回してみました。
UDK2120の取説には、必要なパルスの要件は、
とありました。アセンブラでプログラムを組むと、命令に必要な
クロック数から細かい設計もできるのでしょうが、Cからは、
ちょと面倒で、私にはできません。ということで、実際にプログラム
しては、動かしてみて、オシロデ確認して組みました。
/******************************************
2014-10-15
PULSE SEISEI
********************************************/
#include
void WaitTime1 (void);
void WaitTime2 (void);
int dummy;
void main(void){
PORTA=0x00;//PORTAをLOWに
PORTB=0x00;//PORTBをLOWに
TRISA=0x08;//0000 1000 PORTAを出力に(RA3は入力に)
TRISB=0x00;//0000 0000 PORTBを出力に
CMCON=0x07; //1,2,17,18コンパレーターオフ 汎用端子を入出力へ
//パルスの生成
for(;;){
RA1=1;
dummy=1;//待ち時間だけHIGHに
dummy=1;
RA1=0;
WaitTime2();//待ち時間だけLOWに
}
}
// 待ち時間関数の呼び出し
void WaitTime1 (void){
int cnt1=1;
while(cnt1 > 0){
cnt1--;}
}
void WaitTime2 (void){
int cnt2=20;
while(cnt2 > 0){
cnt2--;}
}
やってることは単純なことで、一つの端子の出力を、オン、オフ
をしているだけです。ただ、当初予定していた二つの待ち時間
の関数を使おうとしましたが、この関数を使うと、パルスの幅
が50μsぐらいになるので、dummy=1という数字を代入すると
いう意味のない命令を一つ実行するだけで、だいたい、取説
にあった5μsの幅になりました。
WaitTime2()の関数で、待ち時間のカウンターを20にすること
で、パルスの周波数が約2kHになりました。
2kHだと約240rpm/mの早さで回るようです。
これで、目的にまた一歩近づきました。
---「PIC」プログラミング再び (1)---
ちょっとした制御をPICでやろうとまた思いたちました。以前
ハンダゴテタイマーをPICで作りましたが,そのプログラムを
見てみると,全く忘れてしまいました。
そこで,また,最学習することに・・・・・・・・。
今回もプログラミング言語は「C」を使いますが,PICの細かい設定
とうについて,全く忘れてしまいましたので,備忘録代わりに,
メモ帳代わりに記録していきます。
以前使った16F627Aです。
PORTAレジスタ・・・・ポートAの出力端子の電力レベルの設定
ポートAの出力端子(RA7~RA0)
例 一括設定
PORTA=Ob00000000(RA7~RA0が0Vに設定)
0b・・・2進数
0・・・・・・8進数
0x・・・・・16進数
単独の設定
RA0=0(RA0を0Vに設定)
PORTBレジスタも同様の設定
TRISAレジスタ・・・・RA各端子の入出力の設定
0を書き込むと出力端子になる
1を書き込むと入力端子になる
例 一括設定
TRISA=0b00000000(RA7~RA0が出力端子に)
単独の設定
TRISA3=0 (RA3を出力端子に)
(16F627Aの場合RA5は入力専用なので,必ず入力に)
CMCONレジスタ・・・・・・汎用端子の役割設定
CMCOM=0x07 (下位3ビットを1に設定することで
1,2,17,18端子を入出力端子
に設定)
今日は,
この本で,ここまで復習。
プログラムを覚え初めの頃,
A=A+1
という表記が納得いきませんでした。数学や算数では,成り立ちません。
この場合,「=」はイコール(等しい)ではなくて,代入するという
意味です。ちなみに等しいかどうかの判別は,「==」イコール
を二つ並べます。プログラム覚え立ての頃,ここではまりました。
IF(A=1){処理1}
こんな風に書いて思った結果がでませんでした。これだと,Aに1が
代入されてしまいます。正しくは,
IF(A==1){処理1}
でした。
---デジタル回転計 K3NRーNB1A-C1---
某オクのアラートに設定しておいたomronの
デジタル回転/パルスメーターの長期保存品の新品を無事
3500円で落札できました。8年以上前に製造中止になった
型ですが,お値打ちでした。
早速,手持ちのomronのフォットセンサーと組み合わせ,
段ボールで一カ所だけ切り欠きをいれたエンコーダー?を
電動ドライバーにつけて,試運転をしました。
プリスケラ-の設定がいいのかどうかわかりませんが,
とりあえず,電動ドライバーの回転に合わせて,数字が変化
します。
よくわかりませんが,エンコーダーのスリットを多くすれば,
数字も安定するんでしょうか?。
mokkinさんのHPでは,60のスリットを作ってるようです。
sable2015でエンコーダーを作成して,実際にフライス盤
に取り付けて市販の回転計で,精度を測ってみようと思います。
もともと工業用に製作されたもので,いろんなことができます。
単なる回転計として使うには,もったいないようです。
---THE解決 リレーの不具合---
スマホでyahooのサイトを眺めていたら,表題の文字が飛び
込んできた。早速omronの該当のHPにアクセスして,申し込
んでみた。企業対象の文字も目に入ったのでだめかなと思って
諦めていると,昨日,小冊子が送られてきた。
商品のカタログと一緒に,「THE解決」というリレーの不具合について
詳細が書かれている冊子が気にいった。
この冊子お勧めかも。
---サーボテスター (2)---
サーボテスターの波形をオシロで見て見ました。今まで,
どんな信号でラジコンのサーボをコントロールしているか
分かりませんでしたが,オシロで見て見て,すっきりしました。
左にボリュームを回すと振幅が狭くなり,右に回すと
広くなります。
特別な信号でコントロールしてるのかと思いましたが,
なんと,単に,パルス幅の変化でコントロールしてることが
わかりました。PWMを使ったコントロールでした。
ゆくゆくは,スピンドルモーターもMACHでコントロールしようと
思ってましたが,一歩近づきました。
MACHのスピンドル設定には,よく見ると,PWM制御の項目
があります。多分,ここから出されるPWMの信号をを使えば,
DCモーターの制御も出来るような気がしました。
ラジコンのサーボの信号のPWMのは,
ここ
に詳しくかかれてました。
---デジタル温度計キット(2)---
組み立て終わったので,電池につないで見ました。
ところが,LCDに「1」しか表示されません。イモハンダが原因
かと思いハンダ部分を全部再加熱して見ましたが,同じです。
組み立てマニュアルを見ると,VR3周辺を点検すべしとあります。
よく見てもおかしいところはないので,再度,組み立てマニュアル
と熱電対のマニュアルを見てみると,ありました。
熱電対マニュアルでは,
VR3--1MΩ
RT---470KΩ
に変更するとあるのに,本体のマニュアルでは,
VR3---470KΩ
RT---1MΩ
と反対の表記でした。熱電対のマニュアル通りに組み立てたので,
本体のマニュアルのように変更したら,動きました。
マニュアルの間違いでした。
氷水とお湯で,おおざっぱに更正しました。
うまく動いています。
後で温度計と比べながら,正確な更正をしてみます。
マニュアルが間違っていたのでは,動きませんね。
---デジタル温度計キット (1)---
---半田ごてタイマーが組み上がりました---
あれこれやってましたが,やっと,半田ごてタイマーが組み
上がりました。昨日だいたいできたのですが,RA0の端子
とRA7の端子が思った動作をしてくれず,あれこれ,やって
ましたが,原因が分かりました。RA0はイモ半田で,導通し
ていませんでした。RA7は,ショートしていいて,常に5Vが
でている状態でした。当初の予定では,自己保持リレーで,
自分自身お電源も切る予定でしたが,あれこれやりました
が,うまく行きませんでした。とりあえず完成ということで,
後日,2回路のリレーを使って,再挑戦したいと思います。
今までのタイマーと違って,残り時間が液晶表示で,分か
こと,任意の時間が設定できること,残り時間がなくなると,
一分だけ延長され,その間にスタートボタンを押すと,設定
した時間だけ,繰り返せます。一分が過ぎると,半田ごての
電源を切って,0の表示に戻ります。
青の液晶表示がおしゃれだと思ってます。今のところ,
一番右のスイッチは,ただの飾りです。