GPIO同时复用(ADC与TIM)

众所周知,MCU的GPIO可复用为不同的功能.那么是否可以同时使能多个功能呢?可以(当然,部分架构可能不支持)

常见示例:

  • 模拟IIC: GPIO在开漏输出的同时可以读IDR来获得输入
  • 无LPUART的MCU实现低功耗唤醒: 把RXD同时复用为外部中断来唤醒,但会丢失首字节
  • UART自动波特率识别: 配置RXD同时为TIM捕获,通过特定序列来抓取1bit时长来计算波特率

可见,在数字信号尤其同时为输入的场景下,一个GPIO被同时复用为多个功能的情况还是很常见的.但也基本都是无奈之举,硬件支持或有更多GPIO可用的情况,更推荐分离功能的方案.

本例讨论实际项目中遇到模拟输入与数字输入同时存在时的配置实现与缺陷.项目需采集外部信号,可能为模拟量信号或PWM(齿缺)信号.对于基础应用可前置RC将PWM转为模拟等方式归一化处理,或分别接入不同GPIO进行采集.项目需要分别不同信号源且获取原始数据,且出于成本和尺寸限制无法更换更大封装型号,只能在原板基础上实现此功能.项目采用CH32V003J4,10bitADC,选用引脚为PD6/PA1(内部合封,本质只用PA1).信号幅值较高通过100K+100K分压网络分压至5V(也为后文缺陷埋下伏笔)

查看GPIO结构图可见,本质配置GPIO_Mode只是控制几个开关(上下拉,输出Pmos,输出控制器,输入施密特触发器).对于输入来说,浮空输入上拉输入下拉输入为一组,区别在上下拉的开关组合,而模拟输出则是浮空输入+关闭施密特触发器(PS: 因此低功耗应用才推荐不用的GPIO配置为模拟输入,可以节约施密特触发器消耗).本例中的模拟信号从施密特触发器前的AnalogInput路径到ADC,TIM通道则走施密特触发器后的AlternateFunctionInput路径,因此GPIO应配置为浮空输入.

c 复制代码
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );
/* GPIO PA1 T1CH2 */
GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_30MHz;
GPIO_Init( GPIOA, &GPIO_InitStructure );

之后正常按单一GPIO配置对应的ADC通道与TIM输入捕获即可.

测试验证

  1. 仅使能TIM捕获功能测试PWM信号,此场景就是常规的输入捕获,功能理应完全正常
  2. 仅使能ADC采样功能测试模拟信号,此场景与常规场景就是GPIO_Mode从AIN变float,但ADC在触发器前级采样,功能理应完全正常
  3. 同时使能TIM与ADC测试模拟信号,此场景TIM由于在施密特触发器后级,并不能影响前级的采样,ADC读数理应正常.TIM在模拟信号处于触发器阈值附近时触发连续的中断(此时忽略)
  4. 同时使能TIM与ADC测试PWM信号,此场景TIM应正常捕获信号,若出现异常短时长则调大数字滤波TIM_ICFilter即可解决

异常分析

在测试3测试4中,均有可能出现TIM捕获异常,这是由于施密特触发器前级的ADC采样导致的电压波动而误触发了施密特触发器.模拟信号时抓取引脚端信号如图:

可见模拟信号(分压后)存在规律性的抖动,这是ADC采样导致的.计算验证:

MCU主频24MHz,8分频作为ADC时钟,则ADC每cycle约为0.33us.本例共采样两通道,均采样73Cycles,因此可计算得到73x2x0.33us=48.2us,与图中抖动周期基本一致.

ADC内部存在采样电容C与采样开关电阻R. 查询芯片手册得知,C典型值3pF,R最大值1.5K(采最大值以计算最坏),外部100K分压即串联100K,电容充满至少需6.9RC.因此可计算得到6.9x101.5kx3pF=2.1us,也与图中抖动宽度基本一致(实际电路存在走线电容等影响).

ADC采样瞬间给内部采样电容充电,GPIO引出与内部仅有1.5K电阻,与信号源则有100K,因此被瞬间拉低到电容充电结束.测试3中周期性的噪声信号即由此产生.测试4中此异常叠在5V PWM信号内,对信号精度产生一定影响但可通过数字滤波消除

改善此异常的几种方式:

  • IO端增加小电容快速补偿以减少信号被拉低的幅值,使其减少触发施密特触发器.但电容会导致PWM信号斜率变化,需要评估
  • 降低分压阻值,即加快充能.使其能够轻易的被捕获滤波器滤除.需评估信号源,本例中就无法修改
  • 调整ADC频率与采样周期(需大于充能时间以保证精度)来尽可能避开PWM信号周期范围,通过软件滤除超范围的信号

本质此用法是受限于项目实际环境的无奈之举,在兼顾的同时必然无法专精采样精度等,因此常规项目更推荐分离的实现

相关推荐
硅基手札3 小时前
【串口技术系列文档 07】UART控制器寄存器详解
驱动开发·stm32·单片机·嵌入式硬件·mcu·计算机外设
硅基手札3 小时前
【串口技术系列文档 09】FIFO管理与流控
驱动开发·stm32·单片机·嵌入式硬件·mcu·计算机外设
硅基手札3 小时前
【串口技术系列文档 08】中断驱动vs轮询vs DMA
驱动开发·stm32·单片机·嵌入式硬件·mcu·计算机外设
硅基手札1 天前
【串口技术系列文档 04】UART协议深度解析
驱动开发·stm32·单片机·嵌入式硬件·mcu·计算机外设
意法半导体STM321 天前
【官方原创】LAT1724 STM32CubeIDE for VSCode 修改链接文件中的起始地址无效?
vscode·stm32·单片机·嵌入式硬件·mcu·stm32cube
蓝天居士2 天前
PY32F系列MCU在OTA时App区概率性跑不起来的根因分析(3)
mcu·嵌入式
国科安芯4 天前
航天器健康管理系统中嵌入式控制器的多源状态监测与故障诊断能力评估
mcu·健康管理·抗辐射·空间信息·航天器
Brilliantwxx4 天前
【STM32】基础定时器 TIM 详解:从极简原理到寄存器全解析
stm32·单片机·嵌入式硬件·mcu
小刘max4 天前
从半导体视角理解 NVM 与 Flash:存储单元、阵列架构与应用差异
mcu
蓝天居士4 天前
PY32F系列MCU在OTA时App区概率性跑不起来的根因分析(2)
mcu·嵌入式