ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

10. 利用PY32Studio+HAL库开发ADC单次多通道扫描采样

10. 利用PY32Studio+HAL库开发ADC单次多通道扫描采样 前言在第九章中我们采集3个通道每次采集完一个通道以后要停止采样重新配置通道的参数然后再次启动新通道的采样比较麻烦。本章我们利用ADC的扫描模式来一次采集3个通道。一、功能我们在上个工程的基础上通过PY32Studio可视化界面修改配置实现芯片内部温度传感器Temperature、内部参考电压Vrefint、1/3的VCC的单次扫描ADC采样无需外接任何硬件电路最后通过串口printf实时打印芯片内部结温、内部参考电压、1/3的VCC。本练习采用单次扫描转换模式非DMA非连续。二、硬件通过USB转TTL模块连接PC与Startkit板, Startkit板与USB转TTL模块的连线方式如下通过串口将信息发送到串口助手。Startkit 开发板USB转TTL模块Tx(PA0)RxRx(PA1)TxGNDGND三、PY32Studio配置3.1 打开第九章练习中创建的工程F032_ADC13.2 配置ADC的参数第一步选择ADC的三个内部通道第二步配置ADC的参数Scan Conversion ModeEnable打开扫描模式单次多通道采样Continuous Conversion ModeDisable关闭连续转换单次触发单次采样Discontinuous Conversion ModeDisable第三步配置ADC的规则转换模式Regular conversion mode和三个通道的转换顺序第四步配置另外两个通道的转换顺序和转换时间第五步点击生成工程四、编写应用代码4.1 应用代码在PY32Studio生成的代码的基础上添加以下代码在main.c中修改下面代码中的第三行将原来的单个变量改为数组。/* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ uint16_t adcValue[3] {0,0,0}; //ADC三次转换结果 float VCCA3 0.0; //VCCA/3的电压值Starkit的VCCA默认配置为3.3V, VCCA3 1.1V float Vrefint 0.0; //Vrefint电压值典型值1.2V uint32_t dTemperature 0; //芯片内部温度传感器测量到的温度 /* USER CODE END PV */在main()函数中在while1循环中将原来的代码注释掉或者删除换成以下代码ADC启动ADC转换等待ADC第一次转换完成读取ADC第一次转换结果等待ADC第二次转换完成读取ADC第二次转换结果等待ADC第三次转换完成读取ADC第三次转换结果将转换的结果转化为温度值VrefintVCCA/3打印转换结果。int main(void) { /* USER CODE BEGIN 1 */ ADC_ChannelConfTypeDef sConfig {0}; //定义ADC通道配置的结构体 /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ Studio_RCC_Init(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ Studio_GPIO_Init(); Studio_UART1_Init(); Studio_ADC1_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while(1) { HAL_ADC_Start(hadc1); //启动ADC转换 HAL_ADC_PollForConversion(hadc1,10); //等待第一次转换完成 adcValue[0] HAL_ADC_GetValue(hadc1); //读取第一次转换结果 HAL_ADC_PollForConversion(hadc1,10); //等待第二次转换完成 adcValue[1] HAL_ADC_GetValue(hadc1); //读取第二次转换结果 HAL_ADC_PollForConversion(hadc1,10); //等待第三次转换完成 adcValue[2] HAL_ADC_GetValue(hadc1); //读取第三次转换结果 VCCA3 adcValue[0] * 0.0008; //计算VVCA/3的电压值 adcValue * VCCA/4096 Vrefint adcValue[1] * 0.0008; //计算Vrefint的电压值 adcValue * VCCA/4096 dTemperature __HAL_ADC_CALC_TEMPERATURE(TEMPSENSOR_CAL_VREFANALOG, adcValue[2], ADC_RESOLUTION_12B); //通过测量的电压计算温度 printf(VCCA/3 is %.3f V. \r\n,VCCA3); printf(Vrefint is %.3f V. \r\n,Vrefint); printf(Temperature is %d C.\r\n,(int)dTemperature); HAL_Delay(3000); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ }4.2 设置在选项卡中选择安装的编译器版本和Debug类型。4.3 编译下载点击编译图标开始编译程序编译成功后开始下载程序下载成功后开始调试程序4.4调试点击调试图标进入调试界面运行程序把adcValue、VCCA3、Vrefint、dTemperature四个变量加到Watch1窗口中。在View菜单中选择Periodic Window Update命令全速运行代码观察这几个变量的值。打开串口助手选择正确的端口名波特率数据位校验位和停止位打开串口开始接收数据。右面的窗口可以显示出从MCU发送过来的数据。五、总结本章内容我们采用单次扫描采样的查询方式对ADC1内部的3个通道进行轮流采样计算相应的电压值或温度值并轮流打印计算结果。整个过程主要步骤如下通过PY32Studio配置时钟UART1, ADC1模块在uart.c文件中包括stdio.h头文件重写fputc函数在main.c文件中定义全局变量并且初始化: adcValue、VCCA3、Vrefint、dTemperature在while(1)循环中调用以下几个函数HAL_ADC_Start(hadc1);//启动ADC转换HAL_ADC_PollForConversion(hadc1,10);//等待第1次转换完成adcValue[0] HAL_ADC_GetValue(hadc1);//读取第1次转换结果HAL_ADC_PollForConversion(hadc1,10);//等待第2次转换完成adcValue[1] HAL_ADC_GetValue(hadc1);//读取第2次转换结果HAL_ADC_PollForConversion(hadc1,10);//等待第3次转换完成adcValue[2] HAL_ADC_GetValue(hadc1);//读取第3次转换结果计算温度值或电压值打印温度值或者电压值printf(VCCA/3 is %.3f V. \r\n,VCCA3)调试代码在串口助手中观察打印出的变量的值。
返回列表