PR

PICマむコン(PIC18F14K50)のADCずTimerを実装する

組み蟌み゚ンゞニア
本蚘事はプロモヌションが含たれおいたす。

こんにちは、ENGかぎです。

PIC18F14K50 には 10bit ADC が搭茉されおおり、土壌センサヌなどのアナログ電圧を取埗できたす。任意のタむミングで AD 倉換を行うには、MCC の ADC ず Timer を組み合わせお゜フトりェアタむマを構成する必芁がありたす。

本蚘事では、MCC を䜿っお ADC ず Timer を蚭定し、䞀定呚期で 土壌センサヌからアナログ電圧を取埗し土壌の状態を衚瀺しお動䜜確認を行いたす。

PIC18F14K50 を実装した基板は AE-USB-I02.0-TYPEC秋月電子を䜿甚しおいたす。以䞋では PIC モゞュヌルずしたす。

MCC を䜿っお動䜜確認したこずを䞋蚘にたずめおいたす。

PICマむコンPIC16F1827で実珟できる機胜ず解説リンクたずめ

MCC で各皮機胜を実装する

PIC モゞュヌルは 12MHz のクリスタル発振子や USB に関する郚品が実装されおいたす。PIC モゞュヌルは PIC18F14K50 が䜿甚されおいるため MCC を䜿っおボヌドの蚭定を行うこずができたす。MCC の䜿い方に぀いおは䞋蚘蚘事にたずめおいたす。

MPLAB Code Configurator(MCC)の远加ず䜿い方

参考蚘事は MCC Classic珟圚サポヌト倖で Melody が掚奚されるを䜿甚しおいたすが、䜿い方はほが同じです。

本蚘事では土壌センサヌの倀の取埗に䜿甚する ADC、枬定ず動䜜䞭を瀺す LED の点灯/消灯のタむミングを管理するタむマラむブラリTimerTMR2の蚭定を行いたす。

Configuration Bits の蚭定

MCCでConfiguration Bitsの蚭定
MCCでConfiguration Bitsの蚭定

MPLAB X IDE を起動し MCC のアむコンをクリックしお MCC を有効にしたす。初期の画面のむンタヌフェヌスでは蚭定画面が右隅に衚瀺されお芋にくいのでスラむドさせお倧きく衚瀺するようにしおいたす。

倖郚クリスタル発振子を䜿甚する堎合は Configuration Bits の CONFIG1H レゞスタを蚭定したす。Osillator Selection Bits から「HS oscillator」を遞択するず Clock Control でシステムクロックが入力できるようになりたす。

別蚘事で本蚘事の内容を远加しお䜿甚するため USB に必芁なシステムクロックに合わせお 4X PLL Enable bit で「Oscillator multiplied by 4」を遞択しおシステムクロックを 4 逓倍したす。 USB を実装しない堎合は PLL を䜿甚しなくおも問題ありたせん。

埌述の ADC や TMR2 の蚭定は FOSC を基準に生成されMCCの衚瀺に䜿われたすが、PLL で逓倍された倀を参照しおいないため泚意が必芁です。

PRわからないを攟眮せず、あなたにあった最䜎限のスキルを身に着けるコツを教える テックゞム 「曞けるが先で、理解が埌」を䜓隓しよう

Clock Control の蚭定

MCCのClock Controlの蚭定
MCCのClock Controlの蚭定

Clock Control を遞択し、Clock Source から FOSC を遞択したす。Configuration Bits で HS を遞択しおいる堎合は External Clock に倖郚クリスタルの発信呚波数が入力できるので 「12,000,000 (12MHz)」を入力したす。

巊䞊隅の「Generate」をクリックするず MCC が蚭定した項目の初期化を含んだ゜ヌスコヌドを自動で生成したす。

PRスキマ時間で自己啓発スマホで孊べる人気のオンラむン資栌講座【スタディング】たずは気になる講座を無料で䜓隓しよう

ADC を蚭定する

Device ResourcesのDrivers から ADC を遞択しお远加したす。 Drivers に远加された ADC を遞択しお蚭定したす。

ADCの蚭定
ADCの蚭定

Hardware SettingsのResult Alignment を right右揃えにしたす。右揃えにするず AD 倉換倀が LSB からセットされたす。

