使用示例

## 使用示例 ```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 ```