init

Dependencies:   mbed

Committer:
Nathan Yonkee
Date:
Fri Mar 02 07:16:49 2018 -0700
Revision:
10:46a4cf51ee38
Parent:
8:6c2a12d6b1bf
remove mbed-os

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Nathan Yonkee 8:6c2a12d6b1bf 1 #include "mbed.h"
Nathan Yonkee 8:6c2a12d6b1bf 2 #include "analogout_api.h"
Nathan Yonkee 8:6c2a12d6b1bf 3 #include "mbed-os/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_ll_dac.h"
Nathan Yonkee 8:6c2a12d6b1bf 4
Nathan Yonkee 8:6c2a12d6b1bf 5 #if !DEVICE_ANALOGOUT
Nathan Yonkee 8:6c2a12d6b1bf 6 #error You cannot use this example as the AnalogOut is not supported on this device.
Nathan Yonkee 8:6c2a12d6b1bf 7 #else
Nathan Yonkee 8:6c2a12d6b1bf 8 AnalogOut sinOut( PA_4 ); // channel 1
Nathan Yonkee 8:6c2a12d6b1bf 9 #endif
Nathan Yonkee 8:6c2a12d6b1bf 10
Nathan Yonkee 8:6c2a12d6b1bf 11 #define PI (3.141592653589793238462f)
Nathan Yonkee 8:6c2a12d6b1bf 12 #define AMPLITUDE (0.3) // x * 3.3V
Nathan Yonkee 8:6c2a12d6b1bf 13 #define PHASE (PI * 1.0f) // 2*pi is one period
Nathan Yonkee 8:6c2a12d6b1bf 14 #define OFFSET (0.5f)
Nathan Yonkee 8:6c2a12d6b1bf 15
Nathan Yonkee 8:6c2a12d6b1bf 16 // Configuration for sinewave output
Nathan Yonkee 8:6c2a12d6b1bf 17 /* #define BUFFER_SIZE (540U) */
Nathan Yonkee 8:6c2a12d6b1bf 18 #define BUFFER_SIZE (1024U)
Nathan Yonkee 8:6c2a12d6b1bf 19 unsigned int buffer[BUFFER_SIZE];
Nathan Yonkee 8:6c2a12d6b1bf 20
Nathan Yonkee 8:6c2a12d6b1bf 21 void calculate_sinewave( void );
Nathan Yonkee 8:6c2a12d6b1bf 22
Nathan Yonkee 8:6c2a12d6b1bf 23 int main()
Nathan Yonkee 8:6c2a12d6b1bf 24 {
Nathan Yonkee 8:6c2a12d6b1bf 25 calculate_sinewave();
Nathan Yonkee 8:6c2a12d6b1bf 26
Nathan Yonkee 8:6c2a12d6b1bf 27 const int stepBuffN = 12;
Nathan Yonkee 8:6c2a12d6b1bf 28 float stepBuff[stepBuffN] = {};
Nathan Yonkee 8:6c2a12d6b1bf 29 AnalogOut stepOut( PA_5 );
Nathan Yonkee 8:6c2a12d6b1bf 30
Nathan Yonkee 8:6c2a12d6b1bf 31 for( int i = 0; i < stepBuffN; i += 3 )
Nathan Yonkee 8:6c2a12d6b1bf 32 {
Nathan Yonkee 8:6c2a12d6b1bf 33 stepBuff[i] = 3.0f / 3.3f;
Nathan Yonkee 8:6c2a12d6b1bf 34 stepBuff[i + 1] = 2.0f / 3.3f;
Nathan Yonkee 8:6c2a12d6b1bf 35 stepBuff[i + 2] = 1.0f / 3.3f;
Nathan Yonkee 8:6c2a12d6b1bf 36 };
Nathan Yonkee 8:6c2a12d6b1bf 37
Nathan Yonkee 8:6c2a12d6b1bf 38 stepOut = stepBuff[0];
Nathan Yonkee 8:6c2a12d6b1bf 39
Nathan Yonkee 8:6c2a12d6b1bf 40 core_util_critical_section_enter();
Nathan Yonkee 8:6c2a12d6b1bf 41
Nathan Yonkee 8:6c2a12d6b1bf 42 HAL_SuspendTick();
Nathan Yonkee 8:6c2a12d6b1bf 43
Nathan Yonkee 8:6c2a12d6b1bf 44 core_util_critical_section_exit();
Nathan Yonkee 8:6c2a12d6b1bf 45
Nathan Yonkee 8:6c2a12d6b1bf 46 dac_t* obj = &sinOut._dac;
Nathan Yonkee 8:6c2a12d6b1bf 47
Nathan Yonkee 8:6c2a12d6b1bf 48 DAC_HandleTypeDef dacHandle = obj->handle;
Nathan Yonkee 8:6c2a12d6b1bf 49
Nathan Yonkee 8:6c2a12d6b1bf 50 uint32_t dacChannel = obj->channel;
Nathan Yonkee 8:6c2a12d6b1bf 51
Nathan Yonkee 8:6c2a12d6b1bf 52 for( unsigned int i = 0; i < BUFFER_SIZE; i++ )
Nathan Yonkee 8:6c2a12d6b1bf 53 {
Nathan Yonkee 8:6c2a12d6b1bf 54 buffer[i] *= 0xFFF;
Nathan Yonkee 8:6c2a12d6b1bf 55 }
Nathan Yonkee 8:6c2a12d6b1bf 56
Nathan Yonkee 8:6c2a12d6b1bf 57 while( 1 )
Nathan Yonkee 8:6c2a12d6b1bf 58 {
Nathan Yonkee 8:6c2a12d6b1bf 59 // sinewave output
Nathan Yonkee 8:6c2a12d6b1bf 60
Nathan Yonkee 8:6c2a12d6b1bf 61 for( int i = 0; i < BUFFER_SIZE; ++i )
Nathan Yonkee 8:6c2a12d6b1bf 62 {
Nathan Yonkee 8:6c2a12d6b1bf 63 HAL_DAC_SetValue( &dacHandle, dacChannel, DAC_ALIGN_12B_R, buffer[i] );
Nathan Yonkee 8:6c2a12d6b1bf 64 HAL_DAC_Start( &dacHandle, dacChannel );
Nathan Yonkee 8:6c2a12d6b1bf 65 }
Nathan Yonkee 8:6c2a12d6b1bf 66 }
Nathan Yonkee 8:6c2a12d6b1bf 67 }
Nathan Yonkee 8:6c2a12d6b1bf 68
Nathan Yonkee 8:6c2a12d6b1bf 69 // Create the sinewave buffer
Nathan Yonkee 8:6c2a12d6b1bf 70 void calculate_sinewave( void )
Nathan Yonkee 8:6c2a12d6b1bf 71 {
Nathan Yonkee 8:6c2a12d6b1bf 72 for( unsigned int i = 0; i < BUFFER_SIZE; i++ )
Nathan Yonkee 8:6c2a12d6b1bf 73 {
Nathan Yonkee 8:6c2a12d6b1bf 74 float rads = 2.0f * ( PI * i ) / ( ( float )BUFFER_SIZE ); // Convert degree in radian
Nathan Yonkee 8:6c2a12d6b1bf 75 buffer[i] = ( unsigned int )( 0xFFF * AMPLITUDE * cos( rads + PHASE ) + 0xFFF * OFFSET );
Nathan Yonkee 8:6c2a12d6b1bf 76 }
Nathan Yonkee 8:6c2a12d6b1bf 77 }