Positive Reference は倖郚の電源を䜿甚する堎合は external を遞択したすが、今回は電源電圧にするため VDD を遞択し、Negative Reference に VSS を遞択しおいたす。

Positive Input Channel は䜿甚するアナログチャンネルを遞択したす。PinGrid View から䜿甚する ANx を遞択しおも蚭定できたす。

Conversion Clock Select は FOSC に察する分呚比を遞択したす。システムクロックに察しお分呚比が䜎いず AD 倉換の粟床に圱響が出るこずがあるため適切な分呚比になるように蚭定したす。

MCC のクロック衚瀺は PLL を䜿甚しおいない FOSC から生成されたす2026幎8月䞋旬珟圚。PLL を䜿甚するず4逓倍された FOSC クロックになるため衚瀺の呚波数ず実際の動䜜クロックがずれるため泚意が必芁です。今埌のアップデヌトで修正される可胜性がありたす。

MCC が生成した関数の䜿甚䟋です。

ADC_SelectChannel(posChannel_AN9);
ADC_StartConversion();

if( ADC_IsConversionDone() ){
    adc_an9 = ADC_GetConversionResult();
}

AD 倉換は登録したチャンネル番号に察しお凊理されるため、ADC_SelectChannel() で AD倉換開始の前に察象のチャンネル番号を指定する必芁がありたす。䟋は AN9 をAD 倉換する䟋を瀺しおいたす。チャンネル番号は adc.h 内に adc_channel_t の型ずしお enum で登録されおいたす。

ADC_StartConversion() を䜿甚するず AD 倉換を開始したす。AD 倉換が完了するず割り蟌みを有効にしおいる堎合は割り蟌みフラグがセットされたす。割り蟌みを䜿甚しない堎合は、AD 倉換が完了しおいるかを確認しお倉換倀を取埗したす。

ADC_IsConversionDone() で AD 倉換が完了しおいるこずを確認しお AD 倉換倀を取埗したす。

PRRUNTEQランテック - マむベスト4幎連続1䜍を獲埗した実瞟を持぀Web゚ンゞニア逊成プログラミングスクヌル

Timer ドラむバヌで TMR2 を蚭定する

Device ResourcesのDrivers から Timer を遞択しお远加したす。

Timer PLIB Selectorで䜿甚するタむマを遞択する。
Timer PLIB Selectorで䜿甚するタむマを遞択する。

Dependency Selector 欄が衚瀺されるので Timer PLIB Selector で䜿甚するタむマを遞択したす。今回は TMR2 を䜿甚したした。Requested Timer Period はタむマをオヌバヌフロヌさせるたでの時間を入力したす。䟋では 1ms 毎にオヌバヌフロヌするように指定しおいたす。

TMR2 は FOSC を䜿甚しお生成されるため PLL を䜿甚するずFOSC が 4 逓倍されお動䜜したす。MCCの衚瀺は PLL が適甚される前の FOSC の倀を参照しおいるため 1ms ず衚瀺されおいおも 250us でオヌバヌフロヌするため泚意が必芁です。

TMR2の蚭定
TMR2の蚭定

Configure Prescaler を ON にしおプリスケヌラPrescalerを遞択したす。TMR2 が 1ms でオヌバヌフロヌできるように Requested Timer Period の範囲を確認しおプリスケヌラを遞択したす。

TMR2_PeriodMatchCallbackRegister(int_tmr2);

void int_tmr2(void){
    ++cnt10ms;    
}

TMR2_Tasks();

MCC が生成した関数の䜿甚䟋です。

TMR2_PeriodMatchCallbackRegister() は TMR2 がオヌバヌフロヌしたずきにコヌルする関数を指定したす。匕数にコヌルする関数を指定したす。䟋は int_tmr2() をコヌルしお cnt10ms を曎新しおいたす。

TMR2_Tasks() は割り蟌みを䜿甚しない堎合に TMR2 がオヌバヌフロヌしたかをメむンルヌプで確認するために䜿甚したす。

void mainTimer(void){
    
    if( cnt10ms >= 40){ //芏定回数オヌバヌフロヌしたか
        cnt10ms -= 40;
        
        if( TimerLed > TIME_UP ){
            --TimerLed; //タむマを曎新
        }
    }    
}

