[干货分享] 【深创客】跟我学NB-IoT之AT命令从入门到精通系列三:AD采样计算电池电压与功耗

、本节教程目的

本节教程将接着已有的教程二进行功能的添加,实现通过AD的采样与计算,得到电池电压与板子当前的功耗等,最终将计算结果通过调试串口进行输出。


、开发环境

  NB476开发板套件

  Keil&STM32CubeMX开发工具


、开发步骤

(一)初始化要操作的硬件(关键步骤)

    1.引脚初始化

   通过查看原理图,可以得知:

   (1)要将引脚PA9,PA10设置为串口功能,以便通过串口查看AD数据

   (2)这里一共初始化了4个引脚为AD采样通道,分别用来采样板子功耗(PA0),电池电压(PA1),光敏电阻电压(PB1)与扩展口上的PB0电压

   注意,初始化代码可通过STM32CubeMX工具自动生成,然后复制粘贴到LiteOS中进行使用,不用自己手动编写。不知道如何使用STM32CubeMX配置的同学,可以参考我们百度云盘里,密码:7cw,提供的裸机例程,如图。


        1.png


    2.创建任务 


   在教程二中已经创建的任务基础上,接续创建AD采样任务,代码如下:

    (1)在main函数内创建新任务

int main(void)
{
    UINT32 uwRet = LOS_OK;
    uwRet = LOS_KernelInit();
    if(uwRet != LOS_OK)
    {
       return LOS_NOK;
    }
    
    //对以下任务中要用到的中断号进行注册
    LOS_HwiCreate(EXTI3_IRQn, 2,0,EXTI3_IRQHandler, NULL);
    LOS_HwiCreate(DMA1_Channel1_IRQn, 3,0, DMA1_Channel1_IRQHandler, NULL);

   ...
   
   //AD采样任务
   uwRet = LOS_ADCExampleEntry();
   if (uwRet != LOS_OK)`
   {
       return LOS_NOK;
   }
	LOS_Start();
}

   (2)AD采样任务创建细节

UINT32 LOS_ADCExampleEntry(void)//AD采样任务
{
    UINT32 uwRet;
    TSK_INIT_PARAM_S stTaskInitParam;
    (VOID)memset((void *)(&stTaskInitParam), 0, sizeof(TSK_INIT_PARAM_S));
    stTaskInitParam.pfnTaskEntry = (TSK_ENTRY_FUNC)LOS_ADCExampleTskfunc;//入口函数
    stTaskInitParam.uwStackSize = LOSCFG_BASE_CORE_TSK_IDLE_STACK_SIZE;
    stTaskInitParam.pcName = "adcDemo";
    stTaskInitParam.usTaskPrio = 9;
    uwRet = LOS_TaskCreate(&g_uwadc1TaskID, &stTaskInitParam);

    if (uwRet != LOS_OK)
    {
        return LOS_NOK;
    } 
    return LOS_OK;
}

   (3)将采集到的AD值计算后,通过串口输出

VOID LOS_ADCExampleTskfunc(VOID)
{
	uint16_t ADC1_Value[12];
	uint32_t ADC_Power_Consumption,ADC_Bat,ADC_Light,ADC_PB0;	
	LOS_EvbADC1Start((uint32_t*)ADC1_Value, 12);
	LOS_TaskDelay(2000);
	while(1)
	{
		LOS_EvbADC1Start((uint32_t*)ADC1_Value, 12);
		ADC_Power_Consumption = 0;
		ADC_Bat = 0;
		ADC_Light = 0;
		ADC_PB0 = 0;
		
		for(uint8_t i=0; i<12;)
		{
			ADC_Power_Consumption += ADC1_Value[i++];
			ADC_Bat += ADC1_Value[i++];
			ADC_Light += ADC1_Value[i++];
			ADC_PB0 += ADC1_Value[i++];
		}
		
		power_consumption = (ADC_Power_Consumption/3.0f)*3.3f/4096*100/R_ADC/R_SENS*1000;
		battery = ((ADC_Bat/3.0f)*3.3f/4096)/10*14.7f;
		
		if(((int)power_consumption) >= 100)
			sprintf((char *)power_consumption_data, "%3.1f", power_consumption);
		else
			sprintf((char *)power_consumption_data, "%c%2.1f", '0',power_consumption);
		sprintf((char *)battery_data, "%1.1f", battery);
		
		printf(" ADC_Power_Consumption value = %1.3fmA \r\n", power_consumption);//功耗公式V*100/R_ADC/R_SENS*1000
		printf(" ADC_battery value = %1.3fV\r\n", battery);
		printf(" ADC_light value = %1.3fV \r\n", (ADC_Light/3.0f)*3.3f/4096);
		printf(" ADC_PB0 value = %1.3fV \r\n", (ADC_PB0/3.0f)*3.3f/4096);
		
		LOS_EvbADC1Stop();
		adc_suspend_flag = 1;
		
		LOS_TaskSuspend(g_uwadc1TaskID);
	}
}


  (二)编译与下载

     步骤可见教程一


四、最终效果

    将USB转TTL与开发板上的调试串口相连后,再与电脑相连。如图,GND接GND,TX接RX,RX接TX

            20.jpg

  电脑上打开串口工具,找到对应的COM口,设置波特率为115200,即可看到输出结果

            



 上一篇:【深创客】跟我学NB-IoT之AT命令从入门到精通系列二:传感器数据采集及显示

 下一篇:待续