恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
11. 利用PY32Studio+HAL库开发ADC单次多通道扫描采样+中断
首页
资讯中心
/
11. 利用PY32Studio+HAL库开发ADC单次多通道扫描采样+中断
11. 利用PY32Studio+HAL库开发ADC单次多通道扫描采样+中断
发布时间:2026/10/4 19:59:43
前言在第十章中我们扫描方式采集3个通道每个通道要等待其采集完成后才能读取数据等待期间一直处于阻塞状态浪费CPU的时间。本章我们利用ADC的扫描模式中断的方式来采集3个通道大大降低CPU的负载。一、功能我们在上个工程的基础上通过PY32Studio可视化界面修改配置实现芯片内部温度传感器Temperature、内部参考电压Vrefint、1/3的VCC的单次扫描ADC采样无需外接任何硬件电路最后通过串口printf实时打印芯片内部结温、内部参考电压、1/3的VCC。本练习采用单次扫描转换模式中断非连续。二、硬件通过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 ModeEnable关闭连续转换单次触发单次采样Discontinuous Conversion ModeDisable第三步配置ADC的规则转换模式Regular conversion mode和三个通道的转换顺序第四步配置另外两个通道的转换顺序和转换时间第五步使能ADC中断第六步点击生成工程四、编写应用代码4.1 应用代码在PY32Studio生成的代码的基础上添加以下代码修改下面代码中的第7行和第8行增加两个变量adcCompleteFlag和convIndex。/* 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; //芯片内部温度传感器测量到的温度 uint8_t adcCompleteFlag 0; //转换完成标志位1转换完成0转换未完成 uint8_t convIndex 0; //转换次序 /* USER CODE END PV */在main.c文件中重写ADC转换完成的回调函数/* USER CODE BEGIN 4 */ void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc) { if(hadc-InstanceADC1) { adcValue[convIndex] HAL_ADC_GetValue(hadc1); //读取转换结果 convIndex; //转换次序加1 if(convIndex 3) { adcCompleteFlag 1; //标记3通道采样转换完成 convIndex 0; //将转换次序归零 HAL_ADC_Start_IT(hadc1); //重新启动ADC转换 } } } /* USER CODE END 4 */在main()函数中在USER CODE BEGIN 2段中加入HAL_ADC_Start_IT(hadc1);启动ADC转换在while1循环中将原来的代码注释掉或者删除换成以下代码判断三次转换是否完成如果转换完成将转换的结果转化为温度值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 */ HAL_ADC_Start_IT(hadc1); //启动ADC转换采用中断方式。 /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while(1) { if(adcCompleteFlag 1) { VCCA3 adcValue[0] * 0.0008; //计算VVCA/3的电压值 adcValue * VCCA/4096 printf(VCCA/3 is %.3f V. \r\n,VCCA3); Vrefint adcValue[1] * 0.0008; //计算Vrefint的电压值 adcValue * VCCA/4096 printf(Vrefint is %.3f V. \r\n,Vrefint); dTemperature __HAL_ADC_CALC_TEMPERATURE(TEMPSENSOR_CAL_VREFANALOG, adcValue[2], ADC_RESOLUTION_12B); //通过测量的电压计算温度 printf(Temperature is %d C.\r\n,(int)dTemperature); adcCompleteFlag 0; } HAL_Delay(1000); /* 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发送过来的数据。五、总结本章内容我们采用单次扫描采样的中断方式每个通道转换结束以后在中断回调函数中读取该通道的转换结果所有通道采样结束后再计算相应的电压值或温度值并轮流打印计算结果。整个过程主要步骤如下通过PY32Studio配置时钟UART1, ADC1模块在uart.c文件中包括stdio.h头文件重写fputc函数在main.c文件中定义全局变量并且初始化: adcValue、VCCA3、Vrefint、dTemperatureadcCompleteFlagconvIndex在中断回调函数中读取每次转换的结果三次转换完成后将转换完成标志位置位并再次启动转换在while(1)循环中判断转换是否完成计算温度值或电压值打印温度值或者电压值调试代码在串口助手中观察打印出的变量的值。