編集履歴一覧に戻る
akira.keiのアイコン画像

akira.kei が 2025年02月09日00時24分09秒 に編集

初版

タイトルの変更

+

8ピンPICのPIC16F18313を使う(その10)いきなり昇圧回路

タグの変更

+

PIC

+

PIC16F18313

記事種類の変更

+

製作品

ライセンスの変更

+

(GPL-3.0+) GNU General Public License, version 3

本文の変更

+

[<前の記事](url) : [次の記事>]() ## Lチカじゃないんか… Microchip PICのプログラム書き込み機は、ホビーユースなら現在「[Pickit5](https://akizukidenshi.com/catalog/g/g118150/)」か「[SNAP](https://akizukidenshi.com/catalog/g/g113854/)」だが、17,800円か7,700円(2025/2現在)だ。PICkit5はちょっと高すぎ、SNAPは5V専用かよwと思ったので、他のDIY書き込み機を探してみたら[PICerFT](http://einstlab.web.fc2.com/PICerFT/PICerFT.html)というのを見つけた。ただWindows専用っぽいし、[秋月のハードウェア](https://akizukidenshi.com/catalog/g/g101977/)依存だし、**記事の圧が強すぎ**るのではないかと、趣味に合わないと思ってしまった。 一方で[書き込み機にRaspberry Pi Picoを使った記事](https://tahmidmc.blogspot.com/2024/01/quick-and-dirty-pic16f72-programmer.html)も見つけたが、これはタイトル通りかなりDirtyな印象だ。5Vから13Vへの昇圧回路もPicoで駆動させているが、いやもうそこは外付けでいいじゃないかと。そして試しにPICでやってみようかなと考えてやってみたのがこの記事だ。 ## 昇圧回路 使った昇圧回路は原理的には以下の通り。 ![昇圧回路](https://camo.elchika.com/9c85ae21ab0b2eff06a9d06764fb8e09972383d0/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f33363031626666382d633530632d343762382d613765362d3531663731393163323336642f38303039653561332d346139662d343635332d386533632d383064646362353231393237/) 解析回路は50%デューティでスイッチのON-OFFをしているのだが、実際の回路では信号源はPICのPWM、スイッチの代わりにはMOSFETを使う。出力電圧をフィードバックしてPWMを止めたり再開したりすれば、特定の電圧値に出力を制御できる。 ![昇圧](https://camo.elchika.com/945b248879467c9ad0c0f65ff0700a7b594def02/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f33363031626666382d633530632d343762382d613765362d3531663731393163323336642f37366463306231302d313563662d346131622d616432322d306635616162323766646562/) ## 各種設定は 今回の昇圧回路は各モジュールを設定したら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; ``` ## 動いた! 動かした結果は思ったとおりに動いている。 ![昇圧結果](https://camo.elchika.com/a361099e70cd2eec006b8620b7b1b6db3feb7ad6/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f33363031626666382d633530632d343762382d613765362d3531663731393163323336642f30343636396365642d346465652d343138362d616632622d333039393434636330353835/) 回路の規模も小さいのでコンパクトにうまい具合に載せたい。 ![キャプションを入力できます](https://camo.elchika.com/7080b637ef473fa30c11e704fbaf32a96d0fe46e/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f33363031626666382d633530632d343762382d613765362d3531663731393163323336642f65306139393763632d396362302d343636332d623230642d393264353336653165323836/)