Generate sine waves with 2 mbeds synchronised. Configurable amplitude and phase. Built for 50 Hz mains simulations.

Dependencies:   MODDMA mbed

Description

Small program based on the MODDMA buffered sine wave example.

This programs reads pin 22 to operate in Master (low) or Slave mode. Then configures pin 21 as output (master) or input (slave), in master mode led2 is on. Use a resistor (100 ohm) between the pin21's of master to slave.

The program then calculates a buffer of sine waves for the DMA with parameters given. And starts the DMA and DAC to generate the sine.

On the callbacks of the dma complete (there are 2) slave waits for a sync and master gives a sync, p21. Master waits a few extra clocks to make sure slave is ready.

Commands can be given over Serial port to modify the parameters on the run. Frequency can be changed for master and slave, but it is better to keep the same. Use "f xx.xx". Phase can be changed for master and slave Amplitude can be changed for master and slave.

Hookup

  • Wire p22 high or low.
  • Serial sr(p9,p10) from master to slave.
  • Wire trigger p21 to p21.
  • Output p18 (analogout)

Information

Do not forget a small RC filter on the DAC output.

Master Commands

<master/slave/frequency> <frequency/phase/amplitude> <space> <number> <line feed>

Example commands for serial:

  • master frequency 50.1 hz
    • mf 50.1\n
  • frequency 50.1 Hz
    • f 50.1\n
  • master phase 3.1415 (or 1.0)
    • mp 1\n
  • slave phase 1.5 pi
    • sp 1.5\n

Or use this GUI

https://dl.dropboxusercontent.com/s/uvwsroyu41vzkwg/2013-06-19%2010_35_52-WaveSim.png

Download, or Download C# Code (Visual Studio 2010)

