尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

TM4C123电机控制实战:PWM故障保护与QEI编码器高精度测速

TM4C123电机控制实战:PWM故障保护与QEI编码器高精度测速
📅 发布时间:2026/7/18 8:17:02

1. 项目概述与核心价值

在电机控制、伺服驱动这类对实时性和可靠性要求极高的嵌入式应用里,两个核心模块的深度理解往往是项目成败的关键:一个是负责输出控制信号的PWM(脉宽调制)模块,另一个是负责反馈位置与速度的QEI(正交编码器接口)模块。很多工程师在项目初期可能会把重点放在如何生成PWM波和读取编码器计数值上,这固然没错,但真正考验系统鲁棒性的,往往是那些“异常情况”下的处理机制。比如,电机堵转或过流时,PWM能否快速、安全地关断?编码器受到干扰产生误脉冲时,系统是继续累积错误还是能有效滤除?

最近在基于TI的TM4C123GH6ZRB微控制器开发一套高精度云台控制系统时,我就深刻体会到了深入寄存器层面进行配置的必要性。数据手册里关于PWM故障状态寄存器(PWMnFLTSTAT1)和QEI模块的章节,初看可能觉得是枯燥的位域描述,但当你需要实现毫秒级故障响应、或是从编码器信号中提取出真实、平滑的速度信息时,这些寄存器的每一个配置位都变得至关重要。本文将结合我的实际调试经验,抛开简单的API调用,深入到PWMnFLTSTAT1寄存器的锁存机制、QEI模块的输入滤波与速度计算原理,为你呈现一套可直接复现的、具备工业级可靠性的电机控制底层驱动实现方案。无论你是正在学习TM4C系列的新手,还是希望优化现有电机控制代码的资深工程师,相信这些对寄存器“细枝末节”的剖析都能带来启发。

2. PWM故障保护机制深度解析

在电机驱动中,PWM模块不仅仅是输出信号的发生器,更是系统安全的第一道防线。TM4C123的PWM模块提供了一个基于数字比较器(Digital Comparator)触发的硬件故障保护机制,其状态核心就体现在PWMnFLTSTAT0和PWMnFLTSTAT1这两个寄存器中。特别是PWMnFLTSTAT1,它直接关联到8个数字比较器(DCMP0-7)的触发状态,理解它的两种工作模式(实时模式与锁存模式)是设计可靠故障保护逻辑的基础。

2.1 PWMnFLTSTAT1寄存器:两种模式与核心位域

根据数据手册,PWMnFLTSTAT1寄存器(偏移量0x808)的0-7位分别对应数字比较器DCMP0到DCMP7的触发状态。它的行为完全由PWMnCTL寄存器中的两个关键位控制:LATCH位和FLTSRC位。

实时模式(LATCH = 0):在此模式下,PWMnFLTSTAT1是只读的。寄存器中的每一位(如DCMP0)直接反映了对应数字比较器触发输入引脚(如CMP0)的当前电平状态。你可以把它想象成一个透明的玻璃窗,能实时看到外面的“天气”(故障信号)。这种模式适用于你需要持续监控故障线状态,并可能根据实时状态进行复杂逻辑判断的场景。例如,你可能设置一个比较器在电流超过阈值A时触发,另一个在超过更高阈值B时触发,在实时模式下,你可以区分这两种不同程度的故障,并采取分级响应(如降功率或完全关断)。

锁存模式(LATCH = 1):这是更常用、也更安全的故障处理模式。当LATCH位置1后,PWMnFLTSTAT1寄存器变为“写1清零”(R/W1C)类型。一旦某个数字比较器触发(即其输入信号有效),对应的状态位(如DCMP0)就会被硬件锁存为1,即使外部的故障信号已经消失,这个锁存状态也会一直保持。这就像是一个带有记忆功能的警报灯,一旦被触发就会一直亮着,直到你手动按下复位按钮(向该位写1)。这个机制至关重要,它能确保任何瞬时的故障脉冲都不会被漏掉,系统可以“记住”故障发生过,为后续的故障分析和安全处理提供依据。

