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

8H1K08T的单脉冲模式的例程为什么不能正常工作 | 已知道

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-07-26 16:12:43
已绑定手机

2

主题

4

回帖

26

积分

新手上路

积分
26
发表于 6 天前 | 显示全部楼层 |阅读模式
我参考的是 22.8.22 高级 PWM 输出-频率可调-脉冲计数(硬件方式)具体内容如下

我修改之后的代码如下
  1. //测试工作频率为 24MHz
  2. /************* 功能说明 **************
  3. 本例程基于 STC8H8K64U 为主控芯片的实验箱 9 进行编写测试, STC8H 系列芯片可通用参考.
  4. 高级 PWM 定时器实现高速 PWM 脉冲输出.
  5. 周期/占空比可调, 通过比较/捕获中断进行脉冲个数计数.
  6. 通过 P6 口演示输出,每隔 10ms 输出一次 PWM,计数 10 个脉冲后停止输出.
  7. 使用单脉冲模式配合重复计数寄存器,纯硬件控制脉冲个数.
  8. 定时器每 1ms 调整 PWM 周期.
  9. 下载时, 选择时钟 24MHZ (用户可自行修改频率).
  10. ******************************************/
  11. #include "stc8h.h"
  12. #include "intrins.h"
  13. #define MAIN_Fosc 24000000L //定义主时钟
  14. typedef unsigned char u8;
  15. typedef unsigned int u16;
  16. typedef unsigned long u32;
  17. /****************************** 用户定义宏 ***********************************/
  18. #define Timer0_Reload (65536UL -(MAIN_Fosc / 1000)) //Timer 0 中断频率, 1000 次/秒
  19. /*****************************************************************************/
  20. #define PWM1_1 0x00 //P:P1.0 N:P1.1
  21. #define PWM1_2 0x01 //P:P2.0 N:P2.1
  22. #define PWM1_3 0x02 //P:P6.0 N:P6.1
  23. #define PWM2_1 0x00 //P:P1.2/P5.4 N:P1.3
  24. #define PWM2_2 0x04 //P:P2.2 N:P2.3
  25. #define PWM2_3 0x08 //P:P6.2 N:P6.3
  26. #define PWM3_1 0x00 //P:P1.4 N:P1.5
  27. #define PWM3_2 0x10 //P:P2.4 N:P2.5
  28. #define PWM3_3 0x20 //P:P6.4 N:P6.5
  29. #define PWM4_1 0x00 //P:P1.6 N:P1.7
  30. #define PWM4_2 0x40 //P:P2.6 N:P2.7
  31. #define PWM4_3 0x80 //P:P6.6 N:P6.7
  32. #define PWM4_4 0xC0 //P:P3.4 N:P3.3
  33. #define ENO1P 0x01
  34. #define ENO1N 0x02
  35. #define ENO2P 0x04
  36. #define ENO2N 0x08
  37. #define ENO3P 0x10
  38. #define ENO3N 0x20
  39. #define ENO4P 0x40
  40. #define ENO4N 0x80
  41. /************* 本地变量声明 **************/
  42. bit B_1ms; //1ms 标志
  43. bit PWM1_Flag;
  44. u16 Period;
  45. u8 Counter;
  46. u8 msSecond;
  47. void UpdatePwm(void);
  48. void TxPulse(u8 rep);
  49. /******************** 主函数 **************************/
  50. void main(void)
  51. {
  52.         P_SW2 |= 0x80; //扩展寄存器(XFR)访问使能
  53.         P0M1 = 0x00; P0M0 = 0x00; //设置为准双向口
  54.         P1M1 = 0x00; P1M0 = 0x00; //设置为准双向口
  55.         P2M1 = 0x00; P2M0 = 0x00; //设置为准双向口
  56.         P3M1 = 0x00; P3M0 = 0x00; //设置为准双向口
  57.         P4M1 = 0x00; P4M0 = 0x00; //设置为准双向口
  58.         P5M1 = 0x00; P5M0 = 0x00; //设置为准双向口
  59.         P6M1 = 0x00; P6M0 = 0x00; //设置为准双向口
  60.         P7M1 = 0x00; P7M0 = 0x00; //设置为准双向口
  61.         PWM1_Flag = 0;
  62.         Counter = 0;
  63.         Period = 0x1000;
  64.         // Timer0 初始化
  65.         AUXR = 0x80; //Timer0 set as 1T, 16 bits timer auto-reload,
  66.         TH0 = (u8)(Timer0_Reload / 256);
  67.         TL0 = (u8)(Timer0_Reload % 256);
  68.         ET0 = 1; //Timer0 interrupt enable
  69.         TR0 = 1; //Tiner0 run
  70.         
  71.         PWMA_ENO = 0x00;
  72.         PWMA_ENO |= ENO3P; //使能输出
  73.         PWMA_CCER2 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
  74.         PWMA_CCMR3 = 0x68; //设置 PWM1 模式 1 输出
  75.         //PWMA_CCER1 = 0x01; //使能 CC1E 通道, 高电平有效
  76.         PWMA_CCER2 = 0x0C; //使能 CC1E 通道, 低电平有效
  77.         PWMA_PS = 0x00; //高级 PWM 通道输出脚选择位
  78.         UpdatePwm();
  79.         PWMA_BKR = 0x80; //使能主输出
  80.         //PWMA_CR1 |= 0x89; //使能 ARR 预装载,单脉冲模式,开始计时
  81.         EA = 1; //打开总中断
  82.         while (1)
  83.         {
  84.                 if(B_1ms)
  85.                 {
  86.                         B_1ms = 0;
  87.                         msSecond++;
  88.                         if(msSecond >= 10) //10ms 启动一次 PWM 输出
  89.                         {
  90.                                 msSecond = 0;
  91.                                 TxPulse(10); //输出 10 个脉冲
  92.                         }
  93.                 }
  94.         }
  95. }
  96. /************* 发送脉冲函数 **************/
  97. void TxPulse(u8 rep)
  98. {
  99.         if(rep == 0) return;
  100.         rep -= 1;
  101.         PWMA_RCR = rep; //重复计数寄存器,计数 rep 个脉冲后产生更新事件
  102.         PWMA_CR1 |= 0x89; //使能 ARR 预装载,单脉冲模式,开始计时
  103. }
  104. /********************** Timer0 1ms 中断函数 ************************/
  105. void timer0(void) interrupt 1
  106. {
  107.         B_1ms = 1;
  108.         if(PWM1_Flag)
  109.         {
  110.                 Period++; //周期递增
  111.                 if(Period >= 0x1000)
  112.                         PWM1_Flag = 0;
  113.         }
  114.         else
  115.         {
  116.                 Period--; //周期递减
  117.                 if(Period <= 0x0100)
  118.                         PWM1_Flag = 1;
  119.         }
  120.         UpdatePwm(); //设置周期、占空比
  121. }
  122. //========================================================================
  123. // 函数: UpdatePwm(void)
  124. // 描述: 更新 PWM 周期占空比.
  125. // 参数: none.
  126. // 返回: none.
  127. // 版本: V1.0, 2012-11-22
  128. //========================================================================
  129. void UpdatePwm(void)
  130. {
  131.         PWMA_ARR = Period;
  132.         PWMA_CCR1 = (Period >> 1); //设置占空比时间: Period/2
  133. }
