昔使用していた発振器が無くなったり,水晶振動子を分周しただけでは欲しい周波数が得られない
アプリケーションに,簡単に対応できないか検討し,DIP8pのPICマイコンが使えそうだったので
秋月電子通商で1個120円でPIC12F1840を購入した。
①右側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/
※コメント投稿者のブログIDはブログ作成者のみに通知されます