更新时间:2025-04-27 02:44:46下载pdf
模拟/数字转换器(Analog to Digital Converter,ADC)通常是指一个将时间连续、幅值也连续的模拟信号转变为时间离散、幅值也离散的数字信号的电子元件。
A/D 转换一般要经过取样、保持、量化及编码四个过程。在实际电路中,这些过程有的是合并进行的,例如,取样和保持、量化和编码往往都是在转换过程中同时实现的。
类型如下:
分辨率:理论上 ADC 对输入信号的分辨能力,一般有 8 位、10 位、12 位、16 位等。
精度:实际模拟电压与采样电压之间的差值,差值的最大值为绝对精度,差值的最大值与满刻度模拟电压得百分比称为相对误差。
转换时间:每次采样所需的时间,表征 ADC 的转换速度,与 ADC 的时钟频率、采样周期、转换周期有关。
数据输出方式:并口输出、串口输出。
工作电压:需要注意 ADC 的工作电压范围、能否直接测量负电压等。
OPERATE_RET tkl_adc_init(TUYA_ADC_NUM_E port_num, TUYA_ADC_BASE_CFG_T *cfg);
功能描述:
参数:
port_num
:ADC 端口号,一个端口对应一个 ADC 实体器件(一般有多个通道),取值如下:
名字 | 定义 |
---|---|
TUYA_ADC_NUM_0 | ADC 端口 0 |
TUYA_ADC_NUM_1 | ADC 端口 1 |
TUYA_ADC_NUM_2 | ADC 端口 2 |
TUYA_ADC_NUM_3 | ADC 端口 3 |
TUYA_ADC_NUM_4 | ADC 端口 4 |
TUYA_ADC_NUM_5 | ADC 端口 5 |
cfg
:ADC 基础配置,取值如下:
typedef struct {
TUYA_AD_DA_CH_LIST_U ch_list; // ADC 通道列表
UINT8_T ch_nums; // 需要采集的 ADC 通道个数
UINT8_T width; // 分辨率(位宽)
UINT32_T freq; // 采样频率
TUYA_ADC_TYPE_E type; // ADC 采样类型
TUYA_ADC_MODE_E mode; // ADC 采样模式
UINT16_T conv_cnt; // ADC 采样次数
UINT32_T ref_vol; // ADC 参考电压(单位:mv)
} TUYA_ADC_BASE_CFG_T;
TUYA_AD_DA_CH_LIST_U
:
typedef union {
TUYA_AD_DA_CH_LIST_BIT_T bits;
UINT32_T data;
}TUYA_AD_DA_CH_LIST_U;
typedef struct {
UINT32_T ch_0 : 1;
UINT32_T ch_1 : 1;
UINT32_T ch_2 : 1;
UINT32_T ch_3 : 1;
UINT32_T ch_4 : 1;
UINT32_T ch_5 : 1;
UINT32_T ch_6 : 1;
UINT32_T ch_7 : 1;
UINT32_T ch_8 : 1;
UINT32_T ch_9 : 1;
UINT32_T ch_10 : 1;
UINT32_T ch_11 : 1;
UINT32_T ch_12 : 1;
UINT32_T ch_13 : 1;
UINT32_T ch_14 : 1;
UINT32_T ch_15 : 1;
UINT32_T rsv :16;
}TUYA_AD_DA_CH_LIST_BIT_T;
采集通道列表可以使用 Bit 位操作,也可以通过 Data 操作,两者效果相同。
ch_nums
:采集的通道数量。
TUYA_ADC_TYPE_E
:
名字 | 定义 |
---|---|
TUYA_ADC_INNER_SAMPLE_VOL | ADC 采样内部电压(例如电源电压) |
TUYA_ADC_EXTERNAL_SAMPLE_VOL | ADC 采样外部电压(例如外部引脚电压) |
TUYA_ADC_MODE_E
:
typedef enum {
TUYA_ADC_SINGLE = 0, ///< Single conversion mode
TUYA_ADC_CONTINUOUS, ///< Continuous conversion mode
TUYA_ADC_SCAN, ///< Scan mode
} TUYA_ADC_MODE_E;
名字 | 定义 | 备注 |
---|---|---|
TUYA_ADC_SINGLE | 单通道采集 | - |
TUYA_ADC_CONTINUOUS | 单通道多次采集 | - |
TUYA_ADC_SCAN | 扫描模式采集 | 可多通道采集 |
conv_cnt
:指定采集模式下的采集次数。
返回值:
OPRT_OK
:成功tuya_error_code.h
> OS_ADAPTER_ADC
定义部分OPERATE_RET tkl_adc_deinit(TUYA_ADC_NUM_E port_num);
port_num
:ADC 端口号OPRT_OK
:成功tuya_error_code.h
> OS_ADAPTER_ADC
定义部分UINT8_T tkl_adc_width_get(TUYA_ADC_NUM_E port_num);
port_num
:ADC 端口号OPRT_OK
:成功tuya_error_code.h
> OS_ADAPTER_ADC
定义部分UINT32_T tkl_adc_ref_voltage_get(TUYA_ADC_NUM_E port_num);
port_num
:ADC 端口号OPRT_OK
:成功tuya_error_code.h
> OS_ADAPTER_ADC
定义部分INT32_T tkl_adc_temperature_get(VOID_T);
OPRT_OK
:成功tuya_error_code.h
> OS_ADAPTER_ADC
定义部分OPERATE_RET tkl_adc_read_data(TUYA_ADC_NUM_E port_num, INT32_T *buff, UINT16_T len);
port_num
:ADC 端口号buff
:ADC 数据缓冲区len
:ADC 数据缓冲区的长度OPRT_OK
:成功tuya_error_code.h
> OS_ADAPTER_ADC
定义部分OPERATE_RET tkl_adc_read_single_channel(TUYA_ADC_NUM_E port_num, UINT8_T ch_id, INT32_T *data);
port_num
:ADC 端口号ch_id
:ADC 通道号data
:ADC 数据缓冲区OPRT_OK
:成功tuya_error_code.h
> OS_ADAPTER_ADC
定义部分OPERATE_RET tkl_adc_read_voltage(TUYA_ADC_NUM_E port_num, INT32_T *buff, UINT16_T len);
port_num
:ADC 端口号buf
:ADC 电压缓冲区len
:ADC 电压缓冲区长度OPRT_OK
:成功tuya_error_code.h
> OS_ADAPTER_ADC
定义部分VOID_T tuya_adc_single_channel_test(VOID_T)
{
OPERATE_RET ret;
TUYA_ADC_BASE_CFG_T adc_cfg;
UINT32_T adc_value = 0;
UINT16_T channel = 0;
adc_cfg.ch_list.data = 1; // or adc_cfg.ch_list.bits.ch_0 = 1;
adc_cfg.ch_nums = 1;
adc_cfg.type = TUYA_ADC_INNER_SAMPLE_VOL;
adc_cfg.mode = TUYA_ADC_SINGLE;
adc_cfg.width = 10;
adc_cfg.conv_cnt = 1;
ret = tkl_adc_init(TUYA_ADC_NUM_0, &adc_cfg);
if(ret != OPRT_OK) {
// failed
return;
}
ret = tkl_adc_read_single_channel(TUYA_ADC_NUM_0, channel, &adc_value);
if(ret != OPRT_OK) {
// failed
return;
}
// 输出 adc_value 的值
ret = tkl_adc_deinit(TUYA_ADC_NUM_0);
if(ret != OPRT_OK) {
// failed
return;
}
}
#define ADC_CHANNEL_NUM 3
VOID_T tuya_adc_multi_channel_test(VOID_T)
{
OPERATE_RET ret;
TUYA_ADC_BASE_CFG_T adc_cfg;
UINT32_T adc_value[ADC_CHANNEL_NUM] = {0};
adc_cfg.ch_list.bits.ch_0 = 1;
adc_cfg.ch_list.bits.ch_1 = 1;
adc_cfg.ch_list.bits.ch_2 = 1;
adc_cfg.ch_nums = ADC_CHANNEL_NUM;
adc_cfg.type = TUYA_ADC_INNER_SAMPLE_VOL;
adc_cfg.mode = TUYA_ADC_SCAN;
adc_cfg.width = 10;
adc_cfg.conv_cnt = 1;
ret = tkl_adc_init(TUYA_ADC_NUM_0, &adc_cfg);
if(ret != OPRT_OK) {
// failed
return;
}
ret = tkl_adc_read_data(TUYA_ADC_NUM_0, adc_value, ADC_CHANNEL_NUM);
if(ret != OPRT_OK) {
// failed
return;
}
// 输出 adc_value[ADC_CHANNEL_NUM] 的值
ret = tkl_adc_deinit(TUYA_ADC_NUM_0);
if(ret != OPRT_OK) {
// failed
return;
}
}
该内容对您有帮助吗?
是意见反馈该内容对您有帮助吗?
是意见反馈