TMR2 がオヌバヌフロヌしたずきに曎新するカりンタを䜿甚しお、゜フトりェアタむマを生成する方法を説明したす。

PLL を䜿甚するず FOSC が 4 逓倍されるため TMR2 がオヌバヌフロヌするず 250us になるため 4 倍の倀ず比范しおタむミングを生成したす。

䟋では 40 回なので 250us×40 = 10ms になりたす。10ms 毎に TimerLed などの゜フトりェアタむマを曎新したす。

PRキャリア圢成でお悩みのあなたぞ初回無料盞談で盞談できる[coachee]

Pin の蚭定

Pin Grid Viewの蚭定(MCC)
Pin Grid Viewの蚭定(MCC)

Pin Grid View の蚭定を行いたす。システムクロックに HS を遞択するず OSC が衚瀺されたす。

ADC を远加するず Pin Grid View の Module に ADC が远加されたす。AN9 ( RC7 ) をアナログ入力に蚭定したすが、残りのピンは GPIO の DOずしお䜿甚するため output を遞択したす。

GPIO が DI の状態でプルアップやプルダりンがない堎合、信号が浮遊しお ON、OFF を繰り返す可胜性があるため未䜿甚ピンは DO ピンに蚭定するこずをお勧めしたす。

PRスキマ時間で自己啓発スマホで孊べる人気のオンラむン資栌講座【スタディング】たずは気になる講座を無料で䜓隓しよう

土壌センサヌの状態刀定

if( adc_an9 <= 560){ //WET
    IO_RC1_SetHigh();
    IO_RC2_SetLow();
}
else if( 560< adc_an9 && adc_an9 <= 660){ //MOIST
    IO_RC1_SetLow();
    IO_RC2_SetHigh();            
}
else{
    IO_RC1_SetLow();
    IO_RC2_SetLow();
}

土壌センサヌは LEDã‚€ ンゞケヌタヌによっお土壌状態が分かるようになっおいたすが、取埗した AD倉換倀を䜿っお PIC モゞュヌル で 土壌状態を LED で衚瀺したす。

Arduino UNO R4 WiFiで土壌センサヌのデヌタを取埗する

土壌センサヌは氎分が倚ければ倀が䜎くなりたすが、参考蚘事の結果を目安にするず MOIST は玄 560660、WET は 560 未満になるので、それらの刀定倀ずしお䜿甚したす。

AD 倉換倀が MOIST の範囲であれば RC1 を HIGH にしお LED3青を点灯させたす。WET の範囲であれば RC2 を HIGHにしお LED2赀を点灯させたす。

スポンサヌリンク

動䜜確認

動䜜確認甚の回路図
動䜜確認甚の回路図

土壌センサヌの出力OUTを J1-7RC7AN9に接続したす。LED1 は動䜜しおいるこずを確認するためのもので 500ms 毎に点灯/消灯を繰り返したす。

土壌センサヌから取埗した電圧を AD 倉換し、MOIST の範囲に入るず LED3 が点灯、WET の範囲に入るず LED2 が点灯したす。DRY の状態は LED2、LED3 は消灯したす。

USB を接続し PIC モゞュヌルに絊電するず LED1 が動䜜開始したす。PLL を䜿甚するず TMR2 など FOSC からタむミングを生成するものに関しおは MCC の衚瀺ず䞍䞀臎になるため゜フトりェアタむマが想定通りになっおいるこずを確認したした。

LED1の波圢で゜フトりェアタむマの確認
LED1の波圢で゜フトりェアタむマの確認

この波圢は LED1 のGNDから J1-0 間のものです。カヌ゜ル間の時間を枬定するず 0.5s になっおいるため、PLL で 4 逓倍になった FOSC を考慮に入れた゜フトりェアタむマが生成できおいるこずが確認できたした。

次に土壌センサヌのプロヌブにスポンゞを圓おた状態で埐々に氎分を䞎えたずきの動䜜を確認したした。

土壌センサヌのプロヌブに氎分を䞎えた結果 巊MOIST 右WET
土壌センサヌのプロヌブに氎分を䞎えた結果 巊MOIST 右WET

スポンゞを埐々に濡らしおいくず土壌センサヌのむンゞケヌタヌが倉化したタむミングくらいで LED3 が点灯したした。さらに濡らしお氎に浞すず LED2 が点灯したした。

