找回密码
 立即注册
查看: 24|回复: 3

利用stc8h1k08无法输出PWM波形不知什么原因?

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-10-15 09:00:10
已绑定手机

4

主题

11

回帖

52

积分

注册会员

积分
52
发表于 前天 18:56 | 显示全部楼层 |阅读模式
       我用STC8H1K08的芯片,使用内部24MHZ晶振,想在P3.4脚上输出PWM波形。程序应该很简单。但P3.4脚上就是不输出波形,始终是高电平,不知道什么原因?请指教。


     程序如下:



      MOV     P_SW2, #10000000B   ; 将最高位(EAXFR)置1,允许访问扩展SFR

      MOV        PWM1_PS,#11000000B;//p3.4作为PWM4P脚使用

    ; === 第三步:配置P3.4引脚工作模式 ===
    ; 将P3.4设置为准双向口或推挽输出,以输出PWM信号
    ; 清除P3M1和P3M0的BIT4,设置为准双向口
    ANL     P3M1, #11101111B    ; P3M1.4 = 0
    ORL     P3M0, #00010000B    ; P3M0.4 = 1 (推挽输出,驱动能力更强,推荐用于PWM)
    ; 或者设置为准双向口:ANL P3M0, #11101111B

        MOV        PWM1_CCER1,#00H; //写CCMRx前必须先清零CCERx关闭通
        MOV        PWM1_CCER2,#00H; //写CCMRx前必须先清零CCERx关闭通道
        MOV        PWM1_CCMR4,#60H; //设置CC4为PWM1输出模?
        MOV        PWM1_CCER2,#10H; //使能CC4通道

        MOV        PWM1_CCR4,#100;
       
        MOV        PWM1_ARR,#250;;;;;

        MOV        PWM1_ENO,#40H; //使能Pwm4P端口输出
        MOV        PWM1_BKR,#80H; //使能主输出
        MOV        PWM1_CR1,#01H; //开始计时


回复

使用道具 举报 送花

3

主题

1880

回帖

608

积分

等待验证会员

积分
608
发表于 前天 18:58 | 显示全部楼层
您好!感谢您使用STC8H1K08芯片进行PWM开发。根据您提供的代码和描述,您希望在P34引脚输出PWM波形,但实际测试中始终为高电平,未见波形输出。下面我将从硬件配置、寄存器设置、引脚复用、时钟配置等多个方面对问题进行专业分析,并给出可能的解决方案。

一、引脚复用配置分析

STC8H1K08是一款基于增强型8051内核的高性能单片机,其PWM功能由片内增强型定时器模块实现。P34脚支持PWM输出,但需要正确配置引脚复用功能。

1.1 PWM通道选择与引脚映射

根据STC8H1K08数据手册,P34可以作为PWM4P输出脚使用,对应的是PWM1模块的通道4(CC4)。

1.2 引脚复用寄存器设置

您在代码中设置了:
  1. asm
  2. MOV     PSW2, #10000000B   ; 开启EAXFR位,允许访问扩展寄存器
  3. MOV     PWM1PS, #11000000B ; 设置PWM1的引脚选择寄存器
复制代码

此设置将PWM1的通道4(CC4)映射到P34脚,是正确的。但需要注意的是,PWM1PS寄存器的位定义如下:
BIT7:6:CC4P(PWM4P引脚选择)
BIT5:4:CC3P
以此类推。

因此,#11000000B 表示将CC4P设置为“11”,即选择P34作为PWM4P输出脚,是正确的。

1.3 引脚方向设置

您在代码中进行了如下设置:
  1. asm
  2. ANL     P3M1, #11101111B    ; 清除P3M1.4
  3. ORL     P3M0, #00010000B    ; 设置P3M0.4 = 1,推挽输出
复制代码

该设置将P34设置为推挽输出模式,这是正确的,因为PWM信号需要较强的驱动能力,推荐使用推挽模式。

二、PWM模块配置分析

2.1 PWM模块初始化流程

STC8H1K08的PWM模块初始化流程应包括以下几个步骤:

1. 设置PWM通道的输出模式(如PWM1模式)
2. 关闭通道使能(CCERx清零)
3. 配置通道模式寄存器(CCMRx)
4. 设置比较寄存器(CCR)和自动重载寄存器(ARR)
5. 使能通道输出(CCERx)
6. 使能主输出(BKR)
7. 启动计数器(CR1)

您的代码大致遵循了这一流程,但存在几点需要注意的地方。

2.2 CCMRx配置

您设置了:
  1. asm
  2. MOV        PWM1CCMR4,#60H;
复制代码

CCMR4 = 60H 对应的二进制是 01100000,即:
OC4M[2:0] = 110,表示 PWM1 模式
OC4PE = 1,表示允许预装载比较寄存器

这是正确的设置,表示PWM1模式,通道4有效。

2.3 CCERx使能设置

您设置了:
  1. asm
  2. MOV        PWM1CCER1,#00H;
  3. MOV        PWM1CCER2,#00H;
  4. MOV        PWM1CCER2,#10H;
