找回密码
 立即注册
查看: 945|回复: 13

请教一下这个PWM呼吸灯的程序哪里有问题

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:212
  • 最近打卡:2025-06-13 13:35:50
已绑定手机

19

主题

83

回帖

570

积分

高级会员

积分
570
发表于 2024-10-30 19:32:28 | 显示全部楼层 |阅读模式
  1. unsigned char pwm_count = 0;         // PWM 计数器
  2. unsigned int pwm_duty = 0;           // PWM 占空比,取值范围扩大到 0~200
  3. unsigned char pwm_direction = 1;     // PWM 增减方向,1 表示增加,0 表示减少
  4. unsigned int brightness_delay = 0;   // 控制亮度变化的延时计数器
  5. void Timer1_Isr(void) interrupt 3 // 50us 中断
  6. {
  7.     if (++pwm_count >= 200) pwm_count = 0; // 使 PWM 周期为 200,即 50us * 200 = 10ms 的周期
  8.     // PWM 控制:根据 pwm_duty 调整 LED 的亮暗
  9.     if (pwm_count < pwm_duty) P25 = 0;
  10.     else P25 = 1;
  11.     // 控制亮度变化频率,每隔10ms调整一次占空比
  12.     if (++brightness_delay >= 10) {  // 每10次中断(即10ms)调整一次亮度
  13.         brightness_delay = 0;
  14.         // 每次调节占空比,以实现1秒从暗到亮的变化
  15.         if (pwm_direction) {
  16.             pwm_duty++;                     // 增加亮度
  17.             if (pwm_duty >= 200) pwm_direction = 0;  // 达到最高亮度后,开始变暗
  18.         } else {
  19.             pwm_duty--;                     // 减少亮度
  20.             if (pwm_duty == 0) pwm_direction = 1;    // 达到最低亮度后,开始变亮
  21.         }
  22.     }
  23. }
复制代码


回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:459
  • 最近打卡:2025-06-16 00:13:00
已绑定手机

37

主题

2221

回帖

2658

积分

荣誉版主

积分
2658
发表于 2024-10-30 19:37:44 | 显示全部楼层
大概看了一眼,没看出什么问题,现在运行有问题吗?
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:212
  • 最近打卡:2025-06-13 13:35:50
已绑定手机

19

主题

83

回帖

570

积分

高级会员

积分
570
发表于 2024-10-30 20:10:38 | 显示全部楼层
晓*** 发表于 2024-10-30 19:37
大概看了一眼,没看出什么问题,现在运行有问题吗?

根本看不出来灯的亮度变化

点评

[apoyl_aliyunvideo]280[/apoyl_aliyunvideo]  详情 回复 发表于 2024-10-30 20:19
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:459
  • 最近打卡:2025-06-16 00:13:00
已绑定手机

37

主题

2221

回帖

2658

积分

荣誉版主

