找回密码
 立即注册
查看: 29|回复: 4

STC8H1K2路互补PWA带死区控制信号

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:134
  • 最近打卡:2025-10-01 11:09:45
已绑定手机

3

主题

30

回帖

647

积分

高级会员

积分
647
发表于 4 天前 | 显示全部楼层 |阅读模式
花了好久时间,终于把STC8h1k的互补输出pwa波搞明白了。走了不少弯路,刚开始怎么也没有反应。

功能主要是有变频功能的pwa信号。占空比,频率,死区时间可调。
采用了中断的方式,在500个波形后,频率变快
调试的过程中教训主要有。
1、  PWMA_CCER1 = 0x00;        //写 CCMRx 前必须先清零 CCxE 关闭通道。
2、P_SW2 |= 0x80;      // 开启扩展寄存器访问,这个没有的话,程序无法运行。
3、中断号26,void PWMA_ISR() interrupt 26,我让AI帮我写的程序给我写个24,害我找原因找了好久。
4、 PWMA_IER = 0x01;                            //使能中断,中断开启命令
5、模式设置, PWMA_CCMR1 = 0x68;  // PWM模式1 + 预装载使能
                     PWMA_CCER1 = 0x05;  // 开启CH1和CH1N输出 (CC1E=1, CC1NE=1)
                    PWMA_BKR = 0x80;    // 主输出使能 (MOEN=1)
感觉这些好了后,神奇的就可以出波形了。
回复

使用道具 举报 送花

3

主题

1928

回帖

704

积分

等待验证会员

积分
704
发表于 4 天前 | 显示全部楼层
你好,感谢分享你在使用 STC8H1K 实现 互补PWM(带死区控制) 的经验。你的调试过程非常有代表性,也揭示了在使用STC8系列单片机进行PWM输出时的一些关键点。下面我将从专业角度,结合你的经验,做一个总结与补充,希望对其他开发者也有所帮助。

一、STC8H1K 的PWM模块简介

STC8H1K 是宏晶科技推出的高性能8位增强型单片机,具备多路PWM输出功能,支持互补输出、死区控制、中断响应等功能,非常适合用于电机控制、电源变换等应用。

其中,PWMA模块是其核心PWM模块之一,支持多通道输出,包括互补通道(如CH1与CH1N),并可通过寄存器设置死区时间,实现对H桥等功率电路的安全控制。

二、互补PWM输出配置要点

你提到的几个关键配置点非常到位,以下是对这些关键配置的进一步解释:

1. 清零通道使能寄存器 PWMACCER1
  1. c
  2. PWMACCER1 = 0x00;
复制代码

在配置通道寄存器(如CCMRx)之前,必须先关闭所有通道输出,否则可能无法正确写入配置。这是配置PWM模块的标准流程之一。

2. 开启扩展寄存器访问 PSW2 |= 0x80
  1. c
  2. PSW2 |= 0x80;
复制代码

这是STC8系列单片机的一个特殊机制。由于部分寄存器位于扩展地址空间中,必须通过设置 PSW2 的第7位来开启访问权限,否则读写将无效。

这是一个容易被忽视的细节,尤其在使用AI生成代码时,若未明确指定硬件型号或寄存器定义,容易遗漏此步骤。

3. 中断号错误(26 vs 24)
  1. c
  2. void PWMAISR() interrupt 26
复制代码

中断号错误是调试中最隐蔽但又最常见的一类问题。STC8系列的中断向量表是固定的,PWMA中断号为26,如果误写为24(可能是其他型号或模块的中断号),会导致中断无法触发,进而无法进入中断服务程序。

建议在使用中断前,仔细查阅数据手册或官方文档,确保中断号匹配。

4. 使能PWM中断 PWMAIER = 0x01
  1. c
  2. PWMAIER = 0x01;
复制代码

该寄存器用于使能PWM模块的更新中断(UEV),常用于周期性操作或频率切换。你提到的“500个波形后频率变快”,正是通过该中断实现的。因此,必须开启中断使能。

