This library provides a class to generate differents signale wave form. Note that the maximum update rate of 1 MHz, so Fmax = 1MHz / _num_pixels (see UM10360 - Chapter 30: LPC17xx Digital-to-Analog Converter (DAC).

SignalGenerator.h

Committer:
Yann
Date:
2010-11-22
Revision:
1:d6cbee8595e0
Parent:
0:40051400cafe

File content as of revision 1:d6cbee8595e0:

/* mbed signal generator implementation using LPC1768 DAC
 * Copyright (c) 2010 ygarcia
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

#if !defined(__SIGNALGERNERATOR_H__)
#define __SIGNALGERNERATOR_H__

#include "Debug.h"

/** This class provides methods to generate differents signale wave form. V0.0.0.2
 *
 * Note that the maximum update rate of 1 MHz, so Fmax = 1MHz / _num_pixels
 *
 * Note that Vout is given by the relation below (UM10360 - Table 537. D/A Pin Description):
 *    Vout = VALUE * ((Vrefp - Vrefn) / 1024) + Vrefn
 *    in which:
 *        - Vrefp: tied to VDD (e.g. 3.3V)
 *        - Vrefn: tied to Vss
 * @see UM10360 - Chapter 30: LPC17xx Digital-to-Analog Converter (DAC)
 * @remark This class was validated with Tektronix TDS2014 oscilloscope
 * @author Yann Garcia (Don't hesitate to contact me: garcia.yann@gmail.com)
 * References:
 * - http://fabrice.sincere.pagesperso-orange.fr/cm_electronique/projet_pic/gbf/gbf.htm
 * @todo 1) Enhance comments 2) Add support of user-defined signal in byte array format
 */
class SignalGenerator
{
public:
    /** List of supported signals
     */
    enum SignalGeneratorType {
        SquareSignal = 0, //<! Square signal (50% duty cycle)
        TriangleSignal = 1, //<! Triangle signal
        SawtoothSignal = 2, //<! Sawtooth signal
        ReverseSawtoothSignal = 3, //<! Reversed sawtooth signal
        SinusSignal = 4 //<! Sinusoidal signal
    }; // End of SignalGeneratorType enum
public:
    /** Default ctor
     *
     * Initialize the internal datas. Default values are:
     * - signal type: SquareSignal
     * - frequency: 1000Hz
     * - # of pixels is fixed, _twait is adjusted
     * 
     * @param p_outPort: Pin name of the Analog out port (e.g. p18 for LPC1768)
     */
    SignalGenerator(PinName p_outPort);
    /** Default dtor
     *
     * Free resources
     */
    virtual ~SignalGenerator();
    
    /** Set the frequency of the signal.
     *
     * @param p_signalType: Signal type. Default value is square signal
     * @param p_frequency: Signal frequency. Default value is 1000Hz
     * @param p_num_pixels: Number of pixels ber period. Default value is 64
     * @see UM10360 - Chapter 30: LPC17xx Digital-to-Analog Converter (DAC)
     * @code
     * // Prepare a sinus signal at 500Hz
     * signal.SetSignalFrequency(SignalGenerator::SinusSignal,500);
     * // Launch execution
     * signal.BeginRunAsync();
     * // Here signal generation is running. Use Led or oscilloscope to vizualize output
     * printf("Press any key to terminate");
     * getchar();
     * // Terminate execution
     * signal.EndRunAsync();
     * @endcode
     */
    void SetSignalFrequency(SignalGenerator::SignalGeneratorType p_signalType = SignalGenerator::SquareSignal, int p_frequency = 1000, int p_num_pixels = 64);
    /** Generate the signal in synchrnous mode
     *
     * @see Stop() method
     */
    void Run();
    /** Method called to terminate synchronous running mode
     */
    void Stop();
    /** Method called to prepare an asynchronous running mode
     *
     * @return 0 on success, -1 if _twait less that 7us. On error, you shall use synchronous method
     */
    int BeginRunAsync();
    /** Method called to launch the asynchronous running mode
     */
    void RunAsync();
    /** Method called to terminate asynchronous running mode
     */
    void EndRunAsync();

    SignalGenerator& operator =(const bool& p_mode);
    SignalGenerator& operator =(const int& p_frequency);
    SignalGenerator& operator =(const SignalGenerator::SignalGeneratorType& p_signalType);
private:
    /** Set the signal type to generate and build the lookup table according to the signal frequency.
     */
    void PrepareSignal();
    /** Build the lookup table for a square signal according to the signal frequency.
     *
     * Note that the duty cycle is 50%. For different values, please refer to PwmOut class
     */
    void PrepareSquareSignal();
    /** Build the lookup table for a triangle signal according to the signal frequency.
     */
    void PrepareTriangleSignal();
    /** Build the lookup table for a reverse sawtooth signal according to the signal frequency.
     */
    void PrepareSawtoothSignal();
    /** Build the lookup table for a sawtooth sinal according to the signal frequency.
     */
    void PrepareReverseSawtoothSignal();
    /** Build the lookup table for a 'sinus' sinal according to the signal frequency.
     */
    void PrepareSinusSignal();
private:
   SignalGenerator::SignalGeneratorType _signalType; //<! Signal selected - Default value is SquareSignal
   int _frequency; // Required frequency of the signal
   float *_values; //<! Pointer to the array of calculated values for the selected signal
   int _num_pixels; // <! Number of calculated points, this is the _values length
   float _twait; //<! Time between each changes of the analog output
   bool _mode; //<! # of pixels is fixed (128 pixels)
   AnalogOut _out; //<! Analog out pin of the LPC1768
   bool _stop; //<! Set to tru to stop the signal generation
   int _asynckCounter; //<! Index on _values when asynchronous run is used
   Ticker _asyncTicker; //<! Ticker to ipdate DAC when asynchronous run is used
   DigitalOut _debugLed; //<! For debug with oscilloscope purpose
}; // End of class SignalGenerator
  
#endif // __SIGNALGERNERATOR_H__