[技术问答] N76E003呼吸灯问题

[复制链接]
2309|9
 楼主| Leven175 发表于 2018-12-14 14:26 | 显示全部楼层 |阅读模式
要想实现呼吸灯,必须通过PWM设置占空比和周期,再通过定时器的计数值与占空比作比较,现在的问题是按照例程设置PWM,却找不到与定时器相匹配的寄存器。想知道,N76E003有没有像STM32一样有TIM_SETCOMPARE的函数。或者指导一下小弟,应该如何将占空比与定时器的计数值作比较?
IoTCatcher 发表于 2018-12-15 13:38 | 显示全部楼层
你的"要想实现呼吸灯,必须通过PWM设置占空比和周期"这句话时对的.
后面为什么一定要老想着某某芯片时怎么样的, 这个芯片有没有?
我觉得就应该跟着你第一句的思路, 占空比, 周期.
那这两个值怎么设?看看手册PWM介绍.
噢, 原来周期是根据你要设置的频率算出来的, 放在PWMPH, PWMPL(所有PWM公用一个频率)
占空比是放在PWMxH,PWMxL的.(如PWM0H, PWM0L).
下面是我的代码.
  1. void set_freq_duty_pwm0(UINT16 freq, UINT8 duty)
  2. {
  3.     UINT32 temp;
  4.   /**********************************************************************
  5.       PWM frequency = Fpwm/((PWMPH,PWMPL) + 1) <Fpwm = Fsys/PWM_CLOCK_DIV>
  6.     ***********************************************************************/
  7.     PWM_CLOCK_DIV_2;
  8.     if(freq > (FOSC_SYS_FREQ)){
  9.       return;
  10.     }
  11.     if(duty > 100){
  12.       return;
  13.     }
  14.     temp = (FOSC_SYS_FREQ/2/freq) - 1;
  15.     PWMPH = (UINT8)((temp>>8)&0xff);
  16.     PWMPL = (UINT8)(temp&0xff);
  17.   /**********************************************************************
  18.       PWM Duty = (PWMnH,PWMnL)/((PWMPH,PWMPL) + 1)
  19.     ***********************************************************************/
  20.    temp += 1;
  21.    temp = temp*duty;
  22.    temp = temp/100;
  23.    PWM0H = (UINT8)((temp>>8)&0xff);
  24.    PWM0L = (UINT8)(temp&0xff);

  25.   set_LOAD;
  26. }


评论

嗯嗯,设置频率和占空比,但是明显不能作呼吸灯的,因为它没有作比较,按你上面写的函数只是设置一个PWM,但是想实现呼吸灯,还需要与定时器的计数值作比较。我的思路就卡在这里了。也先谢谢你。  发表于 2018-12-17 10:08
小S咯 发表于 2018-12-15 16:32 | 显示全部楼层
PWM0L = dat10;       
        PWM1L = dat13;                                                       
        PWM2L = dat9;
  PWM3L = dat3;

        set_SFRPAGE;                                                //PWM4 and PWM5 duty seting is in SFP page 1                               
        PWM4L = dat1;                                       
        PWM5L = dat7;
        clr_SFRPAGE;                                                                                       

        set_LOAD;
IoTCatcher 发表于 2018-12-17 11:19 | 显示全部楼层
IoTCatcher 发表于 2018-12-15 13:38
你的"要想实现呼吸灯,必须通过PWM设置占空比和周期"这句话时对的.
后面为什么一定要老想着某某芯片时怎么 ...

N76E003PWM.png

1.嗯, 你的思路是对的, 无论是周期还是占空比都是和一个16位计数器做比较.
2.你可以看下框图, 有个16bit up/down counter, 这个就是你要找的计数值. 只是我们不能读取, 只能clear,让它到0000H.
3.所以大概原理就是这样:
假设
{PWMPH, PWMPL} = 1000;
{PWMnH, PWMnL} = 500;

16-bit计数器总的计数时间:  |0 .....................................65535|
PWM周期:                          |0............999|
PWM占空比:                       |0......499|

4. 如果你按照我的代码不行, 可以确认以下几点:
1).GPIO的PWM功能
2).如果是PWM4/5,需要set_SFRPAGE
3).为了看呼吸灯效果, 改变占空比之间, 添加延时.

评论

已经可以了,多谢指教!!!谢谢你  发表于 2018-12-17 13:31
huahuagg 发表于 2018-12-17 14:34 | 显示全部楼层
需要周期这个吗,周期设置好,调整占空比就行了。我记得周期不用调。
huahuagg 发表于 2018-12-17 14:35 | 显示全部楼层
另外不要想着用其他芯片的方法,你要动PWM的原理就行,寄存器不同的,按照这个的手册说明和例程配置。
dongnanxibei 发表于 2018-12-26 22:27 | 显示全部楼层
看你想让这个呼吸周期多少了。然后计算好定时周期,在定时中断修改PWM占空比。
wanduzi 发表于 2018-12-30 18:53 | 显示全部楼层
不是有PWM例子吗,然后设定一个定时器,里面定时修改PWM。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

17

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部