5. PWM模式与输出使能配置
  1. c
  2. PWMACCMR1 = 0x68;   // PWM模式1 + 预装载使能
  3. PWMACCER1 = 0x05;   // 开启CH1和CH1N输出 (CC1E=1, CC1NE=1)
  4. PWMABKR = 0x80;     // 主输出使能 (MOEN=1)
复制代码

这段配置是整个PWM输出的核心:
CCMR1 = 0x68:表示选择 PWM模式1,并且 预装载使能(ARR与CRRx在更新事件后同步更新),避免输出波形突变。
CCER1 = 0x05:开启CH1和CH1N输出,实现互补波形。
BKR = 0x80:主输出使能位(MOEN)必须置1,否则即使配置正确,也无法输出PWM波形。

三、实现变频功能的设计思路

你提到“500个波形后,频率变快”,这通常是通过中断实现的。具体实现思路如下:

1. 在PWM更新中断中维护一个计数器。
2. 每次中断(即每个PWM周期)计数器加1。
3. 当计数器达到设定值(如500)时,修改ARR(自动重载寄存器)的值,从而改变PWM频率。
4. 重置计数器,继续下一个周期。

示例代码结构如下:
  1. c
  2. unsigned int pwmcount = 0;
  3. void PWMAISR() interrupt 26 {
  4.     if (pwmcount < 500) {
  5.         pwmcount++;
  6.     } else {
  7.         PWMAARR = NEWARRVALUE;  // 修改ARR,改变频率
  8.         pwmcount = 0;
  9.     }
  10.     PWMASR = 0x00;  // 清除中断标志
  11. }
复制代码

需要注意的是:
修改ARR后,必须等待一次更新事件(UEV)才能生效,因此建议在修改ARR后手动触发一次更新(通过设置UG位)。
如果使用预装载功能,ARR的修改不会立即生效,而是在下一次更新事件时生效。

四、调试建议与常见问题

结合你的经验,我总结了几个调试过程中常见的问题与建议:

| 问题 | 原因 | 建议 |
|------|------|------|
| 无PWM输出 | 忘记设置PWMABKR的MOEN位 | 检查是否开启主输出使能 |
| 寄存器配置无效 | 未开启PSW2扩展寄存器访问 | 确保PSW2 |= 0x80 |
| 中断未触发 | 中断号错误或未使能中断 | 检查中断号与中断使能寄存器 |
| 波形异常 | 未正确配置CCMRx或CCERx | 检查PWM模式、通道使能、预装载等 |
| 频率无法改变 | 修改ARR后未触发更新 | 手动设置UG位或等待下一次更新事件 |

五、总结

你通过实践成功实现了STC8H1K的互补PWM输出,并成功实现了变频功能,这不仅体现了你对单片机底层寄存器的理解能力,也展示了你在调试过程中细致入微的排查能力。

对于初学者而言,建议:
多参考官方数据手册与例程;
调试时使用示波器观察波形,有助于快速定位问题;
中断处理中尽量保持简洁,避免复杂运算;
使用版本控制或注释记录每一次修改,便于回溯。

最后,再次感谢你的分享,期待你后续在电机控制、逆变器、电源管理等领域的更多实践成果!

如你有具体代码或工程需要进一步优化,也欢迎继续交流。

[本文内容由国芯人工智能辅助生成,仅供参考]

点评

感谢  发表于 3 天前
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:134
  • 最近打卡:2025-10-01 11:09:45
已绑定手机

3

主题

30

回帖

647

积分

高级会员

积分
647
发表于 4 天前 | 显示全部楼层
这是C代码,希望可以有所借鉴。代码库里的文件挺齐全的,但刚开始可能会由于过于全面而显得复杂

zcd方波.c

2.87 KB, 下载次数: 0

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:39
  • 最近打卡:2025-09-29 15:51:39
已绑定手机

11

主题

79

回帖

765

积分

版主

积分
765
发表于 4 天前 | 显示全部楼层
已转发技术,稍后会回复
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-10-3 08:48 , Processed in 0.116361 second(s), 68 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表