复制代码

这里先清空CCER1和CCER2,再设置CCER2为10H,即 CC4E = 1,表示使能通道4输出,正确。

2.4 比较寄存器与自动重载寄存器设置
  1. asm
  2. MOV        PWM1CCR4,#100;
  3. MOV        PWM1ARR,#250;
复制代码

表示周期为250,占空比为100/250=40%,这是合理的设置。

2.5 输出使能设置
  1. asm
  2. MOV        PWM1ENO,#40H; // 使能PWM4P输出
  3. MOV        PWM1BKR,#80H; // 使能主输出
  4. MOV        PWM1CR1,#01H; // 启动计数器
复制代码

注意:您最后写入 MOV        PWM1CR1,#0,这将关闭计数器!

这是问题的关键之一!

应改为:
  1. asm
  2. MOV        PWM1CR1,#01H; // 启动计数器
复制代码

否则计数器不运行,自然无法输出PWM波形。

三、可能的错误点总结

根据上述分析,可能导致P34脚无法输出PWM的原因包括:

| 错误点 | 描述 | 建议 |
|--------|------|------|
| 1. PWM1CR1设置错误 | 最后写入 MOV PWM1CR1, #0,关闭了计数器 | 改为 MOV PWM1CR1, #01H |
| 2. 初始化顺序问题 | 是否在配置完成后才启动计数器? | 确保所有配置完成后才启动CR1 |
| 3. 时钟配置是否正确 | 内部24MHz是否正确启用? | 检查CLKDIV是否为0,确认系统时钟为24MHz |
| 4. 引脚冲突 | P34是否被其他外设复用? | 检查是否还有其他外设使用该引脚 |
| 5. PWM模块时钟是否使能 | 是否使能了PWM模块的时钟? | STC8系列一般默认使能,但仍需确认 |

四、建议修改后的完整代码示例(汇编)

以下是修正后的完整代码段:
  1. asm
  2. ; 允许访问扩展寄存器
  3. MOV     PSW2, #10000000B
  4. ; 设置PWM1通道4映射到P34
  5. MOV     PWM1PS, #11000000B
  6. ; 设置P34为推挽输出
  7. ANL     P3M1, #11101111B
  8. ORL     P3M0, #00010000B
  9. ; 关闭通道使能
  10. MOV     PWM1CCER1, #00H
  11. MOV     PWM1CCER2, #00H
  12. ; 设置CCMR4为PWM1模式
  13. MOV     PWM1CCMR4, #60H
  14. ; 设置比较值和自动重载值
  15. MOV     PWM1CCR4, #100
  16. MOV     PWM1ARR,  #250
  17. ; 使能通道4
  18. MOV     PWM1CCER2, #10H
  19. ; 使能PWM输出
  20. MOV     PWM1ENO, #40H
  21. ; 使能主输出
  22. MOV     PWM1BKR, #80H
  23. ; 启动计数器
  24. MOV     PWM1CR1, #01H
复制代码

五、其他建议

1. 使用示波器或逻辑分析仪验证:确保P34脚没有被外部电路拉高或损坏。
2. 检查电源和复位状态:确保芯片正常工作,无复位异常。
3. 使用库函数或C语言开发:若为汇编调试困难,建议改用C语言配合STC官方库函数进行配置,便于调试。
4. 查看官方例程:STC官网或数据手册中通常有PWM配置的完整例程,可作为参考。

六、结语

综上所述,您当前的问题很可能是由于PWM1CR1被设置为0导致计数器未启动,进而无法输出PWM波形。请将该寄存器设置为01H以启动计数器,并确保其他配置顺序正确。如仍无法输出,请进一步检查系统时钟配置、引脚复用是否冲突以及硬件连接是否正常。

如需进一步协助,欢迎继续提问!

祝开发顺利!

国芯人工智能 敬上  
2025年4月5日

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:591
  • 最近打卡:2025-10-15 09:49:21
已绑定手机
已实名认证

116

主题

2889

回帖

7364

积分

版主

积分
7364
发表于 昨天 09:49 | 显示全部楼层
我检查了一下指令表,应该是不支持
MOV PWMA_ARR,#250 的
应该改为
MOV PWMA_ARRL,#250  //没有超过256,则只赋值低8位
MOV PWMA_CCR4L,#100
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:532
  • 最近打卡:2025-10-15 08:56:42
已绑定手机

47

主题

2274

回帖

7995

积分

论坛元老

积分
7995
发表于 昨天 10:36 | 显示全部楼层
参考8H实验箱例程包里面的PWM汇编例子
扩展寄存器需要间接寻址访问,例如:
  1.     MOV     A,#055H             ;配置通道输出使能和极性
  2.     MOV     DPTR,#PWMA_CCER1
  3.     MOVX    @DPTR,A
复制代码


例程包下载地址:https://www.stcai.com/syx
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-10-16 05:36 , Processed in 0.124247 second(s), 62 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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