复制代码

只是修改了
  1. PWMA_ENO |= ENO3P; //使能输出
  2.         PWMA_CCER2 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
  3.         PWMA_CCMR3 = 0x68; //设置 PWM1 模式 1 输出
  4.         //PWMA_CCER1 = 0x01; //使能 CC1E 通道, 高电平有效
  5.         PWMA_CCER2 = 0x0C; //使能 CC1E 通道, 低电平有效
  6.         PWMA_PS = 0x00; //高级 PWM 通道输出脚选择位
复制代码
对应寄存器数据如下图

为什么不出波?


截图202507251011358712.jpg
截图202507251012192817.jpg
截图202507251012452331.jpg
截图202507251013036714.jpg
截图202507251015404308.jpg
截图202507251016139529.jpg
截图202507251016505526.jpg
截图202507251017105835.jpg
截图202507251017244666.jpg
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-07-26 16:12:43
已绑定手机

2

主题

4

回帖

26

积分

新手上路

积分
26
发表于 6 天前 | 显示全部楼层
我修改完的程序跑起来之后,p1.4只出高电平。在此之前,我用fwlib_stc8h写了一个,这个程序可以出波,但是修改 PWMx_RCR后不能控制脉冲个数,始终是一个脉冲
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:532
  • 最近打卡:2025-07-31 14:15:17
已绑定手机
已实名认证

116

主题

2499

回帖

6450

积分

版主

积分
6450
发表于 6 天前 | 显示全部楼层
您好,事实上是更改程序的过程中出现了一些问题
截图202507251828047128.jpg
具体原因是,您似乎是想要开启PWM3P引脚作为输出,但是在PWMA_CCER2中,您使用的语句是PWMA_CCER2 = 0x0C; //使能 CC1E 通道, 低电平有效
这回导致PWM3P没有开启,但是PWM3N开启了,因为您在PWMA_ENO寄存器中,仅仅开启了PWM3P的使能,所以从结果上看就是什么都没有输出

这里只需要将PWMA_CCER2改为0x01,打开PWM3P的使能即可
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-07-26 16:12:43
已绑定手机

2

主题

4

回帖

26

积分

新手上路

积分
26
发表于 5 天前 | 显示全部楼层
王*** 发表于 2025-7-25 18:30
您好,事实上是更改程序的过程中出现了一些问题

具体原因是,您似乎是想要开启PWM3P引脚作为输出,但是在P ...

!!!!注意到了,谢谢
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-7-31 23:04 , Processed in 0.115951 second(s), 68 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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