Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: PulseWidthCapture_Program
PulseWidthCapture.cpp
- Committer:
- Ellor1
- Date:
- 2014-12-05
- Revision:
- 0:7076676dd640
- Child:
- 1:6bb38ae2e503
File content as of revision 0:7076676dd640:
#include "mbed.h"
#include "TextLCD_16x4.h"
#include "USBSerial.h"
#include "PulseWidthCapture.h"
#include "rtos.h"
USBSerial serial;
DigitalOut led(P0_9);
DigitalOut led2(P0_8);
DigitalOut led3(P0_7);
DigitalOut led4(P0_17);
//AnalogIn Ain(P0_11);
Capture *Capture::instance;
/*********************************************************************//**
* @brief Create a Capture object and configure it.
* @param None Uses P1_29 as the Capture input (Pin 7)
* @param None Uses P0_12 as the Capture input (Pin 16)
* @return None
**********************************************************************/
Capture::Capture(void)
{
/* Set up clock and power, using default peripheral system clock divider */
LPC_SYSCON->SYSAHBCLKCTRL |= CT32B0_CLK_ENABLE; // See page 30 of the 11U24 User Guide
// Check the clock divider ratio by reading LPC_SYSCON->SYSAHBCLKDIV ls byte
LPC_SYSCON->SYSAHBCLKCTRL |= CT32B1_CLK_ENABLE;
LPC_SYSCON->SYSAHBCLKCTRL |= CT16B0_CLK_ENABLE;
LPC_CT32B0->PR = 0; // Prescale counter divide by ...
LPC_CT32B1->PR = 0;
LPC_CT16B0->PR = 239; //200KHZ
/* Configure IOCON for the proper function of the capture pin. Use a pull-up. */
LPC_IOCON->PIO1_29 = (CT32B0_CAP1); // See page 125 of the 11U24 User Guide
LPC_IOCON->TMS_PIO0_12 = CT32B1_CAP0 | ADMODE;
// Select the capture edge and int mode
LPC_CT32B0->CCR = CCR_CAP1RE | CCR_CAP1I; // Select inputs and interrupts.
LPC_CT32B1->CCR = CCR_CAP0FE | CCR_CAP0I;
LPC_CT16B0->MCR = CT16B0_MR0I | CT16B0_MR0R;
// Set up the rising edge clear, using timer mode
LPC_CT32B0->CTCR = CT32B0_CTCR_CTM_TIMER | CT32B0_CTCR_ENCC | CT32B0_CTCR_SEICC_CAP1FE;
// clear timer on falling edge
LPC_CT32B1->CTCR = CT32B1_CTCR_CTM_TIMER | CT32B1_CTCR_ENCC | CT32B1_CTCR_SEICC_CAP0RE;
// Clear interrupt flag
LPC_CT32B0->IR = CT32B0_IR_CR1INT;
LPC_CT32B1->IR = CT32B1_IR_CR0INT;
LPC_CT16B0->IR = CT16B0_IR_MR0INT;
//* Attach IRQ
instance = this;
NVIC_SetVector(TIMER_32_0_IRQn, (uint32_t)&_Captureisr1);
NVIC_SetVector(TIMER_32_1_IRQn, (uint32_t)&_Captureisr2);
NVIC_SetVector(TIMER_16_0_IRQn, (uint32_t)&_Captureisr3);
}
/*********************************************************************//**
* @brief Start capturing data. Average the specified number of samples.
* @param (int) numsamples Log base 2 of the number of samples to be averaged
* @return None
**********************************************************************/
void Capture::Start_1(void) {
capturedata = 0; // Clear the accumulator
// No data ready
/* Enable interrupt for CAPTURE */
NVIC_EnableIRQ(TIMER_32_0_IRQn);
// Start the timer
LPC_CT32B0->TCR = CT32B0_TCR_CEN; // enable
}
void Capture::Start_2(void) {
capturedata_2 = 0; // Clear the accumulator
// No data ready
/* Enable interrupt for CAPTURE */
NVIC_EnableIRQ(TIMER_32_1_IRQn);
// Start the timer
LPC_CT32B1->TCR = CT32B1_TCR_CEN; // enable
}
/*********************************************************************//**
* @brief Read (accumulated) sample count.
*
* @return (unsigned int) Accumulated capture value
**********************************************************************/
unsigned int Capture::Debug(void) {
debug = LPC_IOCON->TMS_PIO0_12 ; // to check teh values in registers
return debug;
}
//unsigned int Capture::Read_1(void) {
void Capture::Read_1(void) {
// static unsigned int i_1 = 0;
i_1 = capturedata;
// fall = ((i_1/48003280)*1000000);
//test_1 = 101;
// i_1 = capturedata_2;
// return capturedata;
}
//unsigned int Capture::Read_2(void) {
void Capture::Read_2(void) {
// static unsigned int j_1 = 0;
j_1 = capturedata_2;
// rise = ((j_1/48003280)*1000000);
// test_2 = 105;
// j_1 = capturedata_2;
//return capturedata_2;
}
void Capture::Wait(void) {
led3 = !led3;
//Enable interrupt
NVIC_EnableIRQ(TIMER_16_0_IRQn);
// Start the timer
LPC_CT16B0->TCR = CT16B0_TCR_CEN; // enable
LPC_CT16B0->MR0 = 10000000;
}
/* Capture isr instantiator */
void Capture::_Captureisr1(void)
{
instance->Captureisr1();
}
/* Capture isr instantiator */
void Capture::_Captureisr2(void)
{
instance->Captureisr2();
}
/* Capture isr instantiator */
void Capture::_Captureisr3(void)
{
instance->Captureisr3();
}
/*********************************************************************//**
* @brief Capture interrupt service routine. Handles accumulation.
*
* @param[in] none
*
* @return none
**********************************************************************/
void Capture::Captureisr1(void) {
static int capturesum = 0; // Accumulates the readings
led = !led;
capturesum = LPC_CT32B0->CR2;
rise = (((float)capturesum/48003280)*1000000);
// capturedata = 101;
capturedata = capturesum;
// rise = ((capturedata/48003280)*1000000);
//test_1 = 101;
LPC_CT32B0->IR |= CT32B0_IR_CR1INT;
return;
}
/*********************************************************************//**
* @brief Capture interrupt service routine. Handles accumulation.
*
* @param[in] none
*
* @return none
**********************************************************************/
void Capture::Captureisr2(void) {
static int capturesum_2 = 0; // Accumulates the readings
led2 = !led2;
capturesum_2 = LPC_CT32B1->CR0;
// rise = capturesum_2;
// rise_2 = ((rise/48003280)*1000000);
//rise = ((capturesum_2/48003280)*1000000);
capturedata_2 = capturesum_2;
fall = (((float)capturesum_2/48003280)*1000000);
//test_2 = 105;
LPC_CT32B1->IR |= CT32B1_IR_CR0INT;
return;
}
void Capture::Captureisr3(void) {
NVIC_DisableIRQ(TIMER_32_0_IRQn);
NVIC_DisableIRQ(TIMER_32_1_IRQn);
led4 = !led4;
//m_1 = i_1 + j_1;
// ((i_1/48003280)*1000000);
//rise = ((capturedata/48003280)*1000000);
//serial.printf("rise:%d \n\r", rise);
//serial.printf("test_1:%d \n\r", test_1);
// serial.printf("test_2:%d \n\r", test_2);
// serial.printf("rise:%d \n\r", rise);
//serial.printf("rise_2:%d \n\r", rise_2);
//serial.printf("%.2f \n\r",ADCdata);
//serial.printf("fall:%d \n\r", fall);
if (serial.writeable())
{
serial.printf("capturedata:%d \n\r", capturedata);
serial.printf("fall:%f \n\r", rise);
serial.printf("fall:%f \n\r", fall);
serial.printf("i_1:%.8f \n\r\n", i_1);
serial.printf("i:%.8f \n\r\n", ((i_1/48003280)*1000000));
}
// serial.printf("j:%.8f \n\r\n", ((j_1/48003280)*1000000));
// serial.printf("i+j:%.8f \n\r\n", m_1);
NVIC_EnableIRQ(TIMER_32_0_IRQn);
NVIC_EnableIRQ(TIMER_32_1_IRQn);
LPC_CT16B0->IR |= CT16B0_IR_MR0INT;
return;
}