ããã«ã¡ã¯ã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 ã®èšå®

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 ã䜿çšããªããŠãåé¡ãããŸããã
Clock Control ã®èšå®

Clock Control ãéžæããClock Source ãã FOSC ãéžæããŸããConfiguration Bits ã§ HS ãéžæããŠããå Žå㯠External Clock ã«å€éšã¯ãªã¹ã¿ã«ã®çºä¿¡åšæ³¢æ°ãå ¥åã§ããã®ã§ ã12,000,000 (12MHz)ããå ¥åããŸãã
å·Šäžé ã®ãGenerateããã¯ãªãã¯ãããš MCC ãèšå®ããé ç®ã®åæåãå«ãã ãœãŒã¹ã³ãŒããèªåã§çæããŸãã
ADC ãèšå®ãã
Device Resourcesã®Drivers ãã ADC ãéžæããŠè¿œå ããŸãã Drivers ã«è¿œå ããã 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 ãçæãã颿°ã®äœ¿çšäŸã§ãã
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 倿å€ãååŸããŸãã
Timer ãã©ã€ããŒã§ TMR2 ãèšå®ãã
Device Resourcesã®Drivers ãã Timer ãéžæããŠè¿œå ããŸãã

Dependency Selector æ¬ã衚瀺ãããã®ã§ Timer PLIB Selector ã§äœ¿çšããã¿ã€ããéžæããŸããä»å㯠TMR2 ã䜿çšããŸãããRequested Timer Period ã¯ã¿ã€ãããªãŒããŒãããŒããããŸã§ã®æéãå ¥åããŸããäŸã§ã¯ 1ms æ¯ã«ãªãŒããŒãããŒããããã«æå®ããŠããŸãã
TMR2 㯠FOSC ã䜿çšããŠçæããããã PLL ã䜿çšãããšFOSC ã 4 éåãããŠåäœããŸããMCCã®è¡šç€ºã¯ PLL ãé©çšãããåã® FOSC ã®å€ãåç §ããŠãããã 1ms ãšè¡šç€ºãããŠããŠã 250us ã§ãªãŒããŒãããŒããããæ³šæãå¿ èŠã§ãã

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 ã®èšå®ãè¡ããŸããã·ã¹ãã ã¯ããã¯ã« HS ãéžæãããš OSC ã衚瀺ãããŸãã
ADC ã远å ãããš Pin Grid View ã® Module ã« ADC ã远å ãããŸããAN9 ( RC7 ) ãã¢ããã°å ¥åã«èšå®ããŸãããæ®ãã®ãã³ã¯ GPIO ã® DOãšããŠäœ¿çšãããã output ãéžæããŸãã
GPIO ã DI ã®ç¶æ ã§ãã«ã¢ããããã«ããŠã³ããªãå Žåãä¿¡å·ãæµ®éã㊠ONãOFF ãç¹°ãè¿ãå¯èœæ§ãããããæªäœ¿çšãã³ã¯ DO ãã³ã«èšå®ããããšããå§ãããŸãã
åå£ã»ã³ãµãŒã®ç¶æ å€å®
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 ã®GNDãã J1-0 éã®ãã®ã§ããã«ãŒãœã«éã®æéãæž¬å®ãããš 0.5s ã«ãªã£ãŠãããããPLL ã§ 4 éåã«ãªã£ã FOSC ãèæ ®ã«å ¥ãããœãããŠã§ã¢ã¿ã€ããçæã§ããŠããããšã確èªã§ããŸããã
次ã«åå£ã»ã³ãµãŒã®ãããŒãã«ã¹ãã³ãžãåœãŠãç¶æ ã§åŸã ã«æ°Žåãäžãããšãã®åäœã確èªããŸããã

ã¹ãã³ãžãåŸã ã«æ¿¡ãããŠãããšåå£ã»ã³ãµãŒã®ã€ã³ãžã±ãŒã¿ãŒãå€åããã¿ã€ãã³ã°ãããã§ 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ïŒã§å®çŸã§ããæ©èœãšè§£èª¬ãªã³ã¯ãŸãšã
æåŸãŸã§ãèªãã§ããã ãããããšãããããŸããã
