110 lines
3.0 KiB
C
110 lines
3.0 KiB
C
![]() |
/*
|
||
|
* drv_adc.c
|
||
|
*
|
||
|
* Created on: 2025年4月7日
|
||
|
* Author: 22332
|
||
|
*/
|
||
|
#include "drv_adc.h"
|
||
|
|
||
|
#define ADC_INSTANCE 0UL
|
||
|
#define ADC_VREFH 3.3f
|
||
|
#define ADC_VREFL 0.0f
|
||
|
|
||
|
uint16_t adcRawValue;
|
||
|
uint16_t adcMax;
|
||
|
float adcValue;
|
||
|
char msg[255] =
|
||
|
{ 0, };
|
||
|
|
||
|
void floatToStr (const float *srcValue, char *destStr, uint8_t maxLen)
|
||
|
{
|
||
|
uint8_t i, lessThanOne = 0;
|
||
|
float tempVal = (*srcValue);
|
||
|
uint8_t currentVal;
|
||
|
|
||
|
if (tempVal < 0)
|
||
|
{
|
||
|
tempVal *= -1;
|
||
|
*destStr = '-';
|
||
|
destStr++;
|
||
|
}
|
||
|
for (i = 0; i < maxLen; i++)
|
||
|
{
|
||
|
currentVal = (uint8_t) (tempVal);
|
||
|
*destStr = currentVal + 48;
|
||
|
destStr++;
|
||
|
tempVal -= currentVal;
|
||
|
if ((tempVal < 1) && (lessThanOne == 0))
|
||
|
{
|
||
|
*destStr = '.';
|
||
|
destStr++;
|
||
|
lessThanOne = 1;
|
||
|
}
|
||
|
tempVal *= 10;
|
||
|
}
|
||
|
*destStr = 0;
|
||
|
}
|
||
|
void bsp_drv_adc_init(void)
|
||
|
{
|
||
|
if (adc_config_1_ConvConfig0.resolution == ADC_RESOLUTION_8BIT)
|
||
|
adcMax = (uint16_t) (1 << 8);
|
||
|
else if (adc_config_1_ConvConfig0.resolution == ADC_RESOLUTION_10BIT)
|
||
|
adcMax = (uint16_t) (1 << 10);
|
||
|
else
|
||
|
adcMax = (uint16_t) (1 << 12);
|
||
|
ADC_DRV_ConfigConverter(ADC_INSTANCE, &adc_config_1_ConvConfig0);
|
||
|
ADC_DRV_AutoCalibration(ADC_INSTANCE);
|
||
|
}
|
||
|
uint16_t bsp_drv_adc1_read(void)
|
||
|
{
|
||
|
/* Configure ADC channel and software trigger a conversion */
|
||
|
ADC_DRV_ConfigChan(ADC_INSTANCE, 0U, &adc_config_1_ChnConfig0);
|
||
|
/* Wait for the conversion to be done */
|
||
|
ADC_DRV_WaitConvDone(ADC_INSTANCE);
|
||
|
/* Store the channel result into a local variable */
|
||
|
ADC_DRV_GetChanResult(ADC_INSTANCE, 0U, &adcRawValue);
|
||
|
|
||
|
/* Process the result to get the value in volts */
|
||
|
adcValue = ((float) adcRawValue / adcMax) * (ADC_VREFH - ADC_VREFL);
|
||
|
floatToStr(&adcValue, msg, 5);
|
||
|
printf("ADC1_read:");
|
||
|
printf(msg);
|
||
|
printf(" V\r\n");
|
||
|
return adcRawValue;
|
||
|
}
|
||
|
uint16_t bsp_drv_adc2_read(void)
|
||
|
{
|
||
|
/* Configure ADC channel and software trigger a conversion */
|
||
|
ADC_DRV_ConfigChan(ADC_INSTANCE, 0U, &adc_config_1_ChnConfig1);
|
||
|
/* Wait for the conversion to be done */
|
||
|
ADC_DRV_WaitConvDone(ADC_INSTANCE);
|
||
|
/* Store the channel result into a local variable */
|
||
|
ADC_DRV_GetChanResult(ADC_INSTANCE, 0U, &adcRawValue);
|
||
|
|
||
|
/* Process the result to get the value in volts */
|
||
|
adcValue = ((float) adcRawValue / adcMax) * (ADC_VREFH - ADC_VREFL);
|
||
|
floatToStr(&adcValue, msg, 5);
|
||
|
// printf("ADC2_read:");
|
||
|
// printf(msg);
|
||
|
// printf(" V\r\n");
|
||
|
// printf("adcRawValue = %d",adcRawValue);
|
||
|
return adcRawValue;
|
||
|
}
|
||
|
uint16_t bsp_drv_adc3_read(void)
|
||
|
{
|
||
|
/* Configure ADC channel and software trigger a conversion */
|
||
|
ADC_DRV_ConfigChan(ADC_INSTANCE, 0U, &adc_config_1_ChnConfig2);
|
||
|
/* Wait for the conversion to be done */
|
||
|
ADC_DRV_WaitConvDone(ADC_INSTANCE);
|
||
|
/* Store the channel result into a local variable */
|
||
|
ADC_DRV_GetChanResult(ADC_INSTANCE, 0U, &adcRawValue);
|
||
|
|
||
|
/* Process the result to get the value in volts */
|
||
|
adcValue = ((float) adcRawValue / adcMax) * (ADC_VREFH - ADC_VREFL);
|
||
|
floatToStr(&adcValue, msg, 5);
|
||
|
// printf("ADC3_read:");
|
||
|
// printf(msg);
|
||
|
// printf(" V\r\n");
|
||
|
return adcRawValue;
|
||
|
}
|