sensor_data.battery_level = (sensor_value - D_ADC_BAT_LOPOWER)*100/ (D_ADC_BAT_HIPOWER - D_ADC_BAT_LOPOWER);
时间: 2023-08-05 12:07:15 浏览: 209
这行代码计算了电池电量的百分比值。它使用了一个公式来根据传感器的AD值(sensor_value)和预定义的最低电量(D_ADC_BAT_LOPOWER)、最高电量(D_ADC_BAT_HIPOWER)来计算电池电量的百分比。
具体计算步骤如下:
1. 从传感器的AD值中减去最低电量(D_ADC_BAT_LOPOWER)。
2. 将上一步的结果乘以100。
3. 将上一步的结果除以最高电量和最低电量之间的差值(D_ADC_BAT_HIPOWER - D_ADC_BAT_LOPOWER)。
最终的结果会赋值给sensor_data结构体的battery_level字段,表示电池电量的百分比值。
相关问题
static void sensor_data_task(void *args) { xQueueHandle sensor_queue = (xQueueHandle)args; static D_MsgData msg_data; static D_SensorData sensor_data; static D_SensorData sensor_data1; static D_S16 sensor_value; while(1) { if(xQueueReceive(sensor_queue, &msg_data,( TickType_t ) pdMS_TO_TICKS(1000))) { if (msg_data.msg_type == D_MSG_TYPE_AD_DATA) { d_drv_exit_low_power(); /*get pressure data*/ if (!d_drv_is_low_power()) { d_adc_sample_data(D_ADC_CHANNEL_SENSOR_DATA, &sensor_value); //D_DUMP("[sensor_data_task]: batterry_ad_value = %d", sensor_value); /*battery level check*/ if(sensor_value > D_ADC_BAT_HIPOWER) { sensor_data.battery_level = 100; } else if(sensor_value < D_ADC_BAT_LOPOWER) { sensor_data.battery_level = 0; } else { sensor_data.battery_level = (sensor_value - D_ADC_BAT_LOPOWER)*100/ (D_ADC_BAT_HIPOWER - D_ADC_BAT_LOPOWER); } D_DUMP("[sensor_data_task]: batterry_ad_value = %d, battery_level = %d", sensor_value, sensor_data.battery_level); sensor_data.sensor_type = D_SENSOR_TEMPERATURE; sensor_data.sensor_info.value = d_ds18b20_get_data(); warn_check(D_SENSOR_TEMPERATURE, &sensor_data.sensor_info); //D_DUMP("[sensor_data_task]: temperature_sensor_value = %d", sensor_data.sensor_info.value); sensor_data1.battery_level = sensor_data.battery_level; sensor_data1.sensor_type = D_SENSOR_VALVE; sensor_data1.sensor_info.value = (((D_U8)config_info.valve_controlled_type) << 4) |((D_U8)(10 - config_info.valve_status)); //D_DUMP("[sensor_data_task]: valve_sensor_value = %d", sensor_data1.sensor_info.value); } if (sensor_data_event_user_callback != NULL) { sensor_data_event_user_callback(&sensor_data); nrf_delay_us(1000); sensor_data_event_user_callback(&sensor_data1); } d_drv_enter_low_power(); } } } } 啥意思
这段代码是一个名为"sensor_data_task"的静态函数,它是一个任务函数。在这个任务中,它通过接收一个队列中的数据来获取传感器数据。首先,它会检查接收到的消息类型是否为AD数据类型。如果是AD数据类型,则会执行一系列操作。
首先,它会退出低功耗模式,然后获取压力传感器的数据值。接着,它会根据获取的AD值来判断电池电量的等级,并将结果保存到sensor_data结构体的battery_level字段中。
然后,它会设置sensor_data结构体的sensor_type字段为D_SENSOR_TEMPERATURE,并调用d_ds18b20_get_data()函数来获取温度传感器的数据值,并将结果保存到sensor_info结构体的value字段中。紧接着,它会调用warn_check()函数来检查温度传感器的数据,并进行相应的处理。
接下来,它会设置sensor_data1结构体的battery_level字段为sensor_data结构体中保存的电池电量值,并设置sensor_data1结构体的sensor_type字段为D_SENSOR_VALVE。然后,它会将阀门控制类型和阀门状态信息保存到sensor_info结构体的value字段中。
接着,它会检查是否注册了sensor_data_event_user_callback回调函数。如果注册了,则会依次调用该回调函数,并将sensor_data和sensor_data1作为参数传入。最后,它会进入低功耗模式。
总体来说,这段代码的功能是获取传感器数据,并通过回调函数将数据传递给其他模块进行处理。
if (config_info.support_charge) { battery_level_adc_high = D_ADC_BAT_HIPOWER_CHARGE; battery_level_adc_low = D_ADC_BAT_LOPOWER_CHARGE; } else { battery_level_adc_high = D_ADC_BAT_HIPOWER; battery_level_adc_low = D_ADC_BAT_LOPOWER; } m_queue = xQueueCreate( 10, sizeof(D_MsgData)); xTaskCreate(sensor_data_task, "sensor_data_task", 256*2, m_queue, 1, &xHandle_sensor_task); configASSERT( xHandle_sensor_task ); sensor_op_mutex = xSemaphoreCreateRecursiveMutex(); if( sensor_op_mutex == NULL ) { D_DUMP("[d_sensor_data_init]: create semaphere error"); } d_adc_register_callback(adc_user_callback); return D_TRUE;
这段代码是一个函数或者代码块的片段,它包含了一些条件判断和任务创建等操作。根据代码中的条件`config_info.support_charge`的值,选择不同的赋值操作。如果`config_info.support_charge`为真,则将`battery_level_adc_high`赋值为`D_ADC_BAT_HIPOWER_CHARGE`,将`battery_level_adc_low`赋值为`D_ADC_BAT_LOPOWER_CHARGE`;否则,将`battery_level_adc_high`赋值为`D_ADC_BAT_HIPOWER`,将`battery_level_adc_low`赋值为`D_ADC_BAT_LOPOWER`。
接下来,使用`xQueueCreate`函数创建一个队列,指定队列的长度为10,元素的大小为`sizeof(D_MsgData)`。然后使用`xTaskCreate`函数创建一个任务,名为"sensor_data_task",传递参数为`m_queue`,任务的优先级为1,并将任务的句柄保存在`xHandle_sensor_task`中。使用`configASSERT`宏来确保任务的句柄非空。
接着使用`xSemaphoreCreateRecursiveMutex`函数创建了一个递归互斥量(`sensor_op_mutex`)。如果互斥量创建失败,则输出错误信息。
最后,注册了一个ADC回调函数(`adc_user_callback`),并返回了一个宏定义的常量 `D_TRUE`。
这段代码的作用可能是初始化一些传感器数据相关的操作,并创建了一个任务和队列用于处理传感器数据。根据不同的配置信息,选择不同的电池电平值。
阅读全文