Provides a simple way to generate complex square wave signals on any available pin. In addition the SignalGenerator can generate a carrier wave which is useful when generating IR signals to control electronic devices like a TV etc. The signal generation can be carried out either synchronously or asynchronously. In the case of synchronous signal generation all interrupts can optionally be disabled to improve timing accuracy.

SignalGenerator.cpp

Committer:
taylorza
Date:
2014-09-12
Revision:
0:b7c65c0d82d3
Child:
1:4a1bcc41c473

File content as of revision 0:b7c65c0d82d3:

#include "mbed.h"
#include "SignalGenerator.h"

SignalGenerator::SignalGenerator(PinName pin) : _pin(pin)
{
    _pin = 0;
}
          
void SignalGenerator::set(bool pinState)
{
    _pin = pinState ? 1 : 0;
}

void SignalGenerator::set(bool initialState, uint32_t timingBuffer[], uint16_t bufferCount, uint32_t lastStateHoldTime, int carrierFrequency)
{
    uint32_t carrierHalfPeriod = 0;

    if (carrierFrequency > 0)
    {
        carrierHalfPeriod = (uint32_t)(500000 / carrierFrequency);
        
        bool state = initialState;
        for(uint16_t i = 0; i < bufferCount; i++)
        {
            int c = (int)((double)timingBuffer[i] / carrierHalfPeriod);
            if (!state)
            {
                wait_us(timingBuffer[i]);
            }
            else
            {
                for(int j = 0; j < c; j += 2)
                {
                    _pin = 1;
                    wait_us(carrierHalfPeriod);
                    _pin = 0;
                    wait_us(carrierHalfPeriod);
                }
            }
            state = !state;          
        }
         
        if (lastStateHoldTime > 0)
        {
            int c = (int)((double)lastStateHoldTime / carrierHalfPeriod);
            if (!state)
            {
                wait_us(lastStateHoldTime);
            }
            else
            {
                for(int j = 0; j < c; j += 2)
                {
                    _pin = 1;
                    wait_us(carrierHalfPeriod);
                    _pin = 0;
                    wait_us(carrierHalfPeriod);
                }
            }
        }                
    }
    else
    {
        set(initialState);
        for(uint16_t i = 0; i < bufferCount; ++i)
        {
            wait_us(timingBuffer[i]);
            _pin = !_pin;
        }
        
        if (lastStateHoldTime > 0)
        {
            wait_us(lastStateHoldTime);
        }
    }  
}