技術メモ

過去の経験や実験データ,設計・検討資料を残す。
今取り組んでいることのプロセスの記録から新たな気付きを得る。

DIP8pのPICマイコンによる発振器の製作

2017-11-04 | マイコン

昔使用していた発振器が無くなったり,水晶振動子を分周しただけでは欲しい周波数が得られない
アプリケーションに,簡単に対応できないか検討し,DIP8pのPICマイコンが使えそうだったので
秋月電子通商で1個120円でPIC12F1840を購入した。

1.実験回路
          

   ①右側5pコネクタは,書込・デバッグ用JTAG端子,2pコネクタは+5V電源です。
     (書込はPICKit3を使用)
   ②発振出力はLED点灯させ確認。
   ③内蔵発振器(確度±1%)と水晶発振の両方実験できるよう取付(4.9152MHz)

2.結果
(1)内蔵発振器32MHzでも,水晶振動子を用いた場合でも両方動作した。
   (水晶振動子にコンデンサがなくても動作したが,付けなきゃダメだよね)
(2)10Hzを作るには,内部タイマを用い,以下の割込みを発生させソフトで10Hz実現
   ①TMR2:1000Hz割込
   ②TMR0:100Hz割込
(3)20kHZ発振は,TMR2とPWM機能を用いた

3.20kHz発振の初期化プログラム
#include
#include
#include
#include "time.h"

#define INTERNAL_OSC    // コメントアウトで水晶発振となる
// CONFIG1
#ifdef INTERNAL_OSC
    #pragma config FOSC = INTOSC    // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin)
#else
    #pragma config FOSC = HS        // Oscillator Selection (HS Oscillator, High-speed crystal/resonator connected between OSC1 and OSC2 pins)
#endif
#pragma config WDTE = OFF       // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable (PWRT disabled)
#pragma config MCLRE = ON       // MCLR Pin Function Select (MCLR/VPP pin function is MCLR)
#pragma config CP = OFF         // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Memory Code Protection (Data memory code protection is disabled)
#pragma config BOREN = ON       // Brown-out Reset Enable (Brown-out Reset enabled)
#pragma config CLKOUTEN = OFF   // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = ON        // Internal/External Switchover (Internal/External Switchover mode is enabled)
#pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled)

// CONFIG2
#pragma config WRT = OFF        // Flash Memory Self-Write Protection (Write protection off)
#pragma config PLLEN = ON       // PLL Enable (4x PLL enabled)
#pragma config STVREN = ON      // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
#pragma config BORV = LO        // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config LVP = ON         // Low-Voltage Programming Enable (Low-voltage programming enabled)

void TMR2_Initialize(void)
{
    #ifdef INTERNAL_OSC
        PR2 = 99;       // 32Mz/4/4/100 = 20kHz
        IRCF0 = 0;      //内蔵CLK8MHz
        IRCF1 = 1;      //内蔵CLK8MHz
        IRCF2 = 1;      //内蔵CLK8MHz
        IRCF3 = 1;      //内蔵CLK8MHz    
    #else
        PR2 = 61;       // 19.8806Mz/4/4/62 = 20.04kHz
    #endif
    T2CON = 0x01;   // prescaler 1/4 off postscaler 1/1
    TMR2 = 0x0;     
    T2CONbits.TMR2ON = 1;
}
      
void EPWM_Initialize (void)
{   // CCP1M P1A: active high; P1B: active high; DC1B 3; P1M single;
    CCP1CON = 0x0C;
    CCP1CONbits.DC1B = 0b00;    // CCPL1L8bit + bit1 +bit0
    // CCP1ASE operating; PSS1BD low; PSS1AC low; CCP1AS disabled;
    ECCP1AS = 0x00;
    // P1RSEN automatic_restart; P1DC 0;
    PWM1CON = 0x80;
    // STR1B P1B_to_port; STR1A P1A_to_CCP1M; STR1SYNC start_at_begin;
    PSTR1CON = 0x01;
    CCPR1L = 30;    // ここでデュティを変える
    CCPR1H = 0x00;
}

void PIN_MANAGER_Initialize(void)
{   LATA = 0x00;    
    TRISA = 0x3B;   // 0:output RA2
    ANSELA = 0x13;  // 0:digital 1:analog
    WPUA = 0x3F;    // Weak pllup 1:enable
    OPTION_REGbits.nWPUEN = 0;
    APFCON = 0x00;  // RA2 is CCP1
}

void main(void)
{   EPWM_Initialize();
    TMR2_Initialize();
    PIN_MANAGER_Initialize();
    
    while(1)
    {
    }
}

4.OSC,TMR0,TMR2,PWM機能のブロック図
https://plaza.rakuten.co.jp/datasheet/diary/201711040000/



最新の画像もっと見る

コメントを投稿