找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1733|回复: 17
打印 上一主题 下一主题
收起左侧

两路互补调光调色方案如何实现,求大神指点

  [复制链接]
跳转到指定楼层
楼主
如图是一张调光调色方案的 PWM波形图,有大神知道程序如何实现吗?求大神帮忙指点下 ,万分感谢
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:301191 发表于 2022-1-17 23:13 | 只看该作者
顶一下
回复

使用道具 举报

板凳
ID:488334 发表于 2022-1-18 15:06 | 只看该作者
1、第一种方法:第一个图用硬件PWM互补模式,死区调节,第二个用不了硬件PWM。
2、第二种方法:干脆直接用IO模拟PWM。不过这样的话频率就无法调得很高。
回复

使用道具 举报

地板
ID:543220 发表于 2022-1-20 08:13 | 只看该作者
tatachaoren 发表于 2022-1-18 15:06
1、第一种方法:第一个图用硬件PWM互补模式,死区调节,第二个用不了硬件PWM。
2、第二种方法:干脆直接用 ...

算了你没明白意思
回复

使用道具 举报

5#
ID:624769 发表于 2022-1-20 23:23 | 只看该作者
估计没人能看明白的你的意思,
你发的图只是说明了 PWMC+PWMW的占空比 与 亮度之间的关系。
跟“如何实现” 之间 没有任何关联。压根不知道你所谓的“如何实现”到底指的什么。
回复

使用道具 举报

6#
ID:161164 发表于 2022-1-21 00:17 | 只看该作者
简单,用一个定器就可以了
以下是三种模式

自动循环



手动选择双色比例



手动选择输出比例


回复

使用道具 举报

7#
ID:140489 发表于 2022-1-21 09:15 | 只看该作者
lkc8210 发表于 2022-1-21 00:17
简单,用一个定器就可以了
以下是三种模式

能发下源码吗
回复

使用道具 举报

8#
ID:161164 发表于 2022-1-21 13:47 | 只看该作者

用例程改一下就行

  1. /*------------------------------------------------------------------*/
  2. /* --- STC MCU International Limited -------------------------------*/
  3. /* --- STC 1T Series MCU RC Demo -----------------------------------*/
  4. /* If you want to use the program or the program referenced in the  */
  5. /* article, please specify in which data and procedures from STC    */
  6. /*------------------------------------------------------------------*/

  7. #include    <reg52.h>


  8. /*************  功能说明    **************

  9. 本程序演示使用定时器做软件PWM。

  10. 定时器0做16位自动重装,中断,从T0CLKO高速输出PWM。

  11. 本例程是使用STC15F/L系列MCU的定时器T0做模拟PWM的例程。

  12. PWM可以是任意的量程。但是由于软件重装需要一点时间,所以PWM占空比最小为32T/周期,最大为(周期-32T)/周期, T为时钟周期。

  13. PWM频率为周期的倒数。假如周期为6000, 使用24MHZ的主频,则PWM频率为4000HZ。

  14. ******************************************/

  15. #define     MAIN_Fosc       24000000UL      //定义主时钟

  16. #define     PWM_DUTY        6000            //定义PWM的周期,数值为时钟周期数,假如使用24.576MHZ的主频,则PWM频率为6000HZ。

  17. #define     PWM_HIGH_MIN    32              //限制PWM输出的最小占空比。用户请勿修改。
  18. #define     PWM_HIGH_MAX    (PWM_DUTY-PWM_HIGH_MIN) //限制PWM输出的最大占空比。用户请勿修改。

  19. typedef     unsigned char   u8;
  20. typedef     unsigned int    u16;
  21. typedef     unsigned long   u32;

  22. sfr P3M1  = 0xB1;   //P3M1.n,P3M0.n     =00--->Standard,    01--->push-pull
  23. sfr P3M0  = 0xB2;   //                  =10--->pure input,  11--->open drain
  24. sfr AUXR  = 0x8E;
  25. sfr INT_CLKO = 0x8F;

  26. sbit    P_PWM = P3^5;       //定义PWM输出引脚。
  27. //sbit  P_PWM = P1^4;       //定义PWM输出引脚。STC15W204S

  28. u16     pwm;                //定义PWM输出高电平的时间的变量。用户操作PWM的变量。

  29. u16     PWM_high,PWM_low;   //中间变量,用户请勿修改。

  30. void    delay_ms(unsigned char ms);
  31. void    LoadPWM(u16 i);


  32. /******************** 主函数**************************/
  33. void main(void)
  34. {
  35.     P_PWM = 0;
  36.     P3M1 &= ~(1 << 5);  //P3.5 设置为推挽输出
  37.     P3M0 |=  (1 << 5);

  38. //  P1M1 &= ~(1 << 4);  //P1.4 设置为推挽输出   STC15W204S
  39. //  P1M0 |=  (1 << 4);

  40.     TR0 = 0;        //停止计数
  41.     ET0 = 1;        //允许中断
  42.     PT0 = 1;        //高优先级中断
  43.     TMOD &= ~0x03;  //工作模式,0: 16位自动重装
  44.     AUXR |=  0x80;  //1T
  45.     TMOD &= ~0x04;  //定时
  46.     INT_CLKO |=  0x01;  //输出时钟

  47.     TH0 = 0;
  48.     TL0 = 0;
  49.     TR0 = 1;    //开始运行

  50.     EA = 1;

  51.     pwm = PWM_DUTY / 10;    //给PWM一个初值,这里为10%占空比
  52.     LoadPWM(pwm);           //计算PWM重装值


  53.     while (1)
  54.     {
  55.         while(pwm < (PWM_HIGH_MAX-8))
  56.         {
  57.             pwm += 8;       //PWM逐渐加到最大
  58.             LoadPWM(pwm);
  59.             delay_ms(8);
  60.         }
  61.         while(pwm > (PWM_HIGH_MIN+8))
  62.         {
  63.             pwm -= 8;   //PWM逐渐减到最小
  64.             LoadPWM(pwm);
  65.             delay_ms(8);
  66.         }
  67.     }
  68. }


  69. //========================================================================
  70. // 函数: void  delay_ms(unsigned char ms)
  71. // 描述: 延时函数。
  72. // 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.
  73. // 返回: none.
  74. // 版本: VER1.0
  75. // 日期: 2013-4-1
  76. // 备注:
  77. //========================================================================
  78. void  delay_ms(unsigned char ms)
  79. {
  80.      unsigned int i;
  81.      do{
  82.           i = MAIN_Fosc / 13000;
  83.           while(--i)    ;
  84.      }while(--ms);
  85. }

  86. /**************** 计算PWM重装值函数 *******************/
  87. void    LoadPWM(u16 i)
  88. {
  89.     u16 j;

  90.     if(i > PWM_HIGH_MAX)        i = PWM_HIGH_MAX;   //如果写入大于最大占空比数据,则强制为最大占空比。
  91.     if(i < PWM_HIGH_MIN)        i = PWM_HIGH_MIN;   //如果写入小于最小占空比数据,则强制为最小占空比。
  92.     j = 65536UL - PWM_DUTY + i; //计算PWM低电平时间
  93.     i = 65536UL - i;            //计算PWM高电平时间
  94.     EA = 0;
  95.     PWM_high = i;   //装载PWM高电平时间
  96.     PWM_low  = j;   //装载PWM低电平时间
  97.     EA = 1;
  98. }

  99. /********************* Timer0中断函数************************/
  100. void timer0_int (void) interrupt 1
  101. {
  102.     if(P_PWM)
  103.     {
  104.         TH0 = (u8)(PWM_low >> 8);   //如果是输出高电平,则装载低电平时间。
  105.         TL0 = (u8)PWM_low;
  106.     }
  107.     else
  108.     {
  109.         TH0 = (u8)(PWM_high >> 8);  //如果是输出低电平,则装载高电平时间。
  110.         TL0 = (u8)PWM_high;
  111.     }
  112. }

