home    2013/05/29


MPLAB X IDE の勉強、XC8 のCコンパイラーを使ってみました。

PIC18F14K50(¥170) の10ビットA/Dコンバーターを使用して電圧計+ステッピングモーターを使用してアナログメーターの作成です。

PICマイコンPIC18F14K50−I/P(USB内蔵)   

・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をつけたままで、書込->デバッグ->動作確認 が連続して行えます。

バイポーラステッピングモータ用ドライバIC TA7774PG

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];
    }
}
 

バグあったら連絡してください。