现在我已经收集了足够的信息,下面来逐一回答您的问题。
您好!我是 STC 的 FAE 工程师,针对您在论坛上提出的关于 STC32G144K246 ADC 模块的 4 个问题,我查阅了《STC32G144K246 系列数据手册》中 "两组12位模数转换" 和 "六组16位高级PWM定时器" 相关章节,逐一解答如下:
问题 1:PWM-x 的第二个触发事件(PWMx_TA2)是指什么?
PWMx_TA2 对应的是 PWM 模块的 TRGO2 触发输出信号。
在 STC32G144K246 中,每个高级 PWM 定时器(如 PWMA、PWMC、PWME)有两路独立的触发输出:
| 触发信号 |
来源 |
控制寄存器 |
| PWMx_TA(第一个触发事件) |
TRGO |
PWMn_CR2 寄存器的 MMSn[2:0] 位 |
| PWMx_TA2(第二个触发事件) |
TRGO2 |
PWMn_CR3 寄存器的 MMSn[3:0] 位 |
- TRGO 由 PWMn_CR2 的 MMSn[2:0] 选择,可选:复位、使能、更新、比较脉冲、OCn1~4REF 等。
- TRGO2 由 PWMn_CR3 的 MMSn[3:0] 选择,可选:复位、使能、更新、比较脉冲、OCn1~6REF 等(比 TRGO 多了 OCn5/OCn6 的选择)。
简单说:TA 是 TRGO 触发,TA2 是 TRGO2 触发,两者可以独立配置不同的触发事件源,让 ADC 在 PWM 周期的两个不同时刻被触发采样。
问题 2:ADC 寄存器设置完成后,是否可以拥有多个触发源(软件、外部引脚、PWM)?
ADC_TRIGSEL[3:0] 一次只能选择 一个 触发源,不能同时选择多个。
但是,您可以通过以下方式实现"多触发源"的效果:
- 软件触发 始终可用:只要向 ADC_CONTR 寄存器的 ADC_START 位写 1,即可随时启动一次 ADC 转换,不受 ADC_TRIGSEL 选择的限制。
- 硬件触发(PWM/定时器):当 ADC_TRIGSEL 选择了某个 PWM 或定时器触发源,且 ADC_EPWMT 位使能后,该硬件事件到来时会自动启动 ADC。
- 外部引脚触发:手册中 ADC_TRIGSEL 表格中 1001(值为1) 和 1010(值为0) 这两个选项,据手册描述,1001 对应固定高电平"1"(即始终触发?),1010 对应固定低电平"0"(即不触发)。外部引脚触发通常是通过 PWM 的输入捕获或比较器联动来实现,而非直接由 ADC_TRIGSEL 选择。
结论:硬件触发源同一时刻只能选一个,但软件触发可以随时叠加使用。
问题 3:定时器溢出移相 180°(TIMERx OV phase 180)触发是指什么?
您的理解基本正确,但不完全准确。
- TIMER17 OV:定时器 17 从 0 计数到自动重装载值(ARR)产生溢出事件时触发 ADC。
- TIMER17 OV phase 180:定时器 17 计数到 ARR/2(即计数周期的一半)时触发 ADC,相当于将触发点移相了 180°(半个周期)。
举例说明:
- 假设 TIMER17 的 ARR = 100,从 0 向上计数到 100 溢出。
- TIMER17 OV → 在计数值达到 100(溢出)时触发 ADC。
- TIMER17 OV phase 180 → 在计数值达到 50(即 ARR/2)时触发 ADC。
所以您的理解是对的:TIMER17 OV phase 180 就是在定时器计数到一半(50%)的位置触发 ADC,而不是等到溢出才触发。
问题 4:ADC 时钟频率有无限制?
有明确限制。 根据手册"ADC 速度计算公式"章节的说明:
12 位 ADC 的速度不能高于 800KHz
ADC 时钟频率由 ADCCFG 寄存器的 SPEED[3:0] 位控制,公式为:
F_{ADC} = \frac{SYSclk}{2 \times (SPEED + 1)}
例如:
| SPEED[3:0] |
ADC 时钟频率 |
| 0000 |
SYSclk / 2 |
| 0001 |
SYSclk / 4 |
| 0010 |
SYSclk / 6 |
| ... |
... |
| 1111 |
SYSclk / 32 |
必须确保 F_{ADC} \le 800KHz,否则 ADC 转换结果可能不准确。
此外,ADCTIM 寄存器中的 SMPDUTY 建议设置为 不小于 10(建议 15),CSSETUP 和 CHOLD 可使用默认值(ADCTIM 建议设置为 3FH)。
补充问题:ADCEXCFG2 寄存器 ADC_TRIGSEL[3:0] 中 1001 和 1010 是什么?
根据手册表格:
| ADC_TRIGSEL[3:0] |
ADC 触发源 |
| 1001 |
1(固定高电平) |
| 1010 |
0(固定低电平) |
- 1001(值为 1):触发源被强制为高电平"1",相当于 ADC 始终处于"可触发"状态?此选项的实际行为建议通过实验验证。
- 1010(值为 0):触发源被强制为低电平"0",相当于禁止硬件触发,ADC 只能通过软件写 ADC_START 位来启动。
如果您需要我提供具体的 ADC 配置代码示例,或者对某个问题有更深入的疑问,欢迎继续提问!
🔍 搜索 "https://www.stcaimcu.com/thread-24968-1-1.html"
⏱️ 查找用时 23.7s | 总回答用时 36.8s