Lチカじゃないんか…
Microchip PICのプログラム書き込み機は、ホビーユースなら現在「Pickit5」か「SNAP」だが、17,800円か7,700円(2025/2現在)だ。PICkit5はちょっと高すぎ、SNAPは5V専用かよwと思ったので、他のDIY書き込み機を探してみたらPICerFTというのを見つけた。ただWindows専用っぽいし、秋月のハードウェア依存だし、記事の圧が強すぎるので趣味に合わないと思ってしまった。
一方で書き込み機にRaspberry Pi Picoを使った記事も見つけたが、これはタイトル通りかなりDirtyな印象だ。5Vから13Vへの昇圧回路もPicoで駆動させているが、いやもうそこは外付けでいいじゃないかと。そして試しにPICでやってみようかなと考えてやってみたのがこの記事だ。
昇圧回路
使った昇圧回路は原理的には以下の通り。
解析回路は50%デューティでスイッチのON-OFFをしているのだが、実際の回路では信号源はPICのPWM、スイッチの代わりにはMOSFETを使う。出力電圧をフィードバックしてPWMを止めたり再開したりすれば、特定の電圧値に出力を制御できる。
各種設定は
今回の昇圧回路は各モジュールを設定したらHWだけで動かすつもりなので、あまり速度は要らない。従って、いつもの1MHzで十分だろう。PWMは20kHzくらいで駆動したい。デューティは固定で良くて、欲しい電圧(13V)の倍である26V程度まで昇圧できれば良い。手持ちの電解コンデンサも50V耐圧のやつは少ないので。
フィードバック電圧は最大で4V、スレッショルドで2Vくらいでモニタしたい。つまり出力を1/6だか1/7にしてフィードバックする。合成抵抗は10kΩ程度を想定すると、6.8k+1.5k+1.5kにして1.5kの間でコンパレータに入れる。参照電圧はFVRからDACを通してコンパレータに供給か。使うモジュールは、
- PPS
- TMR2
- CCP (PWMで良かった)
- CWG (Auto Shutdown)
- FVR
- DAC
- Comparator (CMP)
となる。最初はCWGは使わない予定だったが、CCPモジュールにはAuto Shutdown & Restart機能が無い。これがあるのはCWGだけのようなので、これも使うハメになった。そうするとわざわざCCP(PWMモード)を用いる必要もなく、PWM5で充分だったがこのあたりの迷いによってデバッグは混乱することになった。
入出力端子
8pinの内、PICkit4に接続する5pinを除けば残りはRA2, 4, 5の三つである。CMPを使うのでRA4をフィードバック入力に使うのは決まってしまうので、RA2をPWM出力に、RA5はCMPのモニタに使用することにした。
Pragma Config
1MHz駆動の場合、コンフィギュレーションワードを適切に設定しておけば、mainルーチンでOSCCONの設定などは必要ない。CONFIG1で外部オシレータ無効、内部オシレータ有効(1MHz)、RA4は入力に使うのでCLKOUT無効、OSCCON不使用なのでCSWNもOFF、クロック切り替えはしないのでFCMENもOFFとした。
// CONFIG1
#pragma config FEXTOSC = OFF
#pragma config RSTOSC = HFINT1
#pragma config CLKOUTEN = OFF
#pragma config CSWEN = OFF
#pragma config FCMEN = OFF
CONFIG2には安全機能が固まっている。PICkitから切り離して運用することを考えるとMCLREはOFFにしていた方が安全か。同じようにPowerUpタイマー(PWRT)、ウォッチドック(WDT)、電圧低下リセット(LPBOR, BOR)などは有効にしておくのが妥当かも。ただし、プログラムはずっと無限ループになるのでスタックオーバフローリセット(STVR)は不要だろう。
// CONFIG2
#pragma config MCLRE = ON
#pragma config PWRTE = OFF
#pragma config WDTE = OFF
#pragma config LPBOREN = OFF
#pragma config BOREN = OFF
#pragma config BORV = LOW
#pragma config PPS1WAY = ON
#pragma config STVREN = OFF
#pragma config DEBUG = OFF
いつものようにCONFIG3でLVPは無効にしてある。
mainルーチン
mainの冒頭はxc.hとコンフィギュレーションワードを定義したpragma_config.hをインクルードする。ピンの出力バッファを全て無効にしてから各モジュールの設定を行う。
#include <xc.h>
#include "pragma_config.h"
void main(void) {
TRISA=0xff; // reset all pin input
最初はコンパレータ用基準電圧とコンパレータ自身の設定を行う。コンパレータには2〜4Vの入力があるのでDACには4.096Vを供給する。DACに16と設定してあるのは動かしてみてから出力電圧が13V程度になる値を探した。入力はRA4としてRA5にはコンパレータ出力をモニタ用に引き出した。
//
FVRCONbits.CDAFVR=0b11; // 4.096v
FVRCONbits.FVREN=1;
DACCON0=0b10001000;
DACCON1bits.DAC1R=16; // Threshold
CM1CON1bits.C1NCH=0b001; // RA4input
CM1CON1bits.C1PCH=0b101; // DAC
CM1CON0bits.C1HYS=1;
CM1CON0bits.C1ON=1;
ANSELAbits.ANSA4=1;
TRISAbits.TRISA4=1;
RA5PPSbits.RA5PPS=0b10110;
CCPをPWMモードで設定したが、PWM5かPWM6でも十分だった。TMR2を動かしてからPWMモードで駆動する。CCP1FMTを設定しておかないとコンペアレジスタが右寄せになってしまう。PR2を11に設定したのはPWM周波数を20kHzにするためだが分解能は極端に減っている。CCPR1の設定は実際に動作させてから、昇圧出力が25V程度になるように決めた。
//
T2CON=0b00000100; // start TMR2
CCP1CONbits.CCP1MODE=0b1111; //PWM
CCP1CONbits.CCP1FMT=1; // Left
PR2=11; // 20kHz
CCPR1H=0b00000001;
CCPR1L=0b01000000; // Max Voltage 25V 10kOhm
CCP1CONbits.CCP1EN=1;
CWGは未だに使い方がピンとこないが、とりあえずこれで動いている。Auto Shutdownも問題なく機能した。
//
CWG1AS0bits.LSAC=0b10;
CWG1AS0bits.REN=1;
CWG1AS1bits.AS1E=1;
CWG1STRbits.STRA=1;
CWG1DATbits.DAT=0b0011;//CCP1
CWG1CLKCON=1;
CWG1CON0bits.CWG1MODE=0b001;
CWG1CON0bits.CWG1EN=1;
RA2PPSbits.RA2PPS=0b01000;
TRISAbits.TRISA2=0;
TRISAbits.TRISA5=0;
動いた!
投稿者の人気記事
-
akira.kei
さんが
2025/02/09
に
編集
をしました。
(メッセージ: 初版)
-
akira.kei
さんが
2025/02/09
に
編集
をしました。
-
akira.kei
さんが
2025/02/09
に
編集
をしました。
-
akira.kei
さんが
2025/02/09
に
編集
をしました。
ログインしてコメントを投稿する