打印
[技术问答]

N76E003 PWM延时问题

[复制链接]
3060|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 yunxiang521 于 2020-4-15 13:43 编辑
 PWM0_P12_OUTPUT_ENABLE;
                PWM_COMPLEMENTARY_MODE;                                        //Only this mode support deat time function
                PWM_CLOCK_DIV_16;
                PWMPH = 0x49;
                PWMPL = 0x3e;
                PWM0H = 0x00;
                PWM0L = 0x01;
我设置的是16分频,60秒发送3200个脉冲,按正常应该是1875us,003的延时是1810us,1810*3200=5792000us  也就是57.92秒。不知道那里出了问题,希望大牛指点一下。考虑到可能是16M的问题。就改为了16.6M,改好后,PWM没有输出了。改16.6M的方法是引用了串口的MODIFY_HIRC_16588函数。不知道方法对不对。
下面这个是STM的PWM,延时没有问题。

使用特权

评论回复
沙发
dongnanxibei| | 2020-4-15 22:05 | 只看该作者
官方有个PDF文档介绍这个。

使用特权

评论回复
板凳
dongnanxibei| | 2020-4-15 22:10 | 只看该作者
N76E003的HIRC频率为16 MHz,常温下偏差在1%以内。当用于38400以上baud rate的UART传输时,会因为16 MHz无法除频出38400 Hz的频率,造成baud rate偏差过大,无法稳定传输。

此时用户可以更改HIRC的频率到16.588 MHz,就能产生精准的baud rate。
更改HIRC频率的步骤如下:
1. Trim value = RCTRIM0(HIRCTRIM[8:1]) + RCTRIM1(HIRCTRIM[0])
将Trim value–15可以调整HIRC的频率为16.6 MHz。

2. 将计算值写回RCTRIM0 和RCTRIM1,写入后HIRC的更改会立即生效。

3. 每次上电后HIRC会恢复成16 MHz,使用者需要通过写SFR来更改HIRC。

4. 按照16.588 MHz重新计算baud rate,再设定timer产生的baud rate就能符合标准baud rate。

范例程序如下:

sfr RCTRIM0 = 0x84;

sfr RCTRIM1 = 0x85;

bit BIT_TMP;



#define set_IAPEN  BIT_TMP = EA; EA=0; TA=0xAA; TA=0x55; CHPCON |= SET_BIT0; EA= BIT_TMP

#define set_IAPGO  BIT_TMP = EA; EA = 0; TA = 0xAA; TA = 0x55; IAPTRG |= SET_BIT0; EA = BIT_TMP

#define clr_IAPEN  BIT_TMP = EA; EA = 0; TA = 0xAA; TA = 0x55; CHPCON &= ~SET_BIT0; EA=BIT_TMP



unsigned char hircmap0,hircmap1;

unsigned int trimvalue16bit;



void MODIFY_HIRC_VLAUE(void)

{

    set_IAPEN;

    IAPAL = 0x30;

    IAPAH = 0x00;

    IAPCN = READ_UID;

    set_IAPGO;

    hircmap0 = IAPFD;

    IAPAL = 0x31;

    IAPAH = 0x00;

    set_IAPGO;

    hircmap1 = IAPFD;

    clr_IAPEN;

    trimvalue16bit = ((hircmap0<<1)+(hircmap1&0x01));

    trimvalue16bit = trimvalue16bit - 15;

    hircmap1 = trimvalue16bit&0x01;

    hircmap0 = trimvalue16bit>>1;

    TA=0XAA;

    TA=0X55;

    RCTRIM0 = hircmap0;

    TA=0XAA;

    TA=0X55;

    RCTRIM1 = hircmap1;
}

使用特权

评论回复
地板
dongnanxibei| | 2020-4-15 22:13 | 只看该作者
http://www.nuvoton.com.cn/support/technical-support/faq/d75eb8fd-04f1-11ea-b113-05daf7eedf03/

使用特权

评论回复
5
yunxiang521|  楼主 | 2020-4-15 22:25 | 只看该作者
好的,谢谢,我试试

使用特权

评论回复
6
yunxiang521|  楼主 | 2020-4-16 10:37 | 只看该作者
还是一样,延时还是18.1ms

使用特权

评论回复
7
yunxiang521|  楼主 | 2020-4-16 15:21 | 只看该作者
void MODIFY_HIRC_16588(void)
{
    set_IAPEN;
    IAPAL = 0x30;
    IAPAH = 0x00;
    IAPCN = READ_UID;
    set_IAPGO;
    hircmap0 = IAPFD;
    IAPAL = 0x31;
    IAPAH = 0x00;
    set_IAPGO;
    hircmap1 = IAPFD;
    clr_IAPEN;
    trimvalue16bit = ((hircmap0<<1)+(hircmap1&0x01));
    trimvalue16bit = trimvalue16bit - 15;
    hircmap1 = trimvalue16bit&0x01;
    hircmap0 = trimvalue16bit>>1;
    TA=0XAA;
    TA=0X55;
    RCTRIM0 = hircmap0;
    TA=0XAA;
    TA=0X55;
    RCTRIM1 = hircmap1;
}

使用特权

评论回复
8
yunxiang521|  楼主 | 2020-4-16 15:22 | 只看该作者
延时还是18.1ms 一分钟相差2秒多 50分钟相差2分钟多

使用特权

评论回复
9
yunxiang521|  楼主 | 2020-4-16 15:40 | 只看该作者
其实是16.6的问题,我把trimvalue16bit = trimvalue16bit - 15 减的15删除改为16M,现在延时是18.73,差了2us,把 trimvalue16bit+1,延时就是18.77,又多了2us,真是2呀。相差也不多,如果发送10000个脉冲,10000*32000*2 也就相差了64秒,也就是100分钟差了1分钟。

使用特权

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

本版积分规则

24

主题

100

帖子

0

粉丝