01
概述
DO 即模拟输入(AI, Analog Input),用于读取连续变化的信号,如温度、湿度、压力等。模拟输入可以接收一定范围内的电压或电流信号,并将其转换为数字值。
02
相关技术描述
-
采集 4-20mA(可选 0-5V)信号。下图为一种硬件设计方案
一般仪器仪表的信号电流都为4mA-20mA,指最小电流为4mA,最大电流为20mA 。
传输信号时候,要考虑到导线上也有电阻,如果用电压传输则会在导线的产生一定的压降,那接收端的信号就会产生一定的误差了!所以使用电流信号作为变送器的标准传输!
那么为什么选择4mA-20mA而不是0mA-20mA呢?4ma而不是0ma是用来检测线路开路的,如果0是最小,那么开路故障就检测不到了
-
可将采集值转换为实际测量值,支持校准
-
可设置多项采样、报警(如设置上下限报警值)
-
与数据上报参数
-
支持连接及断开状态检测
-
双重数字滤波器抗噪
-
采样频率:33Hz
采样频率(Sampling Frequency)是指在单位时间内从连续信号中提取并组成离散信号的采样个数,通常用赫兹(Hz)来表示。它是数字信号处理中的一个重要概念,用于将模拟信号转换为数字信号。
-
10 位精度
10位ad转换就是把模拟信号比如5v的电压转换成10位的数字信号1111111111.来表示.那么0v的模拟信号用数字量表示就是0000000000.精度其实就是分辨率即指数字量变化一个最小量时模拟信号的变化量.所以这里的精度应该是5/2^10
03
应用场景
3.1 水泵
云端通过控制DO输出高低电平,来控制外围电路,进而控制水泵的启停。
3.2 风扇
同理,云端通过控制DO输出高低电平,来控制外围电路,进而控制风扇的启停。
3.3 报警灯
结合DTU的DI功能,如果检测到了DI异常信号输入,DTU可以控制连接DO的报警灯报警。
04
DO组件的使用
1 Gitee链接地址
组件位于amaziot_bloom_os_sdk\libraries\am\xtu\am_aic
Gitee源码地址:https://gitee.com/ning./hongdou
Github源码地址:https://github.com/ayumid/hongdou
2 应用层组件功能介绍
提供AI实现实例。
使用该组件,必须同时使用AT组件,文件组件,TCP组件,掉线组件,掉线重连组件,DI组件,DO组件,AI组件,JSON组件,CLK组件。
3 代码讲解
1 dtu_ai_read
读adc值,提供给调用函数计算外接信号电流
/**
* Function : dtu_ai_read
* Description : 读adc值,提供给调用函数计算外接信号电流
* Input :
*
* Output :
* Return :
* Auther : zhaoning
* Others :
**/
UINT16 dtu_ai_read(void)
{
UINT16 ul_adc_value = 0;
UINT32 ul_adc_temp = 0;
UINT16 adc_temp[DTU_AI_AVG_MAX_NUM] = {0};
int i = 0;
//平均值滤波
for(i = 0; i < DTU_AI_AVG_MAX_NUM; i++)
{
adc_temp[i] = SDK_READ_ADC_VALUE_NEW(0, 1);
ul_adc_temp += adc_temp[i];
ms10leep(1);
}
ul_adc_value = ul_adc_temp / DTU_AI_AVG_MAX_NUM;
printf("SDK_READ_ADC_VALUE 0 adcValue %d\n", ul_adc_value);
return ul_adc_value;
}
2 dtu_ai_report_timer_callback
主动上报回调函数,判断当前是否在透传模式,发送消息给JSON任务,上报到服务器
/**
* Function : dtu_ai_report_timer_callback
* Description : 主动上报回调函数,判断当前是否在透传模式,发送消息给JSON任务,上报到服务器
* Input :
*
* Output :
* Return :
* Auther : zhaoning
* Others :
**/
static void dtu_ai_report_timer_callback(UINT32 tmrId)
{
DTU_JSON_MSG_T ai_send_msg = {0};
// printf("dtu_do1_report_timer_callback\n");
DTU_UART_PARAM_T* dtu_uart_ctx = NULL;
DTU_FILE_PARAM_T* dtu_file_ctx = NULL;
dtu_uart_ctx = dtu_get_uart_ctx();
dtu_file_ctx = dtu_get_file_ctx();
// printf("dtu_gnss_timer_callback");
//判断是否是在透传模式
if(dtu_uart_ctx->uart_mode == DTU_DATA_MODE)
{
// if(DTU_AI_REPORT_INITIATIVE == dtu_file_ctx->ai.ai_res_rule)
// {
ai_send_msg.msgId = DTU_AI_MSG_ID_AI_PROACTIVE_REPORT;
// }
// else if(DTU_AI_REPORT_TRIGGER == dtu_file_ctx->ai.ai_res_rule)
// {
// ai_send_msg.msgId = DTU_AI_MSG_ID_AI_TRIGGER_REPORT;
// }
dtu_json_task_send_msgq(&ai_send_msg);
}
}
3 dtu_ai1_report_timer_start
开始AI周期上报定时器
/**
* Function : dtu_ai1_report_timer_start
* Description : 开始AI周期上报定时器
* Input :
*
* Output :
* Return :
* Auther : zhaoning
* Others :
**/
void dtu_ai1_report_timer_start(UINT32 time)
{
UINT32 uc_time = 0;
uc_time = time;
OSATimerStop(dtu_ai_report_timer_ref);
// printf("start type timer %d\n", uc_time);
//开启定时器
OSATimerStart(dtu_ai_report_timer_ref, uc_time * 200, uc_time * 200, dtu_ai_report_timer_callback, 0);
}
4 dtu_ai1_report_timer_stop
停止AI周期上报定时器
/**
* Function : dtu_ai1_report_timer_stop
* De