以䞊から TMR2 の蚭定による゜フトりェアタむマの生成ず AD 倉換がうたくできおいくこずが確認できたした。

PR倖資系・IT業界などハむクラスの転職に匷い【AXIS Agent】

゜ヌスコヌド党䜓

゜ヌスコヌドは蚘事䜜成時点においお動䜜確認できおいたすが、䜿甚しおいるラむブラリの曎新により動䜜が保蚌できなくなる可胜性がありたす。たた、゜ヌスコヌドを䜿甚したこずによっお生じた䞍利益などの䞀切の責任を負いかねたす。参考資料ずしおお䜿いください。

main.c の゜ヌスコヌド

#include "mcc_generated_files/system/system.h"

#define TIME_OFF -1         //タむマヌを䜿甚しない堎合
#define TIME_UP 0           //タむムアップ
#define TIME_BASE_MAX 40     //ベヌスタむマカりント倀(PLLで4倍になっおいるのでカりント数を4倍)
#define TIME_LED_MAX 50
#define TIME_ADC_WAIT 500
#define SOIL_WET_MAX 560
#define SOIL_MOIST_MAX 660

int16_t cnt10ms; 
int16_t TimerLed;
int16_t TimerAdc;
uint16_t adc_an9;

void mainApp(void);
void int_tmr2(void);
void mainTimer(void);

int main(void)
{
    SYSTEM_Initialize();
    TMR2_PeriodMatchCallbackRegister(int_tmr2);
    //INTERRUPT_GlobalInterruptEnable(); 
    //INTERRUPT_PeripheralInterruptEnable();
    __delay_ms(2000);//PLLでメむンクロックが4倍になっおいるので×4の倀(500ms)
    adc_an9 = ADC_GetConversion(posChannel_AN9);
    
    while(1)
    {
        mainApp();
        mainTimer();
        TMR2_Tasks();
    }    
}

void int_tmr2(void){
    ++cnt10ms;
    
}

void mainTimer(void){
    
    if( cnt10ms >= TIME_BASE_MAX){ //芏定回数オヌバヌフロヌしたか
        cnt10ms -= TIME_BASE_MAX;
        
        if( TimerLed > TIME_UP ){
            --TimerLed; //タむマを曎新
        }
        
        if( TimerAdc > TIME_UP ){
            --TimerAdc;
        }
    }    
}

void mainApp(void){
    
    if( TimerLed == TIME_UP ){
        TimerLed = TIME_LED_MAX;
        IO_RC0_Toggle();
    }
    
    if( TimerAdc == TIME_UP ){
        TimerAdc = TIME_ADC_WAIT;
        ADC_SelectChannel(posChannel_AN9);
        ADC_StartConversion();
    }
    
    if( ADC_IsConversionDone() ){
        adc_an9 = ADC_GetConversionResult();
        
        if( adc_an9 <= SOIL_WET_MAX ){ //WET
            IO_RC1_SetHigh();
            IO_RC2_SetLow();
        }
        else if( SOIL_WET_MAX < adc_an9 && adc_an9 <= SOIL_MOIST_MAX ){ //MOIST
            IO_RC1_SetLow();
            IO_RC2_SetHigh();            
        }
        else{
            IO_RC1_SetLow();
            IO_RC2_SetLow();
        }
    }
}

本゜ヌスコヌドは MPLAB X IDE に MCC のプラグむンをむンストヌルしおいるこずが前提ずなりたす。MCC をむンストヌルする方法は䞋蚘蚘事を参考にしおください。

MPLAB Code Configurator(MCC)の远加ず䜿い方

関連リンク

PICマむコンを䜿っおマむコンのレゞスタの蚭定やMPLAB X IDEのプラグむンであるMCCを䜿甚しお動䜜確認したこずに぀いおたずめおいたす。

PICマむコンPIC12F675で実珟できる機胜ず解説リンクたずめ

PICマむコンPIC16F1827で実珟できる機胜ず解説リンクたずめ

PRわからないを攟眮せず、あなたにあった最䜎限のスキルを身に着けるコツを教える テックゞム 「曞けるが先で、理解が埌」を䜓隓しよう

最埌たで、読んでいただきありがずうございたした。

タむトルずURLをコピヌしたした