功能概述
本代码实现了通过 TLD4020-3ET 芯片的 GPIO 接口读取外部电位器的电压值,经 ADC 转换为数字量后,动态调整 PWM 占空比,最终控制 LED 亮度。该方案完美契合用户手册中“GPIO 接口用于评估不同应用场景”的设计目标,是汽车内饰 RGB LED 调光的典型基础实现。
硬件连接
ADC 输入:GPIO0 连接至电位器,将模拟电压信号引入芯片内部 ADC 模块。
PWM 输出:通过 LED 驱动模块输出 PWM 信号,其占空比由 ADC 转换结果动态决定。
信号处理流程
ADC 采样:
读取 GPIO0 的模拟电压值,转换为 12 位数字量。
假设电位器的电压范围为 0V 到 3.3V,ADC 的分辨率为 12 位,则数字量的范围为 0 到 4095。
数据处理:
将 ADC 转换得到的数字量映射到 PWM 占空比的范围(例如 0% 到 100%)。
计算公式:占空比 (%) = (ADC 值 / 4095) * 100。
PWM 调光:
根据计算得到的占空比,设置 PWM 模块的占空比参数。
PWM 信号输出到 LED 驱动模块,控制 LED 的亮度。

原理图

电位器位置
初始化阶段:调用 PMU_serviceWatchdog() 喂狗,防芯片因初始化超时复位,契合汽车电子防死机要求;通过 Device_init() 硬件全局初始化,自动配置 ADC(11 位精度、通道 4)、GPIO(Pin0 使能)等模块;禁用 GPIO0 功能屏蔽,保障调试器正常连接;若初始化失败,进入死循环防芯片异常。主循环阶段:每轮执行“ADC 采集→错误判断→PWM 调节”闭环。ADC 通道 4 关联 GPIO0,采集电位器电压。通过判断 ADC 错误掩码位捕获异常,设置错误标记。数据有效性二次判断后,将 ADC 数据映射为 PWM 占空比,其中 ADC_LOW_THD 过滤电位器死区,LDRV_ADC_CONV 确定转换系数,写入 LDRV 寄存器实现亮度调节,对应 RGB LED 独立控制特性。最后,do-while 循环等待 ADC 数据有效,确保读取准确。sint32 main(void) {// 定义返回值变量,用于存储硬件初始化结果sint8 s8_returnCode;// ADC结果寄存器存储变量(32位,兼容11位ADC数据)uint32 u132_adc_reg = 0;// ADC数字量结果(16位,存储转换后的电位器值)uint16 u16_adc_value = 0;// ADC错误标志(true表示本轮转换出现错误)bool b_adc_error = false;/* 主看门狗服务 - 防止初始化阶段超时复位 */(void)PMU_serviceWatchdog();/* 硬件模块初始化(基于配置向导生成) */// 初始化ADC(11位精度/通道4)、GPIO(Pin0使能)、LDRV等模块s8_returnCode = Device_init();/* 解除GPIO0的功能屏蔽 - 确保调试器(如J-Link)可正常连接 */GPIO->PDISC.bit.PDIS0 = 0;// 初始化失败处理:进入死循环防止异常运行if (s8_returnCode != ERR_LOG_SUCCESS) {for (;;);}for (;;) { // 主循环(持续运行)/* 主看门狗服务 - 维持系统稳定 */(void)PMU_serviceWatchdog();/* 检查ADC是否就绪(硬件标志位) */if (ADC11_getAdcReadySts()) {// 启动通道4(GPIO0)的ADC转换ADC11_startChConversion(ADC11_CFG_1_ADC_CHNR_CH_4);/* 等待转换结果有效 */do {// 读取ADC结果寄存器u132_adc_reg = ADC11->RESULT.reg;/* 错误检测:检查ADC错误标志位 */if (u132_adc_reg & (uint32)ADC11_RESULT_ADC_ERROR_Msk) {b_adc_error = true; // 标记错误状态break;}}// 循环条件:结果无效时持续等待while (!(u132_adc_reg & (uint32)ADC11_RESULT_ADC_VALID_Msk));/* 数据有效性二次验证 */if ((!b_adc_error) &&(ERR_LOG_SUCCESS == ADC11_getChResult(&u16_adc_value, ADC11_CFG_1_ADC_CHNR_CH_4))) {/* PWM占空比调节逻辑 */// 过滤电位器死区(ADC_LOW_THD以下视为关闭)u16_adc_value > ADC_LOW_THD// 线性映射:有效ADC值转换为PWM占空比(LDRV_ADC_CONV为转换系数)? (LDRV->PWM_DC_CFG0.reg = (uint32)((u16_adc_value - ADC_LOW_THD) * LDRV_ADC_CONV))// 低于阈值时关闭LED(占空比设为0): (LDRV->PWM_DC_CFG0.reg = (uint32)0u);}}}}
我要赚赏金