注意:要使能锁存模式的写入功能(即能通过写1来清零状态位),还必须将PWMnCTL寄存器中的FLTSRC位置1,以启用故障源扩展功能。这是一个容易忽略的配置点,如果只设置了LATCH=1而没设置FLTSRC=1,你将无法通过软件清除故障标志,可能导致故障状态无法退出。

2.2 数字比较器触发与故障响应动作的绑定

仅仅知道故障发生了还不够,关键是要让PWM模块做出正确的响应。数字比较器的触发必须与PWM发生器的故障动作绑定才有效。这需要通过配置PWMnFLTCTL(故障控制)寄存器来完成。

每个PWM发生器(如PWM0、PWM1)都有对应的FLTCTL寄存器。你需要在该寄存器中指定,当某个数字比较器(如DCMP0)触发时,PWM输出应采取什么动作。常见的动作包括:

  • 强制输出低电平:立即将PWM输出拉低,电机刹车。
  • 强制输出高电平:立即将PWM输出拉高(慎用,可能造成短路)。
  • 置为高阻态:关闭输出驱动,相当于断开连接。
  • 不动作:仅记录状态,不影响输出(用于诊断)。

例如,你可以配置当DCMP0(连接至过流保护电路)触发时,将PWM0和PWM1输出强制置低。配置代码可能如下所示:

// 假设使用PWM Module 0, Generator 0 和 1 驱动一个H桥 // 设置故障动作:当故障条件0(对应DCMP0)发生时,将PWM输出强制拉低 HWREG(PWM0_BASE + PWM_O_0_FLTCTL) |= (PWM_FLTCTL_FAULT0_ACT_ZERO << PWM_FLTCTL_FAULT0_S); HWREG(PWM0_BASE + PWM_O_1_FLTCTL) |= (PWM_FLTCTL_FAULT0_ACT_ZERO << PWM_FLTCTL_FAULT0_S);

这里的关键是理解,PWMnFLTSTAT1告诉你“故障源是谁”,而PWMnFLTCTL则定义了“对这个故障源应该做什么”。两者必须配合配置。

2.3 实战配置:实现一个带锁存功能的硬件刹车

假设我们需要为一个直流有刷电机驱动设计保护电路:使用一个比较器监控电机电流,当电流超过设定值(比如10A)时,比较器输出高电平,连接到MCU的某个GPIO,我们将该GPIO配置为数字比较器0(CMP0)的输入。

步骤一:外设与引脚配置

  1. 启用系统时钟到PWM模块和GPIO模块(通过SYSCTL_RCGC0和SYSCTL_RCGC2寄存器)。
  2. 将故障信号输入的GPIO引脚配置为外设功能(设置GPIOAFSEL寄存器),并将其映射到数字比较器输入(通过GPIOPCTL寄存器的PMCn域,具体映射值需查数据手册引脚复用表)。
  3. 配置数字比较器模块,将选定的GPIO输入作为CMP0的正相或反相输入,并设置参考电压。

步骤二:PWM故障模块配置

// 1. 启用故障源扩展功能,并设置为锁存模式 uint32_t temp = HWREG(PWM0_BASE + PWM_O_0_CTL); temp |= PWM_0_CTL_FLTSRC; // 启用故障源扩展 temp |= PWM_0_CTL_LATCH; // 设置为锁存模式 HWREG(PWM0_BASE + PWM_O_0_CTL) = temp; // 2. 配置故障动作:当故障0(DCMP0)发生时,PWM输出强制低 HWREG(PWM0_BASE + PWM_O_0_FLTCTL) = (PWM_FLTCTL_FAULT0_ACT_ZERO << PWM_FLTCTL_FAULT0_S); // 3. (可选)使能故障输入。如果故障信号是异步的(不来自数字比较器),可能需要此步骤。 // 本例使用数字比较器,可跳过。

步骤三:故障状态处理与恢复在系统的主循环或故障中断服务程序中,需要定期检查并处理故障状态。

