Nucleo-F767 DCO Test 01

Dependencies:   mbed

Committer:
ryood
Date:
Mon Jul 23 17:34:47 2018 +0000
Revision:
2:4834d4483ea6
Parent:
1:4fc93890f58e
Child:
3:19bb7c30c354
use the 32k wave table

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ryood 0:000c6506ff90 1 /*
ryood 0:000c6506ff90 2 Nucleo F767 DCO
ryood 0:000c6506ff90 3 2018.07.22
ryood 0:000c6506ff90 4
ryood 0:000c6506ff90 5 */
ryood 0:000c6506ff90 6 #include "mbed.h"
ryood 0:000c6506ff90 7
ryood 2:4834d4483ea6 8 #include "wavetable_12bit_32k.h"
ryood 2:4834d4483ea6 9 #define COUNT_OF_ENTRIES (32768)
ryood 0:000c6506ff90 10
ryood 0:000c6506ff90 11 #define PIN_CHECK (1)
ryood 0:000c6506ff90 12 #define UART_TRACE (0)
ryood 0:000c6506ff90 13 #define TITLE_STR1 ("Nucleo F767 DCO")
ryood 0:000c6506ff90 14 #define TITLE_STR2 ("20180724")
ryood 0:000c6506ff90 15
ryood 0:000c6506ff90 16 // Pin Assign
ryood 0:000c6506ff90 17 AnalogOut Dac1(PA_4);
ryood 0:000c6506ff90 18 AnalogOut Dac2(PA_5);
ryood 0:000c6506ff90 19
ryood 0:000c6506ff90 20 #if (PIN_CHECK)
ryood 0:000c6506ff90 21 DigitalOut CheckPin(D4);
ryood 0:000c6506ff90 22 #endif
ryood 0:000c6506ff90 23
ryood 0:000c6506ff90 24 // Parameter
ryood 1:4fc93890f58e 25 double drate = 1000.0; // initial output rate (Hz)
ryood 1:4fc93890f58e 26 const double refclk = 200000; // Hz
ryood 0:000c6506ff90 27
ryood 0:000c6506ff90 28 // Interruput
ryood 0:000c6506ff90 29 Ticker ticker;
ryood 0:000c6506ff90 30
ryood 0:000c6506ff90 31 // DDS
ryood 0:000c6506ff90 32 volatile uint32_t phaccu;
ryood 0:000c6506ff90 33 volatile uint32_t tword_m;
ryood 0:000c6506ff90 34
ryood 0:000c6506ff90 35 //-------------------------------------------------------------------------------------------------
ryood 0:000c6506ff90 36 // Interrupt Service Routine
ryood 0:000c6506ff90 37 //
ryood 0:000c6506ff90 38
ryood 0:000c6506ff90 39 // param
ryood 0:000c6506ff90 40 // val: 0 .. 4095
ryood 0:000c6506ff90 41 void InternalDacWrite(uint16_t val)
ryood 0:000c6506ff90 42 {
ryood 0:000c6506ff90 43 // avoid distortion of built-in DAC
ryood 0:000c6506ff90 44 uint16_t v = ((val + 1024) << 3);
ryood 0:000c6506ff90 45
ryood 0:000c6506ff90 46 Dac2.write_u16(v);
ryood 0:000c6506ff90 47 }
ryood 0:000c6506ff90 48
ryood 0:000c6506ff90 49 void update()
ryood 0:000c6506ff90 50 {
ryood 0:000c6506ff90 51 #if (PIN_CHECK)
ryood 0:000c6506ff90 52 CheckPin.write(1);
ryood 0:000c6506ff90 53 #endif
ryood 0:000c6506ff90 54
ryood 0:000c6506ff90 55 phaccu = phaccu + tword_m;
ryood 2:4834d4483ea6 56 uint16_t idx = phaccu >> 17; // use upper 15 bits
ryood 0:000c6506ff90 57
ryood 2:4834d4483ea6 58 InternalDacWrite(sin_12bit_32k[idx]);
ryood 0:000c6506ff90 59
ryood 0:000c6506ff90 60 #if (PIN_CHECK)
ryood 0:000c6506ff90 61 CheckPin.write(0);
ryood 0:000c6506ff90 62 #endif
ryood 0:000c6506ff90 63 }
ryood 0:000c6506ff90 64
ryood 0:000c6506ff90 65 //-------------------------------------------------------------------------------------------------
ryood 0:000c6506ff90 66 // Main routine
ryood 0:000c6506ff90 67 //
ryood 0:000c6506ff90 68
ryood 0:000c6506ff90 69 int main()
ryood 0:000c6506ff90 70 {
ryood 0:000c6506ff90 71 tword_m = pow(2.0, 32) * drate / refclk; // calculate DDS tuning word;
ryood 0:000c6506ff90 72
ryood 0:000c6506ff90 73 float interruptPeriodUs = 1000000.0 / refclk;
ryood 0:000c6506ff90 74 ticker.attach_us(&update, interruptPeriodUs);
ryood 0:000c6506ff90 75
ryood 0:000c6506ff90 76 while (1) {
ryood 0:000c6506ff90 77 }
ryood 0:000c6506ff90 78 }
ryood 0:000c6506ff90 79