积分
2658
发表于 2024-10-30 20:19:02 | 显示全部楼层
Crysta*** 发表于 2024-10-30 20:10
根本看不出来灯的亮度变化
  1. #include "stc8h.h"
  2. unsigned char pwm_count = 0;         // PWM 计数器
  3. unsigned int pwm_duty = 0;           // PWM 占空比,取值范围扩大到 0~200
  4. unsigned char pwm_direction = 1;     // PWM 增减方向,1 表示增加,0 表示减少
  5. unsigned int brightness_delay = 0;   // 控制亮度变化的延时计数器
  6. void Timer1_Isr(void) interrupt 3
  7. {
  8.     if (++pwm_count >= 200) pwm_count = 0; // 使 PWM 周期为 200,即 50us * 200 = 10ms 的周期
  9.     // PWM 控制:根据 pwm_duty 调整 LED 的亮暗
  10.     if (pwm_count < pwm_duty) P27 = 0;
  11.     else P27 = 1;
  12.     // 控制亮度变化频率,每隔10ms调整一次占空比
  13.     if (++brightness_delay >= 10) {  // 每10次中断(即10ms)调整一次亮度
  14.         brightness_delay = 0;
  15.         // 每次调节占空比,以实现1秒从暗到亮的变化
  16.         if (pwm_direction) {
  17.             pwm_duty++;                     // 增加亮度
  18.             if (pwm_duty >= 200) pwm_direction = 0;  // 达到最高亮度后,开始变暗
  19.         } else {
  20.             pwm_duty--;                     // 减少亮度
  21.             if (pwm_duty == 0) pwm_direction = 1;    // 达到最低亮度后,开始变亮
  22.         }
  23.     }
  24.        
  25. }
  26. void Timer1_Init(void)                //50微秒@11.0592MHz
  27. {
  28.         AUXR |= 0x40;                        //定时器时钟1T模式
  29.         TMOD &= 0x0F;                        //设置定时器模式
  30.         TL1 = 0xD7;                                //设置定时初始值
  31.         TH1 = 0xFD;                                //设置定时初始值
  32.         TF1 = 0;                                //清除TF1标志
  33.         TR1 = 1;                                //定时器1开始计时
  34.         ET1 = 1;                                //使能定时器1中断
  35. }
  36. void main()
  37. {
  38.         P0M0 = 0x00;    P0M1 = 0x00;
  39.     P1M0 = 0x00;    P1M1 = 0x00;
  40.     P2M0 = 0x00;    P2M1 = 0x00;
  41.     P3M0 = 0x00;    P3M1 = 0x00;
  42.     P4M0 = 0x00;    P4M1 = 0x00;
  43.     P5M0 = 0x00;    P5M1 = 0x00;
  44.         Timer1_Init();
  45.         EA = 1;
  46.     while (1);
  47. }
复制代码



睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:212
  • 最近打卡:2025-06-13 13:35:50
已绑定手机

19

主题

83

回帖

570

积分

高级会员

积分
570
发表于 2024-10-30 20:27:07 | 显示全部楼层
晓*** 发表于 2024-10-30 20:19

{:5_341:}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:212
  • 最近打卡:2025-06-13 13:35:50
已绑定手机

19

主题

83

回帖

570

积分

高级会员

积分
570
发表于 2024-10-30 20:27:43 | 显示全部楼层
晓*** 发表于 2024-10-30 20:19

总中断忘开了

点评

优秀  发表于 2024-10-30 20:29
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:459
  • 最近打卡:2025-06-16 00:13:00
已绑定手机

37

主题

2221

回帖

2658

积分

荣誉版主