// 检查PWM0 Generator 0的故障状态寄存器1 uint32_t faultStatus = HWREG(PWM0_BASE + PWM_O_0_FLTSTAT1); // 检查是否是DCMP0触发的故障(位0) if (faultStatus & PWM_0_FLTSTAT1_DCMP0) { // 故障已发生,执行安全处理逻辑,如记录日志、关闭其他外设等 SystemHaltForSafety(); // 在采取所有安全措施后,尝试清除故障锁存位(写1清零) // 注意:必须先确保FLTSRC和LATCH位已按步骤二设置,否则此写入无效 HWREG(PWM0_BASE + PWM_O_0_FLTSTAT1) = PWM_0_FLTSTAT1_DCMP0; // ���次读取确认是否清除 if (HWREG(PWM0_BASE + PWM_O_0_FLTSTAT1) & PWM_0_FLTSTAT1_DCMP0) { // 清除失败,可能硬件故障持续存在,需要更高级别的处理(如系统复位) } else { // 故障标志已清除,可以尝试重新使能PWM(需重新配置PWM发生器) // 注意:在严重故障后,应谨慎评估是否自动恢复 } }

实操心得:在实际调试中,我发现故障恢复逻辑需要特别小心。自动清除故障并重启PWM,如果故障源是持续的(如电机卡死),会导致系统在故障和重启间循环振荡。一个更稳健的做法是,在清除故障标志前,必须确保外部故障条件已解除(例如,通过ADC读取的电流值已恢复正常)。或者,采用“故障锁存-人工复位”的策略,即发生硬件故障后,系统进入安全状态并等待上位机或用户手动复位。

3. QEI模块:从原理到高精度速度位置测量

正交编码器是闭环电机控制的眼睛,而QEI模块就是解读这双眼睛信号的大脑。TM4C123的QEI模块提供了从信号输入、滤波、位置积分到速度捕获的一整套硬件解决方案,用好了可以极大减轻CPU负担并提高测量精度。

3.1 输入信号处理:滤波、反相与交换

编码器信号在长线传输中极易引入毛刺,QEI模块内置的数字噪声滤波器是抗干扰的第一道关卡。通过设置QEICTL寄存器中的FILTEN位使能滤波器,并通过FILTCNT位域设置滤波采样次数。例如,设置FILTCNT=5,表示输入信号需要连续5个系统时钟周期保持稳定,其变化才会被边沿检测电路认可。这个值需要根据系统时钟频率和预期的噪声频率来权衡:设置太小可能滤不掉噪声,设置太大则可能滤掉有效的快速脉冲。

INVA、INVB和SWAP位提供了信号调理的灵活性。如果你的电机转向与编码器计数方向相反,可以通过设置SWAP位交换PhA和PhB信号。如果编码器输出是低电平有效,或者为了匹配电路逻辑,可以用INVA或INVB位对相应信号取反。这避免了修改硬件接线的麻烦。

3.2 位置积分模式:X1、X2与X4分辨率

QEI的位置计数器(QEIPOS)的计数方式由CAPMODE位决定,这直接决定了系统的位置分辨率。

  • X1模式(CAPMODE = 0):仅在PhA的边沿(上升沿和下降沿)更新计数器。PhB信号仅用于判断方向。对于每转产生N个脉冲的编码器,位置分辨率是每转2N个计数。这是最基础的模式。
  • X4模式(CAPMODE = 1):在PhA和PhB的每一个边沿(共4个)都更新计数器。这提供了最高的分辨率,每转可得到4N个计数。例如,一个1000线的编码器,每转能产生4000个计数。

如何选择?X4模式精度最高,但计数器溢出更快(16位或32位计数器)。如果你的电机转速很高,编码器线数也多,需要计算一下最大计数值是否会溢出。QEIMAXPOS寄存器可以设置位置计数器的最大值,结合RESMODE位,可以实现两种复位模式:

  • 索引复位模式(RESMODE = 1):当检测到索引(Index)脉冲时,QEIPOS复位为0。这用于获取绝对位置。你需要将QEIMAXPOS设置为(4 * N) - 1(X4模式)或(2 * N) - 1(X1模式),其中N是编码器线数。这样,位置值就在[0, (4N-1)]之间循环,代表一圈内的绝对机械角度。
  • 最大值复位模式(RESMODE = 0):当QEIPOS达到QEIMAXPOS设定的值时,自动复位为0。这用于相对位置计数。QEIMAXPOS通常设置为计数器的最大值(如0xFFFFFFFF)。

