Phase-shifted PWM demo program

Dependencies:   mbed

main.cpp

Committer:
wac
Date:
2010-10-20
Revision:
0:8de789e82743

File content as of revision 0:8de789e82743:

// Phase-shifted PWM Test Code
// 
// Attempt to run two PWM outputs with 180° phase shifting
// Version x.x
// Created by Wayne Chin
// October 15, 2010

#include "mbed.h"

#define TRUE 1
#define FALSE 0

DigitalOut led1(LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);
DigitalOut led4(LED4);

Ticker pwmramp1;
Ticker pwmramp2;
int duty1; // Duty cycle in integer %
int duty2; // Duty cycle in integer %
int PWMclock; // PWM clock = system clock / 4
int PWMrate; // Use to calculate PWM rate (period)

Serial pc(USBTX, USBRX); // tx, rx

void pwmupdate1()
{
    int PWMwidth, PWMhalf, PWMrising, PWMfalling;
    if (duty1++ > 100) duty1 = 0; // Clamp at 100% pulsewidth
    PWMwidth = (duty1 * PWMrate) / 100;
    PWMhalf = PWMwidth / 2;
    PWMrising = PWMrate - PWMhalf;
    PWMfalling = PWMhalf;
    LPC_PWM1->MR3 = PWMrising; // Set rising edge
    LPC_PWM1->MR4 = PWMfalling; // Set falling edge
    LPC_PWM1->LER |= 0x18; // Enable PWM Match 3 & 4 latch
    led4 = !led4;
}

void pwmupdate2()
{
    int PWMcenter, PWMwidth, PWMhalf, PWMrising, PWMfalling;
    if (duty2++ > 100) duty2 = 0; // Clamp at 100% pulsewidth
    PWMcenter = PWMrate / 2;
    PWMwidth = (duty2 * PWMrate) / 100;
    PWMhalf = PWMwidth / 2;
    PWMrising = PWMcenter - PWMhalf;
    PWMfalling = PWMcenter + PWMhalf;
    LPC_PWM1->MR5 = PWMrising;
    LPC_PWM1->MR6 = PWMfalling;
    LPC_PWM1->LER |= 0x60; // Enable PWM Match 5 & 6 latch
    led2 = !led2;
}

int main() 
{
    /****** Program Starts Here *******/
    pc.baud(19200);
    pc.printf("\n\rConnected to mBed...\r\n");
    // Initialize variables
    duty1 = 0;
    duty2 = 0;
    
    printf("SystemCoreClock = %d Hz\r\n", SystemCoreClock);
    // Verify power control for peripherals register
    printf("PCLKSEL0: %x\n\r", LPC_SC->PCLKSEL0);          // Leave at CCLK/4
    PWMclock = SystemCoreClock / 4;
    PWMrate = PWMclock / 15000;                            // 15kHz
    printf("PWMrate: %x\n\r", PWMrate);
    //printf("PINSEL4: %x\n\r", LPC_PINCON->PINSEL4);        // Comes up as GPIO
    LPC_PINCON->PINSEL4 |= 0x00000040;                     // Set P2.3 for PWM1.4
    LPC_PINCON->PINSEL4 |= 0x00000400;                     // Set P2.5 for PWM1.6
    printf("PINSEL4: %x\n\r", LPC_PINCON->PINSEL4);
    // Set up count control register
    printf("PWM1CTCR: %x\n\r", LPC_PWM1->CTCR); // Should already come up in timer mode
    // Set up match control register
    printf("PWM1MCR: %x\n\r", LPC_PWM1->MCR);
    //LPC_PWM1->MCR |= 0x00002000; // Reset PWM4 on match - do not use
    //LPC_PWM1->MCR |= 0x00080000; // Reset PWM6 on match - do not use
    LPC_PWM1->MCR |= 0x00000002; // Reset PWM0 on match
    printf("PWM1MCR: %x\n\r", LPC_PWM1->MCR);
    // Set up match registers
    LPC_PWM1->MR0 = PWMrate; // Set MR0 (PWM rate)
    LPC_PWM1->MR3 = 0x000; // Reset MR3
    LPC_PWM1->MR4 = 0x320; // Reset MR4
    LPC_PWM1->MR5 = 0x160; // Reset MR5
    LPC_PWM1->MR6 = 0x480; // Reset MR6
    printf("PWM1MR0,3,4,5,6: %x %x %x %x %x\n\r", LPC_PWM1->MR0, LPC_PWM1->MR3, LPC_PWM1->MR4, LPC_PWM1->MR5, LPC_PWM1->MR6);
    // Set up latch enable register
    printf("PWM1LER: %x\n\r", LPC_PWM1->LER);
    LPC_PWM1->LER |= 0x08; // Enable PWM Match 3 latch
    LPC_PWM1->LER |= 0x10; // Enable PWM Match 4 latch
    LPC_PWM1->LER |= 0x20; // Enable PWM Match 5 latch
    LPC_PWM1->LER |= 0x40; // Enable PWM Match 6 latch
    printf("PWM1LER: %x\n\r", LPC_PWM1->LER);
    // Set up PWM control register
    printf("PWM1PCR: %x\n\r", LPC_PWM1->PCR);
    LPC_PWM1->PCR |= 0x00000010; // Select double edge PWM for PWM4
    LPC_PWM1->PCR |= 0x00000040; // Select double edge PWM for PWM6
    LPC_PWM1->PCR |= 0x00001000; // Enable PWM4
    LPC_PWM1->PCR |= 0x00004000; // Enable PWM6
    printf("PWM1PCR: %x\n\r", LPC_PWM1->PCR);
    // Set up timer control register
    printf("PWM1TCR: %x\n\r", LPC_PWM1->TCR);
    LPC_PWM1->TCR |= 0x08; // Enable PWM mode
    LPC_PWM1->TCR |= 0x01; // Enable counter
    printf("PWM1TCR: %x\n\r", LPC_PWM1->TCR);

    // Set up timeout calls
    pwmramp1.attach_us(&pwmupdate1, 250000); // setup pwmramp1 to call pwmupdate after 250 ms
    pwmramp2.attach_us(&pwmupdate2, 500000); // setup pwmramp2 to call pwmupdate after 500 ms

    while (1)
    {
        
    }//while
}//main