找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3625|回复: 12
收起左侧

单片机C语言程序怎么控制开机PWM缓慢启动,从1%-100%递增,关机时从100%-%1递减

  [复制链接]
ID:468169 发表于 2022-12-12 22:11 来自手机 | 显示全部楼层 |阅读模式
50黑币
开机PWM缓慢启动,从1%-100%递增,关机时从100%-%1递减,C程序怎么控制PWM,有类似程序么?求指导思路

回复

使用道具 举报

ID:161164 发表于 2022-12-12 23:11 | 显示全部楼层
呼吸灯,了解一下
回复

使用道具 举报

ID:268736 发表于 2022-12-13 06:09 | 显示全部楼层
用你哪一顆MCU? 51? PIC? MSP430?  找到呼吸燈的範例研究研究會明白的 !
回复

使用道具 举报

ID:468169 发表于 2022-12-13 07:43 来自手机 | 显示全部楼层
akii 发表于 2022-12-13 06:09
用你哪一顆MCU? 51? PIC? MSP430?  找到呼吸燈的範例研究研究會明白的 !

打算用STC8G
回复

使用道具 举报

ID:155507 发表于 2022-12-13 08:32 | 显示全部楼层
我给你来个晶宏官网程序试试


  1. #include "reg51.h"
  2. #include "intrins.h"

  3. #define CYCLE       0x1000

  4. sfr     P_SW2   =   0xba;

  5. sfr     PWMSET      =   0xF1;
  6. sfr     PWMCFG01    =   0xF6;
  7. sfr     PWMCFG23    =   0xF7;
  8. sfr     PWMCFG45    =   0xFE;

  9. #define PWM0C       (*(unsigned int  volatile xdata *)0xFF00)
  10. #define PWM0CH      (*(unsigned char volatile xdata *)0xFF00)
  11. #define PWM0CL      (*(unsigned char volatile xdata *)0xFF01)
  12. #define PWM0CKS     (*(unsigned char volatile xdata *)0xFF02)
  13. #define PWM0TADC    (*(unsigned int  volatile xdata *)0xFF03)
  14. #define PWM0TADCH   (*(unsigned char volatile xdata *)0xFF03)
  15. #define PWM0TADCL   (*(unsigned char volatile xdata *)0xFF04)
  16. #define PWM0IF      (*(unsigned char volatile xdata *)0xFF05)
  17. #define PWM0FDCR    (*(unsigned char volatile xdata *)0xFF06)
  18. #define PWM00T1     (*(unsigned int  volatile xdata *)0xFF10)
  19. #define PWM00T1H    (*(unsigned char volatile xdata *)0xFF10)
  20. #define PWM00T1L    (*(unsigned char volatile xdata *)0xFF11)
  21. #define PWM00T2H    (*(unsigned char volatile xdata *)0xFF12)
  22. #define PWM00T2     (*(unsigned int  volatile xdata *)0xFF12)
  23. #define PWM00T2L    (*(unsigned char volatile xdata *)0xFF13)
  24. #define PWM00CR     (*(unsigned char volatile xdata *)0xFF14)
  25. #define PWM00HLD    (*(unsigned char volatile xdata *)0xFF15)

  26. sfr     P0M1    =   0x93;
  27. sfr     P0M0    =   0x94;
  28. sfr     P1M1    =   0x91;
  29. sfr     P1M0    =   0x92;
  30. sfr     P2M1    =   0x95;
  31. sfr     P2M0    =   0x96;
  32. sfr     P3M1    =   0xb1;
  33. sfr     P3M0    =   0xb2;
  34. sfr     P4M1    =   0xb3;
  35. sfr     P4M0    =   0xb4;
  36. sfr     P5M1    =   0xc9;
  37. sfr     P5M0    =   0xca;

  38. void PWM0_Isr() interrupt 22
  39. {
  40.     static bit dir = 1;
  41.     static int val = 0;

  42.     if (PWMCFG01 & 0x08)
  43.     {
  44.         PWMCFG01 &= ~0x08;                      //清中断标志
  45.         if (dir)
  46.         {
  47.             val++;
  48.             if (val >= CYCLE) dir = 0;
  49.         }
  50.         else
  51.         {
  52.             val--;
  53.             if (val <= 1) dir = 1;
  54.         }
  55.         _push_(P_SW2);
  56.         P_SW2 |= 0x80;
  57.         PWM00T2 = val;
  58.         _pop_(P_SW2);
  59.     }
  60. }

  61. void main()
  62. {
  63.     P0M0 = 0x00;
  64.     P0M1 = 0x00;
  65.     P1M0 = 0x00;
  66.     P1M1 = 0x00;
  67.     P2M0 = 0x00;
  68.     P2M1 = 0x00;
  69.     P3M0 = 0x00;
  70.     P3M1 = 0x00;
  71.     P4M0 = 0x00;
  72.     P4M1 = 0x00;
  73.     P5M0 = 0x00;
  74.     P5M1 = 0x00;

  75.     PWMSET = 0x01;                              //使能PWM0模块(必须先使能模块后面的设置才有效)

  76.     P_SW2 = 0x80;
  77.     PWM0CKS = 0x00;                             // PWM0时钟为系统时钟
  78.     PWM0C = CYCLE;                              //设置PWM0周期
  79.     PWM00T1= 0x0000;
  80.     PWM00T2= 0x0001;
  81.     PWM00CR= 0x80;                              //使能PWM00输出
  82.     P_SW2 = 0x00;

  83.     PWMCFG01 = 0x05;                            //启动PWM0模块并使能PWM0中断
  84.     EA = 1;

  85.     while (1);
  86. }

