打印

PWM精确控制输出脉冲数

[复制链接]
2514|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
S3C2440|  楼主 | 2010-3-12 20:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
六楼的窗户| | 2010-3-12 20:14 | 只看该作者
预算好10000个脉冲所花费的时间,用SysTick定时,在SysTick中断里关闭PWM。不知是否可以?

使用特权

评论回复
板凳
huzixian| | 2010-3-12 20:32 | 只看该作者
对于低频率,使用一个TIMER 作为 PULS COUNTER,使能PWM generator 前设置 记数初值,记满后中断中 关PWM generator 即可。

对于高频率,看来要加入外部 计数器,例如 8254 等与门电路(与门),同样的原理,使用记数模式在记数满后来关断频率发生器,ASIC 的速度还是比MCU快一些;

使用特权

评论回复
地板
huzixian| | 2010-3-12 20:51 | 只看该作者
这个问题不知有没有人实际用过,可以提供可行的答案吗?因为要控制角度,所以需要输出计算好的精确脉冲数。

最好有程序

忘解答,急!!!

还有例程里给的PWM中断程序,单步试了下,始终都没有进入中断,就进入了无限循环,无法在中断里逐周期改变PWM周期,是怎么回事?

部分程序如下:

PWMGenConfigure(PWM_BASE, PWM_GEN_1,                                /*  配置PWM发生器1:加减计数    */
                    PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC);
    PWMGenPeriodSet(PWM_BASE, PWM_GEN_1, 60000);                        /*  设置PWM发生器1的周期        */
    PWMPulseWidthSet(PWM_BASE, PWM_OUT_2,30000);                        /*  设置PWM2输出的脉冲宽度      */
    PWMPulseWidthSet(PWM_BASE, PWM_OUT_3,30000);                        /*  设置PWM3输出的脉冲宽度      */
   
    PWMSyncUpdate(PWM_BASE,PWM_GEN_1_BIT);
    PWMOutputState(PWM_BASE,                                            /*  使能PWM2和PWM3的输出        */
                   PWM_OUT_2_BIT | PWM_OUT_3_BIT,
                   true);
    PWMGenEnable(PWM_BASE, PWM_GEN_1);                                  /*  使能PWM发生器1,开始产生    */
                                                                        /*  PWM方波                     */
    PWMGenIntTrigEnable(PWM_BASE,                                       /*  使能PWM发生器1归零触发中断  */
                        PWM_GEN_1,
                        PWM_INT_CNT_ZERO);
    PWMIntEnable(PWM_BASE, PWM_INT_GEN_1);                                  /*  使能PWM发生器1中断          */
    IntEnable(INT_PWM1);                                                /*  使能PWM1中断                */
    IntMasterEnable();                                                  /*  使能总中断                  */
    for (;;) {
    }
}

/*********************************************************************************************************
** Function name:       PWM_Generator_1_ISR()
** Descriptions:        PWM发生器1中断服务函数
*********************************************************************************************************/
void  PWM_Generator_1_ISR (void)
{
    const unsigned long ulTab[10] =
    {
         3000,  9000, 15000, 21000, 27000,
        33000, 39000, 45000, 51000, 57000
    };
    static unsigned long n = 0;
    PWMGenIntClear(PWM_BASE,
                   PWM_GEN_1,
                   PWM_INT_CNT_ZERO);
    PWMPulseWidthSet(PWM_BASE, PWM_OUT_2,,ulTab[n]);                    /*  设置PWM2输出的周期          */
    PWMPulseWidthSet(PWM_BASE, PWM_OUT_3, ulTab[9-n]);                  /*  设置PWM3输出的周期          */
    n++;
    if ( n >= 10 ) {
        n = 0;
    }
}

使用特权

评论回复
5
6019实验室| | 2010-3-12 21:19 | 只看该作者
上面提到的“直接使用PWM 的INTR,每个PWM 脉冲都回发生中断,然后累加到设定值 以后 关断PWM 即可”

程序如何让实现?

使用特权

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

本版积分规则

95

主题

400

帖子

1

粉丝