3.3 速度捕获原理与精准计算实践

速度捕获是QEI模块的另一个强大功能。它通过一个独立的定时器(QEITIME)和计数器(QEICOUNT)来工作。定时器从QEILOAD值开始递减计数,减到0时产生中断(如果使能),同时硬件自动将QEICOUNT寄存器中的值(上一个周期的边沿数)搬移到QEISPEED寄存器,然后将QEICOUNT清零,并重载QEILOAD开始下一个周期。因此,QEISPEED总是保存着上一个完整定时周期内捕获的边沿总数。

速度计算的关键公式如下,其推导基于“速度 = 距离 / 时间”:

rpm = (SysClk * (2 ^ VELDIV) * QEISPEED * 60) / (QEILOAD * PPR * Edges)
  • SysClk: QEI定时器的时钟频率(通常为系统时钟)。
  • VELDIV: 速度预分频因子(QEICTL寄存器中的VELDIV位域),可取0(1分频)、1(2分频)、2(4分频)、3(8分频)。
  • QEISPEED: 读取到的速度寄存器值。
  • QEILOAD: 定时器重载值。
  • PPR: 编码器每转的物理脉冲数(即线数)。
  • Edges: 每个脉冲产生的边沿数,取决于CAPMODE(X1模式为2,X4模式为4)。

实战优化技巧:直接使用上述公式进行浮点或整数除法,在资源有限的MCU上开销较大。我们可以通过精心选择QEILOAD值来优化。

  1. 目标:让公式中的分母(QEILOAD * PPR * Edges)接近一个2的整数次幂,这样除法就可以用右移操作代替。
  2. 举例:系统时钟SysClk = 80MHz,编码器PPR = 1000,使用X4模式(Edges=4)。我们希望速度更新频率为1kHz(即定时周期1ms)。则定时器需要的计数值为QEILOAD = SysClk / 1000 = 80000。 分母 =80000 * 1000 * 4 = 320,000,000。这显然不是2的整数次幂。
  3. 优化:我们微调QEILOAD,寻找一个接近80000的值,使得乘积接近2的幂。2^28 = 268,435,456,2^29 = 536,870,912。我们的目标值320M介于两者之间。我们可以尝试让分母等于2^28 * 1.19或2^29 * 0.596,都不够理想。 一个更实用的方法是在软件中预先计算好一个缩放系数。例如,我们计算出一个系数Scale = (SysClk * 60) / (PPR * Edges)。那么rpm = (Scale * QEISPEED) / QEILOAD。我们可以将Scale和QEILOAD都除以它们的最大公约数,以简化计算。或者,如果速度刷新率要求不严格,可以调整QEILOAD,使Scale / QEILOAD成为一个简单的分数或整数。

配置示例:实现1kHz速度采样

