使用示例
## 使用示例
```language
/**
* @file adc_demo.c
* @ingroup peripheral
* @brief ADC外设Demo
* @attention 当量程设置为1V时(目前仅支持1V量程):
单端模式下,ADC量程为0-1V;
双端模式,P端接地,量程为-1V~0V,输入正电压读数均为负数;
双端模式,N端接地,量程为0~1V;
双端模式,两端接信号,量程为 -1V~1V。
单端模式只需要一个电压输入信号,双端模式需要两个电压输入信号,双端模式的电压是差分电压。
当ADC设置为测量内部电压模式时,量程为0-5V。
ADC位数为12位,采样频率有240K和480K可选。
***********************************************************************************/
#include "softap_api.h"
#include "xy_peripheral.h"
#if DEMO_TEST
#define ADC_WORK_MODE ADC_MODE_TYPE_SINGLE_P
#define ADC_WORK_SPEED ADC_SPEED_TYPE_240K
#define ADC_STACK_SIZE 1024
#define ADC_TASK_PRIORITY 11
UINT32 g_adc_TskHandle = -1;
/**
* @brief ADC测试任务线程,程序运行后,会从AT口输出当前ADC采样得到的
* 转换中间值、未校准的电压值、校准后的转换中间值和电压值。
* @code
* xy_ADC_Open(ADC_WORK_MODE, ADC_WORK_SPEED);
for(i=0; i<10; i++)
{
real_val = xy_ADC_Get_RealValue();
average += real_val;
}
xy_ADC_Close();
if(average >= 0)
real_val = (average + 5) / 10;
else
real_val = (average - 5) / 10;
convert_val = xy_ADC_Get_ConverteValue(real_val);
no_cal_vol = xy_ADC_Get_Voltage_WithoutCal(convert_val);
round_val = xy_ADC_Get_RoundingValue_WithCal(convert_val);
cal_vol = xy_ADC_Get_Voltage_WithCal(convert_val);
str_out = xy_malloc(200);
sprintf(str_out, "\r\n"
"real_val = %d\r\n"
"convert_val = %d\r\n"
"no_cal_vol = %d\r\n"
"round_val = %d\r\n"
"cal_vol = %d\r\n",
real_val, convert_val, no_cal_vol, round_val, cal_vol);
send_debug_str_to_at_uart(str_out);
xy_free(str_out);
* @endcode
*/
void adc_test_task()
{
short real_val; // actually read value
short convert_val; // convert the real value
short no_cal_vol; // voltage without calibration
short round_val; // calibrate the convert value
short cal_vol; // voltage with calibration
unsigned short i;
int average;
char *str_out = NULL;
while(1)
{
average = 0;
xy_ADC_Open(ADC_WORK_MODE, ADC_WORK_SPEED);
for(i=0; i<10; i++)
{
real_val = xy_ADC_Get_RealValue();
average += real_val;
}
xy_ADC_Close();
if(average >= 0)
real_val = (average + 5) / 10;
else
real_val = (average - 5) / 10;
convert_val = xy_ADC_Get_ConverteValue(real_val);
no_cal_vol = xy_ADC_Get_Voltage_WithoutCal(convert_val);
round_val = xy_ADC_Get_RoundingValue_WithCal(convert_val);
cal_vol = xy_ADC_Get_Voltage_WithCal(convert_val);
//if (no_cal_vol > 400)
{
str_out = xy_malloc(200);
sprintf(str_out, "\r\n"
"real_val = %d\r\n"
"convert_val = %d\r\n"
"no_cal_vol = %d\r\n"
"round_val = %d\r\n"
"cal_vol = %d\r\n",
real_val, convert_val, no_cal_vol, round_val, cal_vol);
send_debug_str_to_at_uart(str_out);
xy_free(str_out);
}
xy_sleep(2000);
}
}
/**
* @brief 这个函数为ADCdemo提供了一个工作线程
*
* @return UINT32
*/
UINT32 adc_test_task_init(void)
{
UINT32 uwRet = LOS_NOK;
uwRet = xy_TaskCreate((TaskFunc_t)adc_test_task, "adc_test_task", ADC_STACK_SIZE, NULL, ADC_TASK_PRIORITY, &g_adc_TskHandle);
return uwRet;
}
#endif
```