复制代码
回复

使用道具 举报

9#
ID:1003140 发表于 2022-1-22 22:26 | 只看该作者
软件好做,硬件不好做
回复

使用道具 举报

10#
ID:543220 发表于 2022-3-31 08:41 | 只看该作者
lkc8210 发表于 2022-1-21 13:47
用例程改一下就行

你这个 写 没有死区的 , 用硬件带死区的PWM , 例如PWM0  PWM2N
回复

使用道具 举报

11#
ID:161164 发表于 2022-3-31 14:49 | 只看该作者
a2748446 发表于 2022-3-31 08:41
你这个 写 没有死区的 , 用硬件带死区的PWM , 例如PWM0  PWM2N

你的图也没有显示要死区啊~
你用硬件带死区的PWM弄好了吗?
回复

使用道具 举报

12#
ID:482083 发表于 2022-8-7 16:03 | 只看该作者
楼主有调好了嘛,小弟也碰到了这个问题,第一个图能做到,第二个图就不知道如何下手
回复

使用道具 举报

13#
ID:140489 发表于 2022-8-8 15:24 | 只看该作者
lkc8210 发表于 2022-1-21 13:47
用例程改一下就行

仿真的那个代码能发一下吗?
回复

使用道具 举报

14#
ID:320097 发表于 2022-8-8 15:29 | 只看该作者
你给信息好有限,很多都是靠猜
回复

使用道具 举报

15#
ID:609524 发表于 2022-8-9 17:42 | 只看该作者
双色温调光调色吗
回复

使用道具 举报

16#
ID:482083 发表于 2022-8-10 14:50 | 只看该作者
lkc8210 发表于 2022-1-21 00:17
简单,用一个定器就可以了
以下是三种模式

大佬可以发一下你仿真的的代码吗
回复

使用道具 举报

17#
ID:161164 发表于 2022-8-10 17:12 | 只看该作者
cj2333 发表于 2022-8-10 14:50
大佬可以发一下你仿真的的代码吗

8楼有例程
回复

使用道具 举报

18#
ID:25310 发表于 2022-8-11 10:17 | 只看该作者
为什么不用硬件PWM输出? 两个同周期的PWM。用互补方式输出就OK了。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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