void QEI_VelocityCapture_Init(void) { // 1. 使能QEI模块时钟和GPIO时钟(略) // 2. 配置GPIO引脚为QEI功能(略) // 3. 配置QEI控制寄存器:X4模式,使能滤波器(采样5次),索引复位,使能模块 HWREG(QEI0_BASE + QEI_O_CTL) = 0; HWREG(QEI0_BASE + QEI_O_CTL) |= QEI_CTL_CAPMODE; // X4 模式 HWREG(QEI0_BASE + QEI_O_CTL) |= (0x5 << QEI_CTL_FILTCNT_S); // 滤波计数=5 HWREG(QEI0_BASE + QEI_O_CTL) |= QEI_CTL_RESMODE; // 索引复位模式 HWREG(QEI0_BASE + QEI_O_CTL) |= QEI_CTL_FILTEN; // 使能输入滤波 // 注意:先配置其他位,最后使能模块 HWREG(QEI0_BASE + QEI_O_CTL) |= QEI_CTL_ENABLE; // 4. 设置最大位置值(用于索引复位模式)。假设1000线编码器,X4模式。 HWREG(QEI0_BASE + QEI_O_MAXPOS) = (1000 * 4) - 1; // 0x0F9F // 5. 配置速度捕获 // 假设系统时钟80MHz,期望速度更新频率1kHz (1ms) uint32_t timerLoadValue = 80000; // 80MHz / 1000Hz HWREG(QEI0_BASE + QEI_O_LOAD) = timerLoadValue; // 6. (可选)使能速度定时器中断 HWREG(QEI0_BASE + QEI_O_INTEN) |= QEI_INTEN_TIMER; // ... 配置NVIC中断 } // 在速度定时器中断服务程序或主循环中读取速度 int32_t QEI_GetCurrentRPM(void) { uint32_t speedCount = HWREG(QEI0_BASE + QEI_O_SPEED); // 使用优化后的公式计算RPM // 预先计算好的常数,假设PPR=1000, Edges=4, SysClk=80MHz, VELDIV=0 const uint64_t scaleFactor = (80000000ULL * 60ULL) / (1000 * 4); // = 1,200,000 uint32_t load = HWREG(QEI0_BASE + QEI_O_LOAD); uint32_t rpm = (scaleFactor * speedCount) / load; // 注意防止溢出 return (int32_t)rpm; }

注意事项:QEISPEED寄存器在定时器归零时更新,而读取QEISPEED和QEITIME(当前定时器值)不是原子操作。如果在读取过程中定时器刚好归零并更新QEISPEED,可能读到不匹配的值。一种简单的解决方案是连续读取两次QEISPEED,如果值相同则认为有效;或者在定时器中断中读取并保存到全局变量。

4. 系统集成与调试:PWM与QEI的协同实战

单独调通PWM输出和QEI读取可能不难,但让两者在闭环控制中稳定、可靠地协同工作,才是真正的挑战。这里分享几个集成与调试中的关键点和避坑经验。

4.1 同步与定时:让控制律在正确的时间点执行

在速度/位置闭环控制中,控制算法(如PID)的执行周期需要与速度采样周期同步。最自然的方式是利用QEI速度定时器中断。当QEITIME减到0时,会产生中断,此时QEISPEED寄存器已经更新为上一个周期的计数值。在这个中断服务程序(ISR)中,你应该:

  1. 读取QEISPEED,计算当前速度。
  2. 执行PID控制算法,计算新的PWM占空比。
  3. 更新PWM比较器寄存器(如PWMnCMPA、PWMnCMPB)。

确保中断响应及时:QEI速度中断的优先级需要根据控制周期来设置。对于1kHz(1ms)的控制频率,中断处理时间必须远小于1ms。优化ISR代码,只做最必要的计算和赋值,将复杂的滤波、日志记录等任务放到主循环中。

4.2 故障安全与状态机设计

一个健壮的系统必须有状态机。例如,可以定义以下几个状态:INIT(初始化)、IDLE(待机)、RUNNING(运行)、FAULT(故障)、STOPPING(停止中)。

  • 上电后进入INIT,初始化所有外设后进入IDLE。
  • 收到启动命令后,进入RUNNING状态,使能PWM输出。
  • 在RUNNING状态下,主循环或定时中断中持续检查PWMnFLTSTAT1寄存器。一旦检测到故障位被置位,立即跳转到FAULT状态。
  • 在FAULT状态中,首先将PWM输出设置为安全状态(如强制低),然后再执行其他故障处理(如记录故障代码、通知上位机)。这个顺序很重要,必须立即停止功率输出,防止故障扩大。
  • 故障处理后,可以进入STOPPING状态,等待故障条件清除和复位命令,再回到IDLE。

4.3 调试技巧与常见问题排查

问题1:QEI位置计数器不计数或计数方向错误。

  • 检查信号:首先用示波器观察PhA、PhB和Index引脚的实际波形,确保编码器供电正常,信号幅值符合要求(通常是3.3V或5V),且没有严重失真。
  • 检查配置:确认CAPMODE设置是否正确。检查INVA、INVB、SWAP位是否因接线问题需要取反或交换。
  • 检查滤波器:如果FILTCNT设置过大,而电机启动或低速时脉冲间隔很长,可能导致有效边沿也被滤掉。尝试减小FILTCNT值或暂时禁用滤波器(FILTEN=0)进行测试。

问题2:PWM故障保护不动作。

  • 检查故障源:确认数字比较器输入引脚的电平是否随故障条件正确变化。可以用一个GPIO模拟故障信号进行测试。
  • 检查锁存与使能:确认PWMnCTL寄存器中的LATCH和FLTSRC位都已正确置1。这是能否锁存和清除故障标志的前提。
  • 检查动作绑定:确认PWMnFLTCTL寄存器中,对应的故障输入(如FAULT0)的动作配置不是“无动作”(PWM_FLTCTL_FAULT0_ACT_NONE)。
  • 检查PWM输出使能:确保PWM发生器已通过PWMnCTL寄存器的ENABLE位置1来使能。故障保护是在PWM发生器使能的前提下工作的。

问题3:计算出的速度值波动大或不准确。

  • 速度更新周期与电机速度不匹配:如果电机转速很低,而QEILOAD设置得很小(更新频率高),那么每个周期捕获到的边沿数可能很少(甚至为0或1),量化误差会很大,导致速度值跳动。此时应增大QEILOAD值,降低速度采样频率,或使用VELDIV进行预分频,让每个周期能积累更多的边沿数。
  • 机械振动或信号噪声:这会导致编码器输出多余的毛刺脉冲。除了启用QEI内置数字滤波器,在硬件上可以考虑:
    • 在编码器信号线上靠近MCU输入端增加RC低通滤波(如100欧姆串联电阻+100pF对地电容),滤除高频噪声。
    • 使用带屏蔽的双绞线连接编码器。
    • 确保编码器和MCU共地良好。
  • 计算溢出:在计算rpm时,(scaleFactor * speedCount)可能会超过32位整数的范围。对于高转速、高线数的编码器,务必使用64位整数(uint64_t)进行中间计算,或者对公式进行约分处理。

问题4:索引信号复位位置不精确。

  • 索引信号抖动:机械编码器的索引信号可能不是完美的单脉冲,在接近位置时可能会有抖动。这会导致QEIPOS在0值附近反复跳变。解决方法是在软件中增加去抖逻辑,例如,连续读到3次索引信号有效才执行复位操作。更高级的方法是使用编码器厂商提供的“零位”信号,它通常比索引信号更精确。
  • 电气噪声:同PhA/PhB信号一样,索引信号线也需要良好的滤波和屏蔽。

通过将PWM的故障保护与QEI的精准反馈相结合,并辅以严谨的状态机设计和细致的调试,我们就能构建出一个响应迅速、运行稳定、易于维护的电机控制系统。这些看似底层的寄存器配置细节,正是高可靠性嵌入式系统的基石。

相关新闻

  • 亨得利官方服务项目及价格查询|地址和维修热线权威信息通告(2026年7月最新) - 亨得利官方
  • 哈兰德的冷静如何成为足球场上的心理武器与战术优势
  • 宝鸡离婚财产分割纠纷难解决?2026年这5位家事律师值得推荐 - 本地品牌推荐

最新新闻

  • 基于ESP32与AS7341的便携式光谱测量系统开发
  • 3步解锁你的音乐宝藏:ncmdump实战指南
  • 3步掌握Wallpaper Engine资源逆向:PKG解包与TEX纹理转换全攻略
  • 深入解析TM4C123时钟与总线配置:从寄存器到80MHz高性能实战
  • 方便我开发的好东西(Claude、gpt、glm)
  • 推荐2款Windows实用转换工具,错过就找不到了!

日新闻

  • 宝珀中国官方售后服务中心|官方热线和维修地址权威信息声明(2026年7月更新) - 宝珀官方售后服务中心
  • # 2026年北京知识产权律师推荐怎么选?看这五点关键不踩雷 - 本地品牌推荐
  • 2026实测教程:生成的拼豆图纸不满意怎么修改才省事 - 省事研究所

周新闻

  • IX9104 PCIe5.0 高速交换芯片@ACP#完整规格 + 应用场景总结
  • Unity游戏集成Coze智能体:实现NPC智能对话与知识库联动
  • SAP EPIC 建行回单查询:从标准类CL_EPIC_EXAMPLE_CN_CCB_GHTD到Z类的5处关键修改

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号