积分
2658
发表于 2024-10-30 20:28:04 | 显示全部楼层
PWM还是硬件的简单好用靠谱啊,赶紧试试吧。
  1. /*
  2. 本例程基于STC8H8K64U-QFN32核心板编写
  3. 使用PWM4_2对应的P2.6和P2.7驱动板载LED指示灯
  4. */
  5. #include "stc8h.h"
  6. #define                MAIN_Fosc        24000000L
  7. void delay_ms (unsigned int ms)
  8. {
  9.         unsigned int i;
  10.         if(ms > 0)
  11.         {        do
  12.                 {
  13.                         i = MAIN_Fosc / 10000;
  14.                         while (--i);  //10T per loop
  15.                 }
  16.                 while (--ms);
  17.         }
  18. }
  19. void PWM_init(void)
  20. {       
  21.         PWMA_CCER2 = 0x00;                          //写CCMRx前必须先清零CCERx关闭通道
  22.     PWMA_CCMR4 = 0x60;                          //设置CC1为PWMA输出模式
  23.         PWMA_PS        = 0x40;
  24.        
  25.     //PWMA_CCER1 = 0x01;                          //使能CC1通道正极
  26.         //PWMA_CCER1 = 0x05;                          //使能CC1通道双极
  27.         PWMA_CCER2 = 0x50;                          //使能CC4通道双极
  28.         //PWMA_CCR1 = (MAIN_Fosc / fq / 2) - 1;        //设置占空比时间  1~65535
  29.         PWMA_CCR4 = 2000;
  30.     PWMA_ARR = 12000;             //设置周期时间        1~65535
  31.     //PWMA_ENO = 0x01;                            //使能PWM1P端口输出
  32.         //PWMA_ENO = 0x03;                            //使能PWM1P+N端口输出
  33.         PWMA_ENO = 0xC0;                            //使能PWM4P+N端口输出
  34.         PWMA_PSCR = 0;                                                                //PWM时钟预分频寄存器 0~65535       
  35.     PWMA_BKR = 0x80;                            //使能主输出
  36.     PWMA_CR1 = 0x01;                            //开始计时               
  37. }
  38. void PWM_updata(unsigned char duty)
  39. {
  40.     if(duty > 0)   //
  41.         {
  42.                 PWMA_CCR4 = duty * 120;
  43.                 PWMA_BKR = 0x80;                            //使能主输出
  44.                 PWMA_CR1 = 0x01;                            //开始计时
  45.         }
  46.         else
  47.         {
  48.             PWMA_BKR = 0x00;                            //关主输出
  49.                 PWMA_CR1 = 0x00;                            //停止计时
  50.         }
  51. }
  52. void main()
  53. {
  54.         unsigned char i;
  55.         EAXSFR();   //
  56.     P0M0 = 0x00; P0M1 = 0x00;
  57.     P1M0 = 0x00; P1M1 = 0x00;
  58.     P2M0 = 0x00; P2M1 = 0x00;
  59.     P3M0 = 0x00; P3M1 = 0x00;
  60.     P4M0 = 0x00; P4M1 = 0x00;
  61.     P5M0 = 0x00; P5M1 = 0x00;
  62.     P6M0 = 0x00; P6M1 = 0x00;
  63.     P7M0 = 0x00; P7M1 = 0x00;
  64.         PWM_init();
  65.     while(1)
  66.         {
  67.                 for(i = 1;i<99;i++)
  68.                 {
  69.                         PWM_updata(i);
  70.                         delay_ms(5);               
  71.                 }
  72.                 for(i = 1;i<99;i++)
  73.                 {
  74.                         PWM_updata(100-i);
  75.                         delay_ms(5);               
  76.                 }
  77.         }
  78. }
复制代码




睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:212
  • 最近打卡:2025-06-13 13:35:50
已绑定手机

19

主题

83

回帖

570

积分

高级会员

积分
570
发表于 2024-10-30 20:28:55 | 显示全部楼层
晓*** 发表于 2024-10-30 20:28
PWM还是硬件的简单好用靠谱啊,赶紧试试吧。

好的好的
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:212
  • 最近打卡:2025-06-13 13:35:50
已绑定手机

19

主题

83

回帖

570

积分

高级会员

积分
570
发表于 2024-10-30 20:29:22 | 显示全部楼层
晓*** 发表于 2024-10-30 20:28
PWM还是硬件的简单好用靠谱啊,赶紧试试吧。

我只用过stm32的PWM输出{:5_314:}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2024-12-10 18:14:16

0

主题

29

回帖

156

积分

注册会员

积分
156
发表于 2024-11-5 18:01:38 | 显示全部楼层
本帖最后由 zwf33335 于 2024-11-5 18:02 编辑

哪位大佬有PWM4P(P2.6)输出的PWM调速程序,我是新手做不出来,先谢谢各位大佬STC8H1K28单片机,

点评

可以直接移植使用官方的例程 深圳国芯人工智能有限公司-实验箱 8H实验箱9.6中的PWMA例程,修改一下PWMA_PS即可实现  详情 回复 发表于 2024-11-5 19:08
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-17 00:15 , Processed in 1.734348 second(s), 110 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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