在本次活动测评中需要使用STM32内部的ADC,读取电池电压的任务,这里和大家分享一下,基本的开发经验。
ADC简单介绍:是指模拟信号转换成数字信号,通俗的讲是指cpu可将连续变化的模拟信号转换成数字信号的器件,见外部的电流或者电压信号通过内部的ADC通道转换为数字信号。
这里我是用的是ADC4,引脚使用PA7引脚,
基本的软件编写思路:
首先开启PA口时钟和ADC4时钟,设置PA7为模拟输入模式,否则AD不能正常读数程序开启之前复位ADC4,同时设置ADC4分频因子和ADC的位数等相关信息。
初始化ADC4参数,配置规则通道参数: 开启软件转换: 等待转换完成,读取ADC值。
简单说明一下具体的思路
1:系统时钟的选择:根据电路板的硬件设计,由于该开发板并没有外部晶振,这里我们使用的是内部的RC时钟,然后配置ADC的时钟分频器,确保ADC在工作时频率正确,最后使能使用的ADC1的时钟2:ADC的基本参数配置:
2:合适的ADC模式,STM32WBA55支持多种转换模式,单次转换和多次转换的模式,我个人认为还是使用连续多次转换的模式效果更好些。设置好合适的采样周期,ADC的采集到的数据不仅仅和外部传感器输入的实际数据有关,和采样的频率也息息相关,经过我个人的工作经历来说,合适的采样时间才能采集到准确的AD数据,通常采集频率过快,会导致ADC数据不稳定。较高的采样时间会增加数据的稳定性,但是这样会增加程序运行的时间。
3:在cube中配置好ADC转换的来源,可以是外部触发、定时器或者是中断处触发等等触发方式。
4:开始转换并读取ADC的采集数据结果。
二:硬件资源的分析:
确定一下底板IO口的引脚,这里我使用的是con7接口的A0,对应的引脚为GPIO11如下所示:
根据GPIO11标识,在WBA55CG上面找到对应的IO口
如上图所示:为板载A0 对应开发板的PA7引脚;
三:stm32 cube 软件的配置图,如下所示:
如上图所示,配置ADC4的参数;
四:重要代码如下:
while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ // iOutputData = iOutputData + 5 ; // if(iOutputData >=100 ) iOutputData = 0 ; // UpdataDutyData(iOutputData); // HAL_Delay(500); if (HAL_ADC_Start(&hadc4) != HAL_OK) { /* ADC conversion start error */ Error_Handler(); } /* Wait for ADC conversion completed */ if (HAL_ADC_PollForConversion(&hadc4, 10) != HAL_OK) { /* End Of Conversion flag not set on time */ Error_Handler(); } uhADCxConvertedData = HAL_ADC_GetValue(&hadc4); voltage=uhADCxConvertedData*3.3/4096; HAL_Delay(1000); printf(" Hello !STM32WBA55CG TEST ! autor by keyboard007 !\r\n"); printf(" uhADCxConvertedData = %5d\r\n",uhADCxConvertedData); printf(" voltage = %1.3fv\r\n",voltage); } /* USER CODE END 3 */ }
实物测试图如下所示:
串口输出图如下所示:
到这里,使用ADC读取电池电压的任务完成。