245 wiersze
5.9 KiB
C
245 wiersze
5.9 KiB
C
/**
|
|
* ADC0 Generated Driver File
|
|
*
|
|
* @file adc0.c
|
|
*
|
|
* @ingroup adc0
|
|
*
|
|
* @brief This file contains the driver code for ADC0 module.
|
|
*
|
|
* @version ADC0 Driver Version 1.1.0
|
|
*/
|
|
|
|
/*
|
|
© [2023] Microchip Technology Inc. and its subsidiaries.
|
|
|
|
Subject to your compliance with these terms, you may use Microchip
|
|
software and any derivatives exclusively with Microchip products.
|
|
You are responsible for complying with 3rd party license terms
|
|
applicable to your use of 3rd party software (including open source
|
|
software) that may accompany Microchip software. SOFTWARE IS ?AS IS.?
|
|
NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS
|
|
SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT,
|
|
MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT
|
|
WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
|
|
INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY
|
|
KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF
|
|
MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE
|
|
FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S
|
|
TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT
|
|
EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR
|
|
THIS SOFTWARE.
|
|
*/
|
|
|
|
#include "../adc0.h"
|
|
|
|
adc_irq_cb_t ADC0_SampleReadyCallback = NULL;
|
|
adc_irq_cb_t ADC0_ResultReadyCallback = NULL;
|
|
adc_irq_cb_t ADC0_ErrorCallback = NULL;
|
|
|
|
int8_t ADC0_Initialize(void)
|
|
{
|
|
//PRESC System clock divided by 10;
|
|
ADC0.CTRLB = 0x4;
|
|
|
|
//CHOPPING DISABLE; FREERUN disabled; LEFTADJ disabled; SAMPNUM No accumulation;
|
|
ADC0.CTRLF = 0x0;
|
|
|
|
//REFSEL Internal 1.024V Reference;
|
|
ADC0.CTRLC = 0x4;
|
|
|
|
//WINCM No Window Comparison; WINSRC RESULT;
|
|
ADC0.CTRLD = 0x0;
|
|
|
|
//SAMPDUR 64;
|
|
ADC0.CTRLE = 0x40;
|
|
|
|
//GAIN 1x gain; PGABIASSEL 100% BIAS current.; PGAEN disabled;
|
|
ADC0.PGACTRL = 0x0;
|
|
|
|
//DBGRUN disabled;
|
|
ADC0.DBGCTRL = 0x0;
|
|
|
|
//DIFF disabled; MODE SINGLE_12BIT; START Start a conversion immediately. This will be set back to STOP when the first conversion is done, unless Free-Running mode is enabled;
|
|
ADC0.COMMAND = 0x11;
|
|
|
|
//RESOVR disabled; RESRDY disabled; SAMPOVR disabled; SAMPRDY disabled; TRIGOVR disabled; WCMP disabled;
|
|
ADC0.INTCTRL = 0x0;
|
|
|
|
//MUXPOS Temperature Sensor; VIA Inputs connected directly to ADC;
|
|
ADC0.MUXPOS = 0x32;
|
|
|
|
//MUXNEG Ground; VIA Inputs connected directly to ADC;
|
|
ADC0.MUXNEG = 0x30;
|
|
|
|
// Window comparator high threshold
|
|
ADC0.WINHT = 0x0;
|
|
|
|
// Window comparator low threshold
|
|
ADC0.WINLT = 0x0;
|
|
|
|
//ENABLE enabled; LOWLAT disabled; RUNSTDBY disabled;
|
|
ADC0.CTRLA = 0x1;
|
|
|
|
|
|
return 0;
|
|
}
|
|
|
|
void ADC0_Enable(void)
|
|
{
|
|
ADC0.CTRLA |= ADC_ENABLE_bm;
|
|
}
|
|
|
|
void ADC0_Disable(void)
|
|
{
|
|
ADC0.CTRLA &= ~ADC_ENABLE_bm;
|
|
}
|
|
|
|
void ADC0_SetWindowHigh(adc_result_t high)
|
|
{
|
|
ADC0.WINHT = high;
|
|
}
|
|
|
|
void ADC0_SetWindowLow(adc_result_t low)
|
|
{
|
|
ADC0.WINLT = low;
|
|
}
|
|
|
|
void ADC0_SetWindowMode(ADC0_window_mode_t mode)
|
|
{
|
|
ADC0.CTRLD = mode;
|
|
}
|
|
|
|
void ADC0_SetWindowChannel(adc_0_channel_t channel)
|
|
{
|
|
ADC0.MUXPOS &= ADC_VIA_gm;
|
|
ADC0.MUXPOS |= channel;
|
|
}
|
|
|
|
void ADC0_StartConversion(adc_0_channel_t channel)
|
|
{
|
|
ADC0.MUXPOS &= ADC_VIA_gm;
|
|
ADC0.MUXPOS |= channel;
|
|
ADC0.COMMAND &= ~ADC_DIFF_bm;
|
|
ADC0.COMMAND |= ADC_START_IMMEDIATE_gc;
|
|
}
|
|
|
|
void ADC0_StartDiffConversion(adc_0_channel_t channel, adc_0_muxneg_channel_t channel1)
|
|
{
|
|
ADC0.MUXPOS &= ADC_VIA_gm;
|
|
ADC0.MUXPOS |= channel;
|
|
|
|
ADC0.MUXNEG &= ADC_VIA_gm;
|
|
ADC0.MUXNEG |= channel1;
|
|
|
|
ADC0.COMMAND |= (ADC_START_IMMEDIATE_gc | ADC_DIFF_bm);
|
|
}
|
|
|
|
void ADC0_StopConversion(void)
|
|
{
|
|
ADC0.COMMAND |= ADC_START_STOP_gc;
|
|
}
|
|
|
|
bool ADC0_IsConversionDone(void)
|
|
{
|
|
return (ADC0.INTFLAGS & ADC_RESRDY_bm);
|
|
}
|
|
|
|
adc_result_t ADC0_GetConversionResult(void)
|
|
{
|
|
return (ADC0.RESULT);
|
|
}
|
|
|
|
adc_result_t ADC0_GetConversionSample(void)
|
|
{
|
|
return (ADC0.SAMPLE);
|
|
}
|
|
|
|
bool ADC0_GetWindowResult(void)
|
|
{
|
|
bool temp = (ADC0.INTFLAGS & ADC_WCMP_bm);
|
|
ADC0.INTFLAGS = ADC_WCMP_bm; // Clear intflag if set
|
|
return temp;
|
|
}
|
|
|
|
adc_result_t ADC0_GetConversion(adc_0_channel_t channel)
|
|
{
|
|
adc_result_t res;
|
|
|
|
ADC0_StartConversion(channel);
|
|
while (!ADC0_IsConversionDone());
|
|
res = ADC0_GetConversionResult();
|
|
ADC0.INTFLAGS = ADC_RESRDY_bm;
|
|
return res;
|
|
}
|
|
|
|
diff_adc_result_t ADC0_GetDiffConversion(bool enablePGA, adc_0_channel_t channel, adc_0_muxneg_channel_t channel1)
|
|
{
|
|
diff_adc_result_t res;
|
|
|
|
ADC0_StartDiffConversion(channel, channel1|(enablePGA<<6));
|
|
while (!ADC0_IsConversionDone());
|
|
res = ADC0_GetConversionResult();
|
|
ADC0.INTFLAGS |= ADC_RESRDY_bm;
|
|
return res;
|
|
}
|
|
|
|
uint8_t ADC0_GetResolution(void)
|
|
{
|
|
return (ADC0.COMMAND & ADC_MODE_SINGLE_8BIT_gc) ? 8 : 12;
|
|
}
|
|
|
|
void ADC0_SampleReadyCallbackRegister(adc_irq_cb_t callback)
|
|
{
|
|
ADC0_SampleReadyCallback = callback;
|
|
}
|
|
|
|
void ADC0_ResultReadyCallbackRegister(adc_irq_cb_t callback)
|
|
{
|
|
ADC0_ResultReadyCallback = callback;
|
|
}
|
|
|
|
void ADC0_ErrorCallbackRegister(adc_irq_cb_t callback)
|
|
{
|
|
ADC0_ErrorCallback = callback;
|
|
}
|
|
|
|
ISR(ADC0_SAMPRDY_vect)
|
|
{
|
|
//Clear the interrupt flag
|
|
ADC0.INTFLAGS = ADC_SAMPRDY_bm;
|
|
|
|
if (ADC0_SampleReadyCallback != NULL)
|
|
{
|
|
ADC0_SampleReadyCallback();
|
|
}
|
|
}
|
|
|
|
ISR(ADC0_RESRDY_vect)
|
|
{
|
|
//Clear the interrupt flag
|
|
ADC0.INTFLAGS = ADC_RESRDY_bm;
|
|
|
|
if (ADC0_ResultReadyCallback != NULL)
|
|
{
|
|
ADC0_ResultReadyCallback();
|
|
}
|
|
}
|
|
|
|
ISR(ADC0_ERROR_vect)
|
|
{
|
|
//Clear the interrupt flag
|
|
ADC0.INTFLAGS = ADC_TRIGOVR_bm;
|
|
|
|
//Clear the interrupt flag
|
|
ADC0.INTFLAGS = ADC_SAMPOVR_bm;
|
|
|
|
//Clear the interrupt flag
|
|
ADC0.INTFLAGS = ADC_RESOVR_bm;
|
|
|
|
if (ADC0_ErrorCallback != NULL)
|
|
{
|
|
ADC0_ErrorCallback();
|
|
}
|
|
}
|