Committer:
jeroen3
Date:
Wed Jun 19 08:30:39 2013 +0000
Revision:
3:67b9a01ad7b0
Parent:
2:edd6401d9aa0
Updated;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jeroen3 2:edd6401d9aa0 1
jeroen3 2:edd6401d9aa0 2 /**
jeroen3 2:edd6401d9aa0 3 * @file xifo.h
jeroen3 2:edd6401d9aa0 4 * @brief xifo circular buffer
jeroen3 2:edd6401d9aa0 5 * @details xifo supplies object oriented circular buffer with 32 bit size elements. \n
jeroen3 2:edd6401d9aa0 6 * To use either as FIFO (First In First Out) or as FILO (First In Last Out)
jeroen3 2:edd6401d9aa0 7 *
jeroen3 2:edd6401d9aa0 8 * @author Jeroen Lodder
jeroen3 2:edd6401d9aa0 9 * @date April 2013
jeroen3 2:edd6401d9aa0 10 * @version 2
jeroen3 2:edd6401d9aa0 11 *
jeroen3 2:edd6401d9aa0 12 * @{
jeroen3 2:edd6401d9aa0 13 */
jeroen3 2:edd6401d9aa0 14
jeroen3 2:edd6401d9aa0 15 /**
jeroen3 2:edd6401d9aa0 16 * Code has been tested on Cortex M0 (LPC1114)
jeroen3 2:edd6401d9aa0 17 * Performance table, number of core clocks
jeroen3 2:edd6401d9aa0 18 * Measured with a timer before and after
jeroen3 2:edd6401d9aa0 19 * r1 = timer->TC
jeroen3 2:edd6401d9aa0 20 * test_function
jeroen3 2:edd6401d9aa0 21 * r2 = timer->TC
jeroen3 2:edd6401d9aa0 22 *
jeroen3 2:edd6401d9aa0 23 * Function Speed Worst Case
jeroen3 2:edd6401d9aa0 24 *
jeroen3 2:edd6401d9aa0 25 * write 69 71
jeroen3 2:edd6401d9aa0 26 * read_mr 59 59
jeroen3 2:edd6401d9aa0 27 * read_lr 63 70
jeroen3 2:edd6401d9aa0 28 * pop_mr 76 78
jeroen3 2:edd6401d9aa0 29 * pop_lr 45 45
jeroen3 2:edd6401d9aa0 30 *
jeroen3 2:edd6401d9aa0 31 */
jeroen3 2:edd6401d9aa0 32
jeroen3 2:edd6401d9aa0 33 #ifndef _xifo_H_
jeroen3 2:edd6401d9aa0 34 #define _xifo_H_
jeroen3 2:edd6401d9aa0 35
jeroen3 2:edd6401d9aa0 36 #include <inttypes.h>
jeroen3 2:edd6401d9aa0 37
jeroen3 2:edd6401d9aa0 38 #if defined(__arm__) || defined(__DOXYGEN__)
jeroen3 2:edd6401d9aa0 39 #pragma anon_unions /**< Allow unnamed unions */
jeroen3 2:edd6401d9aa0 40 #endif
jeroen3 2:edd6401d9aa0 41
jeroen3 2:edd6401d9aa0 42 /**
jeroen3 2:edd6401d9aa0 43 * @brief Circular Buffer object.
jeroen3 2:edd6401d9aa0 44 * @details This struct holds the object of a circular buffer
jeroen3 2:edd6401d9aa0 45 */
jeroen3 2:edd6401d9aa0 46 typedef struct {
jeroen3 2:edd6401d9aa0 47 /* Pointers: */
jeroen3 2:edd6401d9aa0 48 uint32_t *startpool; /**< @brief First element in pool */
jeroen3 2:edd6401d9aa0 49 uint32_t *endpool; /**< @brief Last element in pool */
jeroen3 2:edd6401d9aa0 50 uint32_t *read; /**< @brief Read pointer */
jeroen3 2:edd6401d9aa0 51 uint32_t *write; /**< @brief Write pointer */
jeroen3 2:edd6401d9aa0 52 /* Variables: */
jeroen3 2:edd6401d9aa0 53 uint32_t full; /**< @brief Flag indicating buffer is full */
jeroen3 2:edd6401d9aa0 54 uint32_t elementcount;/**< @brief Number of elements used */
jeroen3 2:edd6401d9aa0 55 uint32_t size; /**< @brief Size of buffer */
jeroen3 2:edd6401d9aa0 56 /* Locally used in functions to prevent stack use: */
jeroen3 2:edd6401d9aa0 57 /**< @brief union to prevent lvalue typecasting */
jeroen3 2:edd6401d9aa0 58 union {
jeroen3 2:edd6401d9aa0 59 uint32_t temp; /**< @brief temp variable and padding for even sized block */
jeroen3 2:edd6401d9aa0 60 uint32_t *ptemp; /**< @brief temp variable and padding for even sized block */
jeroen3 2:edd6401d9aa0 61 };
jeroen3 2:edd6401d9aa0 62 }xifo_t;
jeroen3 2:edd6401d9aa0 63
jeroen3 2:edd6401d9aa0 64 /**
jeroen3 2:edd6401d9aa0 65 * @brief Circular Buffer memory pool type.
jeroen3 2:edd6401d9aa0 66 */
jeroen3 2:edd6401d9aa0 67 typedef unsigned int xifo_pool_t;
jeroen3 2:edd6401d9aa0 68
jeroen3 2:edd6401d9aa0 69 #ifdef __cplusplus
jeroen3 2:edd6401d9aa0 70 extern "C" {
jeroen3 2:edd6401d9aa0 71 #endif
jeroen3 2:edd6401d9aa0 72 /* xifo Common */
jeroen3 2:edd6401d9aa0 73 void xifo_init(xifo_t *c, uint32_t size, uint32_t *startpool);
jeroen3 2:edd6401d9aa0 74 void xifo_clear(xifo_t *c);
jeroen3 2:edd6401d9aa0 75 uint32_t xifo_write(xifo_t *c, uint32_t data);
jeroen3 2:edd6401d9aa0 76 /* FIFO use */
jeroen3 2:edd6401d9aa0 77 uint32_t xifo_read_lr(xifo_t *c, uint32_t index);
jeroen3 2:edd6401d9aa0 78 uint32_t xifo_pop_lr(xifo_t *c);
jeroen3 2:edd6401d9aa0 79 /* LIFO use */
jeroen3 2:edd6401d9aa0 80 uint32_t xifo_read_mr(xifo_t *c, uint32_t index);
jeroen3 2:edd6401d9aa0 81 uint32_t xifo_pop_mr(xifo_t *c);
jeroen3 2:edd6401d9aa0 82 /* Extractors */
jeroen3 2:edd6401d9aa0 83 uint32_t xifo_get_size(xifo_t *c);
jeroen3 2:edd6401d9aa0 84 uint32_t xifo_get_used(xifo_t *c);
jeroen3 2:edd6401d9aa0 85 uint32_t xifo_get_full(xifo_t *c);
jeroen3 2:edd6401d9aa0 86 uint32_t xifo_get_free(xifo_t *c);
jeroen3 2:edd6401d9aa0 87 #ifdef __cplusplus
jeroen3 2:edd6401d9aa0 88 }
jeroen3 2:edd6401d9aa0 89 #endif
jeroen3 2:edd6401d9aa0 90 #endif //_xifo_H_
jeroen3 2:edd6401d9aa0 91
jeroen3 2:edd6401d9aa0 92 /** @} */