复制代码
回复

使用道具 举报

ID:213173 发表于 2022-12-13 09:32 | 显示全部楼层
给你一个渐亮渐暗开关灯的示例,相关变量和端口根据实际需要自行调整。

  1. #include <reg51.H>

  2. sbit OUT=P1^0;
  3. sbit key=P3^4;

  4. unsigned char num;
  5. unsigned char count;
  6. bit sign;

  7. void delay_10ms()//延时函数
  8. {
  9.         int i,j;
  10.         for(i=0;i<10;i++)
  11.                 for(j=0;j<120;j++);
  12. }
  13. void Timer0Init()                //200微秒@12.000MHz
  14. {
  15.         TMOD= 0x02;                //设置定时器模式
  16.         TL0 = 0x38;                //设置定时初始值
  17.         TH0 = 0x38;                //设置定时重载值
  18.         TF0 = 0;                //清除TF0标志
  19.         TR0 = 1;                //定时器0开始计时
  20.         EA = 1;
  21.         ET0 = 1;
  22. }

  23. void main(void)
  24. {
  25.         Timer0Init();
  26.         while(1)
  27.         {
  28.                 if(!key)
  29.                 {
  30.                         delay_10ms();
  31.                         if(!key)
  32.                         {
  33.                                 sign=~sign;
  34.                                 while(!key);
  35.                         }
  36.                 }
  37.         }
  38. }

  39. void Timer0Interrupt(void) interrupt 1
  40. {
  41.         count++;
  42.         if(count>=100)
  43.         {
  44.                 count=0;
  45.                 if(sign)
  46.                 {
  47.                         if(num<100)num++;
  48.                 }
  49.                 else
  50.                 {
  51.                         if(num>0)num--;
  52.                 }
  53.         }
  54.         if(num>count)OUT=0;//暗
  55.         else OUT=1;//亮
  56. }

复制代码
回复

使用道具 举报

ID:77589 发表于 2022-12-13 10:27 | 显示全部楼层
通过延时程序,延时增加或减小PWM输出值,延时时长就是步进时长。
回复

使用道具 举报

ID:1034262 发表于 2022-12-13 11:06 | 显示全部楼层
按一定的节拍,加减PWM值即可,STC官网有例子的。
回复

使用道具 举报

ID:468169 发表于 2022-12-15 20:37 来自手机 | 显示全部楼层
wulin 发表于 2022-12-13 09:32
给你一个渐亮渐暗开关灯的示例,相关变量和端口根据实际需要自行调整。

那如果开机时要求7秒钟内完成占空比0%-100%的亮度,是不是设置一个变量控制占空比的速度时间呢?
回复

使用道具 举报

ID:824490 发表于 2022-12-15 21:28 | 显示全部楼层
想不通,真的想不通!都会PWM输出了,还不会渐进渐出?
回复

使用道具 举报

ID:213173 发表于 2022-12-15 21:42 | 显示全部楼层
nanyexin 发表于 2022-12-15 20:37
那如果开机时要求7秒钟内完成占空比0%-100%的亮度,是不是设置一个变量控制占空比的速度时间呢?

延长定时器中断周期即可
回复

使用道具 举报

ID:161164 发表于 2022-12-16 09:12 | 显示全部楼层
nanyexin 发表于 2022-12-15 20:37
那如果开机时要求7秒钟内完成占空比0%-100%的亮度,是不是设置一个变量控制占空比的速度时间呢?

7/100 = 0.07s = 70ms
弄一个70ms的标志位
开机时每70ms加1%
关机时每70ms减1%
回复

使用道具 举报

ID:645225 发表于 2023-2-5 13:49 | 显示全部楼层
在单片机C语言程序中控制PWM缓慢启动和关闭,您可以使用循环和延时函数来实现。

例如,在启动PWM时,您可以使用以下代码:
  1. #include <stdio.h>
  2. #include <unistd.h>

  3. void start_pwm(void)
  4. {
  5.     int i;
  6.     for (i = 1; i <= 100; i++) {
  7.         // 设置PWM占空比,例如:pwm_set_duty(i);
  8.         // 延时一定时间,例如:usleep(10000); // 延时10ms
  9.     }
  10. }
复制代码

在关闭PWM时,您可以使用以下代码:
  1. void stop_pwm(void)
  2. {
  3.     int i;
  4.     for (i = 100; i >= 1; i--) {
  5.         // 设置PWM占空比,例如:pwm_set_duty(i);
  6.         // 延时一定时间,例如:usleep(10000); // 延时10ms
  7.     }
  8. }
复制代码


请注意,上面的代码是一个简单的示例,可能需要根据您的实际需求和硬件平台进行修改。此外,请替换pwm_set_duty函数为您的单片机上的PWM设置占空比函数,以便正确设置PWM占空比。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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