打印
[技术问答]

N76E003呼吸灯问题

[复制链接]
1888|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).
下面是我的代码.
void set_freq_duty_pwm0(UINT16 freq, UINT8 duty)
{
    UINT32 temp;
  /**********************************************************************
      PWM frequency = Fpwm/((PWMPH,PWMPL) + 1) <Fpwm = Fsys/PWM_CLOCK_DIV>
    ***********************************************************************/
    PWM_CLOCK_DIV_2;
    if(freq > (FOSC_SYS_FREQ)){
      return;
    }
    if(duty > 100){
      return;
    }
    temp = (FOSC_SYS_FREQ/2/freq) - 1;
    PWMPH = (UINT8)((temp>>8)&0xff);
    PWMPL = (UINT8)(temp&0xff);
  /**********************************************************************
      PWM Duty = (PWMnH,PWMnL)/((PWMPH,PWMPL) + 1)
    ***********************************************************************/
   temp += 1;
   temp = temp*duty;
   temp = temp/100;
   PWM0H = (UINT8)((temp>>8)&0xff);
   PWM0L = (UINT8)(temp&0xff);

  set_LOAD;
}


使用特权

评论回复
评论
Leven175 2018-12-17 10:08 回复TA
嗯嗯,设置频率和占空比,但是明显不能作呼吸灯的,因为它没有作比较,按你上面写的函数只是设置一个PWM,但是想实现呼吸灯,还需要与定时器的计数值作比较。我的思路就卡在这里了。也先谢谢你。 
板凳
小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设置占空比和周期"这句话时对的.
后面为什么一定要老想着某某芯片时怎么 ...



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).为了看呼吸灯效果, 改变占空比之间, 添加延时.

使用特权

评论回复
评论
Leven175 2018-12-17 13:31 回复TA
已经可以了,多谢指教!!!谢谢你 
5
huahuagg| | 2018-12-17 14:34 | 只看该作者
需要周期这个吗,周期设置好,调整占空比就行了。我记得周期不用调。

使用特权

评论回复
6
huahuagg| | 2018-12-17 14:35 | 只看该作者
另外不要想着用其他芯片的方法,你要动PWM的原理就行,寄存器不同的,按照这个的手册说明和例程配置。

使用特权

评论回复
7
dongnanxibei| | 2018-12-26 22:27 | 只看该作者
看你想让这个呼吸周期多少了。然后计算好定时周期,在定时中断修改PWM占空比。

使用特权

评论回复
8
wanduzi| | 2018-12-30 18:53 | 只看该作者
不是有PWM例子吗,然后设定一个定时器,里面定时修改PWM。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

17

帖子

0

粉丝