

---------------------------------------------------------------------
#include <xc.h>
#define _XTAL_FREQ 8000000 // delay用に必要(クロック8MHzを指定)
// コンフィギュレーション1の設定
#pragma config FOSC = INTOSC // 内部クロックを使用する(INTOSC)
#pragma config WDTE = OFF // ウオッチドッグタイマー無し(OFF)
#pragma config PWRTE = ON // 電源ONから64ms後にプログラムを開始する(ON)
#pragma config MCLRE = OFF // 外部リセット信号は使用せずにデジタル入力(RA5)ピンとする(OFF)
#pragma config CP = OFF // プログラムメモリーを保護しない(OFF)
#pragma config CPD = OFF // データメモリーを保護しない(OFF)
#pragma config BOREN = ON // 電源電圧降下常時監視機能ON(ON)
#pragma config CLKOUTEN = OFF // CLKOUTピンをRA6ピンで使用する(OFF)
#pragma config IESO = OFF // 外部・内部クロックの切替えでの起動はなし(OFF)
#pragma config FCMEN = OFF // 外部クロック監視しない(FCMEN_OFF)
// コンフィギュレーション2の設定
#pragma config WRT = OFF // Flashメモリーを保護しない(OFF)
#pragma config PLLEN = OFF // 動作クロックを32MHzでは動作させない(OFF)
#pragma config STVREN = ON // スタックがオーバフローやアンダーフローしたらリセットをする(ON)
#pragma config BORV = HI // 電源電圧降下常時監視電圧(2.5V)設定(HI)
#pragma config LVP = OFF // 低電圧プログラミング機能使用しない(OFF)
// アナログ値の変換と読込み処理
unsigned int adconv()
{
unsigned int temp;
GO_nDONE = 1 ; // アナログ値読取り開始指示
while(GO_nDONE) ; // 読取り完了まで待つ
temp = ADRESH ;
temp = ( temp << 8 ) | ADRESL ;
return temp ;
}
// メインの処理関数
void main()
{
unsigned int num ;
OSCCON = 0b01110010 ; // 内部クロックは8MHzとする
ANSELA = 0b00000000 ; // AN0-AN4は使用しない全てデジタルI/Oとする
ANSELB = 0b00001000 ; // AN5-AN11はAN9のみアナログで使用し他はデジタルI/Oとする
TRISA = 0b00000000 ; // ピン(RA)は全て出力に割当てる(RA5は入力のみとなる)
TRISB = 0b00001000 ; // ピン(RB)はRB3(AN9)のみ入力で他は出力に割当てる
PORTA = 0b00000000 ; // RA出力ピンの初期化(全てLOWにする)
PORTB = 0b00000000 ; // RB出力ピンの初期化(全てLOWにする)
ADCON1 = 0b10010000 ; // 読取値は右寄せ、A/D変換クロックはFOSC/8、VDDをリファレンスとする
ADCON0 = 0b00100101 ; // アナログ変換情報設定(AN9から読込む)
__delay_us(5) ; // アナログ変換情報が設定されるまでとりあえず待つ
CCP2CON = 0b00001100 ; // PWM機能(シングル出力)を使用する
CCP2SEL = 0 ; // CCP2ピンは12番ピンのRB6を使用する
PSTR2CON= 0b00000001 ; // P2Aの12番ピンのみPWM出力する、P2BはOFF
CCPTMRS = 0b00000100 ; // ECCP2機能はTimer4を使用する
T4CON = 0b00000010 ; // TMR4プリスケーラ値を16倍に設定
CCPR2L = 0 ; // デューティ値は0で初期化
CCPR2H = 0 ;
TMR4 = 0 ; // タイマー4カウンターを初期化
PR4 = 124 ; // PWMの周期を設定(1000Hzで設定)
TMR4ON = 1 ; // TMR4(PWM)スタート
while(1) {
num = adconv() ; // 9番ピン(AN9)から半固定抵抗の値を読み込む
CCPR2L = num/4 ; // アナログ値からのデータでデューティ値を設定
}
}
---------------------------------------------------------------------
CCP2CON = 0b00001100 ; // PWM機能(シングル出力)を使用する T4CON = 0b00000010 ; // TMR4プリスケーラ値を16倍に設定 CCPR2L = 0 ; // デューティ値は0で初期化 CCPR2H = 0 ; TMR4 = 0 ; // タイマー4カウンターを初期化 PR4 = 124 ; // PWMの周期を設定(1000Hzで設定) TMR4ON = 1 ; // TMR4(PWM)スタート CCPR2L = num/4 ; // アナログ値からのデータでデューティ値を設定尚、CCP1でTimer2を使用する場合は
CCPTMRS = 0b00000000 ; // CCP1機能はTimer2を使用する CCP1CON = 0b00001100 ; // PWM機能(シングル出力)を使用する T2CON = 0b00000010 ; // TMR2プリスケーラ値を16倍に設定 CCPR1L = 0 ; // デューティ値は0で初期化 CCPR1H = 0 ; TMR2 = 0 ; // タイマー2カウンターを初期化 PR2 = 124 ; // PWMの周期を設定(1000Hzで設定) TMR2ON = 1 ; // TMR2(PWM)スタート CCPR1L = num/4 ; // アナログ値からのデータでデューティ値を設定なのでぇ、タイマー2/4/6が有るのでECCP1/ECCP2/CCP3/CCP4から最高3個まで同時にPWMを
左図の様にP2AピンがHIGH時はP2BピンはLOWを下がP2AからPWMを出力する場合でしたが、 CCP2CON = 0b00001100 ; // PWM機能(シングル出力)を使用する CCP2SEL = 0 ; // CCP2ピンは12番ピンのRB6を使用する PSTR2CON= 0b00000001 ; // P2Aの12番ピンのみPWM出力する、P2BはOFF P2A(アクティブHIGH)とP2B(アクティブLOW)から相補PWMを出力する場合は、 CCP2CON = 0b00001101 ; // PWM機能(シングル出力:相補を行う)を使用する CCP2SEL = 0 ; // CCP2(P2A)ピンは12番ピンのRB6を使用する P2BSEL = 0 ; // P2Bは13番ピンのRB7を使用する PSTR2CON= 0b00000011 ; // P2AをPWM出力する、P2Bは反転出力CCP2CON = 0b00001101;
| ピン番号 | 16 | 15 | 4 | 3 | 2 | 1 | 18 | 17 |
| デジタル入出力ビット名 | RA7 | RA6 | RA5 | RA4 | RA3 | RA2 | RA1 | RA0 |
| アナログ入力ピン名 | AN4 | AN3 | AN2 | AN1 | AN0 | |||
| PWM 出力ピン名 | CCP2 | |||||||
| P1C/P2A | P1D/P2B |
| ピン番号 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 |
| デジタル入出力ビット名 | RB7 | RB6 | RB5 | RB4 | RB3 | RB2 | RB1 | RB0 |
| アナログ入力ピン名 | AN6 | AN5 | AN7 | AN8 | AN9 | AN10 | AN11 | |
| PWM 出力ピン名 | CCP2 | CCP1 | CCP1 | |||||
| P1D/P2B | P1C/ P2A | P1B | P1A | P1A |
MPLAB X用に記事変更(*2) 2015/10/07
一部追記(*1) 2014/11/24
【きむ茶工房ガレージハウス】
Copyright (C) 2006-2020 Shigehiro Kimura All Rights Reserved.