home 2013/05/29
MPLAB X IDE の勉強、XC8 のCコンパイラーを使ってみました。
PIC18F14K50(¥170) の10ビットA/Dコンバーターを使用して電圧計+ステッピングモーターを使用してアナログメーターの作成です。
・20ピンUSBフラッシュマイクロコントローラ
・ナノワットXLPテクノロジー
・USB2.0インターフェース内蔵
・USB用デュアルアクセス256バイトRAM内蔵
・プログラムメモリ:8Kバイト
・SRAM:768バイト
・EEPROM:256バイト
・I/O:最大17ch※内1ピン(MCLR)は、インプット専用
パッケージ:DIP20ピン
回路図 当初 A0,A1に TA7774(¥50)を接続しました。ところがプログラムの段階でA0,A1,A3は入力専用端子であることが判明仕方がないのでA4,A5に変更しました。
ICSPソケットはPICの書き込み用です。 完成すれば不要になります。 オンボードでICをつけたままで、書込->デバッグ->動作確認 が連続して行えます。
TA7774はバイポーラ駆動方式による2相ステッピングモータ用ドライバICです。
誘導性負荷をバイポーラ駆動可能とするブリッジドライバ2組と
パワーセーブ、スタンバイ機能を有しセットの小型化、低消費電力化に最適です。
=特長=
・バイポーラ2相ステッピングモータ用ドライバ
・バイポーラ駆動1チップモータドライバ(フルブリッジ2組内蔵)
煩雑になりがちなバイポーラタイプの駆動を簡略化できます。
・パワーセーブ機能
・スタンバイ機能:115uA以下
・貫通電流保護ダイオード内蔵
・入力TTLコンパチブル
=仕様=
◆Io(PEAK) =±400mA(MAX)
◆Io(START)=±350mA(MAX)
◆Io(HOLD) =±100mA(MAX)
◆PD=1.4W(デバイス単体時)〜2.7W(基板実装時)
ジャンクから取り外した4本のリードの出ているバイポーラステッピングモーターを使用しました。巻き線の抵抗は 5Ω です。5V掛けると1Aも電流が流れてICが壊れてしまいますので巻き線に直列に15Ωの抵抗を入れました。6本線の出ているユニポーラステッピングモーターでも中点を使用せず使用可能です。モーターは無負荷と同じですのでこれでも回ります。
普通のアナログメーターは針の有効稼動範囲は90度です。このメーターは数回転も可能、航空機のぐるぐる回るメーターの雰囲気です。
モーターは1回転200スッテプなど区切りの良いステップが使いよいです。
電源を切った段階でモーター指針を手で回して0に合わせます。
JWCAD でパターン作図 --> NCVCでGコードに変換 -->自作CNC+MACH3で基盤切削しました。ついでにデジタルメーターの基盤も作りました。
東芝のTA7774を置いてみました。1mmピッチのパッケージです。手作業では難しい作業もCNCを使うとぴったりです。
開いている穴は0.9mmのドリルで大きく見えます。
部品を挿してみました。 部品といってもほとんどありませんが、動作のほとんどをソフトウエアーで実現します。
基盤の裏側 ジャンパー線を気楽に使っています。 チップ部品が小さくなりすぎて使いにくいです。
ためしに回して見た小型ステピングモーター
PIKKIT3で書き込み、デバック、動作確認を行っています。こんなでかいコネクターは必要ないです。4本ピンを出して繋げば十分
ついでに作った10ビットA/Dを使ったLEDデジタルパネルメーター
5V3端子レギレーターを装備。 0Vから20Vまでの4桁 パネルメーター です。
/*
* File: newmain.c Author: A MPLABX+XC8
*PIC18F14K50 Created on 2013/04/28, 12:23 by ja0bas
*/
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#pragma config USBDIV = OFF //;USB CLOCK SELECTION BIT
#pragma config MCLRE = OFF //;MCLR PIN ENABLE BIT
#pragma config IESO = OFF //;Internal/External Oscillator Switchover bit
#pragma config FCMEN = OFF //;Fail-Safe Clock Monitor Enable bit
#pragma config FOSC = IRC //;OSCILLATOR SELECTION BITS
#pragma config PWRTEN = ON //;Power-up Timer Enable bit
#pragma config PLLEN = OFF //;X PLL ENABLE BIT(OSCILLATOR MULTIPLIED BY 4)
#pragma config PCLKEN = OFF //;PRIMARY CLOCK ENABLE BIT
#pragma config BOREN = OFF //;Brown-out Reset Enable bits
#pragma config LVP = OFF //;Single-Supply ICSP Enable bit
#pragma config CPUDIV=NOCLKDIV //;CPU SYSTEM CLOCK SELECTION BIT
#pragma config CP0 = OFF //;Code Protection bit
#pragma config CP1 = OFF //;Code Protection bit
#pragma config CPD = OFF //;Data EEPROM Code Protection bit
#pragma config CPB = OFF //;Boot Block Code Protection bit
#pragma config WDTEN = OFF //;Watchdog Timer Enable bit
#pragma config HFOFST = OFF,STVREN = OFF,BBSIZ = OFF,XINST = OFF
#pragma config EBTR0 = OFF,EBTR1 = OFF,EBTRB = OFF
#define _XTAL_FREQ 8000000
const unsigned char seg_d[16] = {0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x58,
0x00, 0x18,0x08, 0x03, 0x27, 0x21, 0x06, 0x0E };
const unsigned char scan[4] = { 0b11101111,0b11011111,0b10111111,0b01111111};
const unsigned char md[4] = { 0b00110000,0b00100000,0b00000000,0b00010000};
unsigned char digit_no=0; // 表示走査桁指定
unsigned char dsp_buf[4]={0,0,0,0}; // 表示バッファー
unsigned int temp1,temp2,mn=0;
int dsp_cnt=0,i,n,mp=0;
void main()
{
OSCCON = 0b01101010 ; //8MHz 選択
TRISA = 0b11001111;
TRISB = 0b00000000;
TRISC = 0b10000000;
PORTA = 0b00000000; // ポート初期化。
PORTB = 0b11111111; //全桁消灯
PORTC = 0b11111111; // ポート初期化。
ADCON1 = 0b00001000; //PVCFG 10 NVCFG 00
ADCON2 = 0b10111111; //右ADFM1,ACCQT111ADCS111(FRC)
REFCON0= 0b10100000; //FVR 2.048V
ANSELH = 0b00000010; ANSEL = 0; //RC7アナログ
ADCON0 = 0b00100111; //RC7,ADON 変換開始
while(1){
while(GODONE) {} // A/D変換済みなら
dsp_cnt=ADRESL+(ADRESH*256);
GODONE = 1; //次の A/D変換開始
temp1 =dsp_cnt+dsp_cnt; // dsp_cntを4桁の10進数に変換
n = 1000;
for(i = 3; i >= 0; i--){
temp2 =
temp1/n; // 千、百、十、一の個数を計算
dsp_buf[i] =
(unsigned char)temp2;// 表示バッファーに代入
temp1 = temp1
% n; // 余りを求める
n /= 10;
}
__delay_ms(5);
PORTB = 0b11111111; //全桁消灯
PORTC = seg_d[dsp_buf[digit_no]] ;//7セグDATA出力
PORTB = (scan[digit_no]) ; // 走査ビット出力
if(++digit_no == 4){digit_no = 0;} // 表示桁を1桁目に設定
if(mn>dsp_cnt>>4){mn--;if(--mp<0){mp=3;}}//モーター回転
if(mn<dsp_cnt>>4){mn++;if(++mp>3){mp=0;}}//モーター回転
PORTA=md[mp];
}
}
バグあったら連絡してください。