金砂紫钰 发表于 2012-11-13 16:46:56

LPC1766(pwm)程序

#include "lpc17xx.h"
#include "type.h"
#include "pwm.h"

volatile uint32_t match_counter0, match_counter1;

/******************************************************************************
** Function name:                PWM1_IRQHandler
**
** Descriptions:                PWM1 interrupt handler
**                                                For now, it only deals with PWM1 match 0
**
** parameters:                        None
** Returned value:                None
**
******************************************************************************/
void PWM1_IRQHandler (void)
{
uint32_t regVal;

regVal = LPC_PWM1->IR;
if ( regVal & MR0_INT )
{
        match_counter1++;       
}
LPC_PWM1->IR |= regVal;                /* clear interrupt flag on match 0      清中断标志位, */
return;
}

/******************************************************************************
** Function name:                PWM_Init
**
** Descriptions:                PWM initialization, setup all GPIOs to PWM0~6,
**                                                reset counter, all latches are enabled, interrupt
**                                                on PWMMR0, install PWM interrupt to the VIC table.
**
** parameters:                        ChannelNum, Duty cycle
** Returned value:                true or fase, if VIC table is full, return false
**
******************************************************************************/
uint32_t PWM_Init( uint32_t ChannelNum, uint32_t cycle )
{
if ( ChannelNum == 1 )
{
        match_counter1 = 0;
        LPC_PINCON->PINSEL4 = 0x00001555;        /* set GPIOs for all PWM pins on PWM */

        LPC_PWM1->TCR = TCR_RESET;        /* Counter Reset   计数器复位 */
        LPC_PWM1->PR = 0x00;                /* count frequency:Fpclk   计数频率:外设时钟 */
        LPC_PWM1->MCR = PWMMR0I;        /* interrupt on PWMMR0, reset on PWMMR0, reset
                                                                TC if PWM matches */                               
        LPC_PWM1->MR0 = cycle;                /* set PWM cycle周期 */
        LPC_PWM1->MR1 = cycle * 5/6;
        LPC_PWM1->MR2 = cycle * 2/3;
        LPC_PWM1->MR3 = cycle * 1/2;
        LPC_PWM1->MR4 = cycle * 1/3;
        LPC_PWM1->MR5 = cycle * 1/6;
        LPC_PWM1->MR6 = 0;       

        /* all PWM latch enabled */
        LPC_PWM1->LER = LER0_EN | LER1_EN | LER2_EN | LER3_EN | LER4_EN | LER5_EN | LER6_EN;
}
else
{
        return ( FALSE );                /* Unknown channel number   未知信道数*/
}

NVIC_EnableIRQ(PWM1_IRQn);
return (TRUE);
}       

以上是原代码,有几点我看不明白。。请教高手,
LPC_PWM1->MR0 = cycle;                /* set PWM cycle周期 */
        LPC_PWM1->MR1 = cycle * 5/6;
        LPC_PWM1->MR2 = cycle * 2/3;
        LPC_PWM1->MR3 = cycle * 1/2;
        LPC_PWM1->MR4 = cycle * 1/3;
        LPC_PWM1->MR5 = cycle * 1/6;
        LPC_PWM1->MR6 = 0;       
如果我的占空比和频率要调的话,怎样设计,



                       

Excellence 发表于 2012-11-13 16:55:51

LPC_PWM1->MR1 = cycle * 5/60;
      LPC_PWM1->MR2 = cycle * 2/30;
      LPC_PWM1->MR3 = cycle * 1/20;
      LPC_PWM1->MR4 = cycle * 1/30;
      LPC_PWM1->MR5 = cycle * 1/60;


试试。。。。

Excellence 发表于 2012-11-13 16:56:23

改变    cycle   值。。。。

lxm734974094 发表于 2014-3-29 12:51:31

输出引脚是哪一个啊?
页: [1]
查看完整版本: LPC1766(pwm)程序