Skip to content

Using SAR ADC and WDT in PSOC 4200M series Prototyping kit monitoring of Temperature and Watch dog timer to put CPU to sleep

Notifications You must be signed in to change notification settings

anoopcc99/Temparature-Monitor-Using-PSOC-CY8CKIT-043

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

24 Commits
 
 
 
 
 
 

Repository files navigation

Temparature-Monitor-Using-PSOC-CY8CKIT-043

Using SAR ADC in PSOC 4200M series Prototyping kit Monitoring of Temperature.

PSOC CY8CKIT-043 : https://www.cypress.com/documentation/development-kitsboards/cy8ckit-043-psoc-4-m-series-prototyping-kit

CY8C4247AZI-M485 : https://www.cypress.com/file/377971/download

https://www.cypress.com/file/443811/download

Components Used

  • PSOC CY8CKIT-043
  • LM35 Temparature Sensor

LM35:

DataSheet:

PSOC:

Code:

#include <project.h>

#define CONVERT_TO_ASCII    	(0x30u)

#define CHANNEL_1           	(0u)

volatile uint8  dataReady  = 0u;
volatile uint32 limitFlag = 0u;

CY_ISR_PROTO(ADC1_ISR_Handler);


/* ADC sample ans convert */
static int16 ADC1_Convert(uint32 channel);
/* Process the data */
static void Data_Process(int16 mVolts);

static void SendDecimal(int16 txVal);

int main()
{
    int16 mVolts_ADC = 0u;
    Opamp_Start();
    ADC1_Start();
    UART_Start();

    ADC1_IRQ_StartEx(ADC1_ISR_Handler);
    
    CyGlobalIntEnable;      /* Enable global interrupts */
    
    /* Place your initialization/startup code here (e.g. MyInst_Start()) */
    
    for(;;)
    {
        /* Place your application code here */
        /* ADC conversion */
		mVolts_ADC = ADC1_Convert(CHANNEL_1);
		/* Process the voltage value */
		Data_Process(mVolts_ADC);
		
		/* Delay for UART Print completed */
		CyDelayUs(8000);
        CyDelay(1000);
    }
}

static void SendDecimal(int16 txVal)
{
	uint8 bitNum = 4;
	int16 val = 0;
	uint8 dataArray[bitNum];
	uint8 i = 0u;
	uint8 flag = 0;
	
	/* Convert txVal to ASCII */
	if(txVal < 0)
	{
		UART_UartPutChar('-');
		val = -txVal;
	}
	else
	{
		val = txVal;
	}
	
	for(i=0u; i<bitNum; i++)
	{
		dataArray[i] = val%10 + CONVERT_TO_ASCII;
		val /= 10;
	}
	
	/* Send Volts to UART */
	for(i= bitNum; i>0; i--)
	{
		/* if the MSB is 0, do not send it */
		if(flag == 0u)
		{
			if(dataArray[i-1] != (0+CONVERT_TO_ASCII))
			{
				flag = 1u;
			}
		}
		
		if(flag != 0u)
		{
			UART_UartPutChar(dataArray[i-1]);
		}	
	}
}

CY_ISR(ADC1_ISR_Handler)
{
    uint32 intr_status;

    /* Read interrupt status registers */
    intr_status = ADC1_SAR_INTR_MASKED_REG;
    /* Check for End of Scan interrupt */
    if((intr_status & ADC1_EOS_MASK) != 0u)
    {
        /* Read range interrupt status and raise the flag */
        limitFlag = ADC1_SAR_RANGE_INTR_MASKED_REG;
        /* Clear range detect status */
        ADC1_SAR_RANGE_INTR_REG = limitFlag;
        dataReady = 1u;
    }
    /* Clear handled interrupt */
    ADC1_SAR_INTR_REG = intr_status;
}

#define ADC_SAMPLE_CNT (10)
static int16 ADC1_Convert(uint32 channel)
{
	int16 mVolts = 0; 
	uint8 i = 0u;
	int32 ADCResultSum = 0;
	
	for(i = 0; i<ADC_SAMPLE_CNT; i++)
	{
	    /* Start ADC conversion */
	    ADC1_StartConvert();
		while(dataReady == 0u)
	    {
	        ; /* Wait for ADC conversion */
	    }
	    /* Stop ADC conversion */		
	    ADC1_StopConvert();
		dataReady = 0u;
		
		ADCResultSum += (int32)ADC1_GetResult16(channel);
	}

    /* Convert the ADC counts to mVolts. ADC is configured to be single channel */
	mVolts = ADC1_CountsTo_mVolts(channel, (int16)(ADCResultSum/ADC_SAMPLE_CNT));
	
	return mVolts;
}

static void Data_Process(int16 mVolts)
{
    int16 mVolts_ADC  = 0; 
	int32 TempC  = 0;
    //static int16 preVal = 0;
	static uint32 prelimitFlag = 0;
	
	mVolts_ADC = mVolts;
	TempC = ((float32)mVolts_ADC/10);
	
    /* Check ADC limit detection interrupt */
	if(prelimitFlag != limitFlag)
	{
		/* Display "Day" when input is below the low limit voltage, or display "Night" */
		UART_UartPutString((limitFlag > 0u) ? "Day" : "Night");
		UART_UartPutCRLF(0u);
		prelimitFlag = limitFlag;
	}
    
    /* If the result changes, send it to UART */
    //preVal != TempC
    if(1)
    {    
#if 1
		/* Send ADC Result Voltage to UART */
		UART_UartPutString("ADCRst:");
	    /* Send Volts to UART */
		SendDecimal(mVolts);
	    UART_UartPutString(" mV; ");
        UART_UartPutString("\n");
        UART_UartPutString("\r");
        UART_UartPutString("TempC:");
        SendDecimal(TempC);
        UART_UartPutString("*C");
        UART_UartPutString("\n");
        UART_UartPutString("\r");
#endif			
        //preVal = TempC;
    }
}

About

Using SAR ADC and WDT in PSOC 4200M series Prototyping kit monitoring of Temperature and Watch dog timer to put CPU to sleep

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages