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信号周期范围,通过软件滤除超范围的信号

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

相关推荐
国科安芯2 天前
面向卫星测控应答机的抗辐射MCU信号采集与定时控制研究
单片机·嵌入式硬件·mcu·架构·卫星·商业航天·抗辐射
花 满 楼2 天前
5777M的eMIOS 封波(ODIS)功能实现:一个通道输入沿触发,冻结另一个通道 PWM 输出
mcu·嵌入式软件·emios
qq_402995754 天前
Secure Boot Part 2 —— 安全启动流程
arm开发·mcu·安全
jianqiang.xue4 天前
ESP-IDF保姆级入门23|MQTT物联网通信全解:发布订阅模式/QoS等级/遗嘱消息/主题设计/断线重连,掌握工业级标准消息通信
stm32·单片机·mcu·物联网·51单片机·iot
youcans_4 天前
【嵌入式软件AI编程】01. 基于 STM32/Claude Code的AI编程
stm32·mcu·嵌入式·ai编程·claude code
小麦嵌入式4 天前
FPGA入门(十一):受控线性序列机 UART 发送升级
stm32·单片机·嵌入式硬件·mcu·fpga开发·硬件工程
jianqiang.xue4 天前
ESP-IDF保姆级入门29|FreeRTOS任务管理与调度全解:任务创建/状态切换/优先级调度/双核负载均衡/实时性优化,掌握嵌入式多任务编程核心
stm32·单片机·mcu·物联网·51单片机·iot
jianqiang.xue5 天前
ESP-IDF保姆级入门22|WiFi联网与网络编程全解:STA/AP双模式/TCP-UDP Socket/HTTP服务端/自动重连,掌握工业级可靠网络通信
人工智能·stm32·单片机·mcu·物联网·51单片机·iot
李永奉6 天前
中科蓝讯SDK开发-提示音音频文件格式转换和压缩教程
网络·单片机·嵌入式硬件·mcu·物联网
花 满 楼7 天前
RISC-V APLIC 中断模块总结——第二篇
单片机·嵌入式硬件·mcu·risc-v