2025-05-21 11:31:07 +08:00

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;
}