main.c 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. /* DriverLib Includes */
  2. #include <ti/devices/msp432p4xx/driverlib/driverlib.h>
  3. /* Standard Includes */
  4. #include <stdint.h>
  5. #include <math.h>
  6. #include <descrambler.h>
  7. #define SINE_SIZE 50
  8. #define FS 50000
  9. // Coefficients for bandstop filter
  10. //const double B1[] = {0.7755, -2.5985, 6.3671, -9.6188, 11.5650, -9.6188, 6.3671, -2.5985, 0.7755};
  11. //const double A1[] = {1.0000, -3.1835, 7.4065, -10.6464, 12.1861, -9.6677, 6.1083, -2.3849, 0.6809};
  12. const float B1[] = {0.9208, 0.1952, 0.9208};
  13. const float A1[] = {1.0000, 0.1952, 0.8415};
  14. //const float A1[] = {1.0000, -1.0457, 0.9510};
  15. const float A2[] = {1.0000, -1.5610, 0.6414};
  16. // Coefficients for lowpass filter
  17. //const float B2[] = {0.0000, 0.0001, 0.0005, 0.0025, 0.0093, 0.0260, 0.0564, 0.0967, 0.1330, 0.1477, 0.1330, 0.0967, 0.0564, 0.0260, 0.0093, 0.0025, 0.0005, 0.0001, 0.0000};
  18. //const float A2[] = {0.0001, -0.0014, 0.0096, -0.0423, 0.1340, -0.3250, 0.6243, -0.9708, 1.2386, -1.3057, 1.1399, -0.8221, 0.4862, -0.2326, 0.0881, -0.0255, 0.0053, -0.0007, 0.0000};
  19. // Time delays for both filters
  20. static float Z1[2][3];
  21. static float Z2[2][3];
  22. float sine[SINE_SIZE];
  23. unsigned int sine_index = 0;
  24. int main(void){
  25. /* Halting the Watchdog */
  26. MAP_WDT_A_holdTimer();
  27. for(;sine_index<=SINE_SIZE;sine_index++){
  28. // sine[sine_index] = 2.0 * sin(6.2831853071795862 * 7000.0 * sine_index * 20e-6);
  29. // sine[sine_index] = 1024 * sin(sine_index * 1.4661); // for 30kHz sampling
  30. sine[sine_index] = (1+sin(sine_index * 0.8796f))/2.0f;
  31. // sine[sine_index] = sin(6.2831853071795862 * 7000 * sine_index * 20e-6);
  32. }/* Fill sine array */
  33. //![Simple CS Config]
  34. /* Configuring pins for peripheral/crystal usage */
  35. MAP_GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_PJ, GPIO_PIN3 | GPIO_PIN2, GPIO_PRIMARY_MODULE_FUNCTION);
  36. /* Configure P5.6 and P5.7 to their analogue functions to output VREF */
  37. P5SEL0 |= BIT6 | BIT7;
  38. P5SEL1 |= BIT6 | BIT7;
  39. REFCTL0 |= REFON; // Turn on reference module
  40. REFCTL0 |= REFOUT; // Output reference voltage to a pin
  41. /* Output VREF = 1.2V */
  42. REFCTL0 &= ~(REFVSEL_3); // Clear existing VREF voltage level setting
  43. REFCTL0 |= REFVSEL_0; // Set VREF = 1.2V
  44. while (REFCTL0 & REFGENBUSY); // Wait until the reference generation is settled
  45. /* Configuring pins for HFXT crystal */
  46. MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_PJ,
  47. GPIO_PIN2 | GPIO_PIN3, GPIO_PRIMARY_MODULE_FUNCTION);
  48. /* Set P6.0 as output */
  49. MAP_GPIO_setAsOutputPin(GPIO_PORT_P6, GPIO_PIN0);
  50. /* Set all 8 pins of P4 as output */
  51. MAP_GPIO_setAsOutputPin(GPIO_PORT_P4, GPIO_PIN0 | GPIO_PIN1 | GPIO_PIN2 | GPIO_PIN3 | GPIO_PIN4 | GPIO_PIN5 | GPIO_PIN6 | GPIO_PIN7);
  52. /* Configuring GPIOs (4.3 MCLK) */
  53. // MAP_GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P4, GPIO_PIN3, GPIO_PRIMARY_MODULE_FUNCTION);
  54. /* Setting the external clock frequency. This API is optional, but will
  55. * come in handy if the user ever wants to use the getMCLK/getACLK/etc
  56. * functions
  57. */
  58. CS_setExternalClockSourceFrequency(32000,48000000);
  59. /* Starting HFXT in non-bypass mode without a timeout. Before we start
  60. * we have to change VCORE to 1 to support the 48MHz frequency */
  61. MAP_PCM_setCoreVoltageLevel(PCM_VCORE1);
  62. MAP_FlashCtl_setWaitState(FLASH_BANK0, 2);
  63. MAP_FlashCtl_setWaitState(FLASH_BANK1, 2);
  64. CS_startHFXT(false);
  65. /* Initialising MCLK to HFXT (effectively 48MHz) */
  66. MAP_CS_initClockSignal(CS_MCLK, CS_HFXTCLK_SELECT, CS_CLOCK_DIVIDER_1);
  67. /* Set SysTick to 48MHz/1200=40kHz*/
  68. MAP_SysTick_enableModule();
  69. MAP_SysTick_setPeriod(960); // 960 for 50kHz
  70. MAP_Interrupt_enableSleepOnIsrExit();
  71. MAP_SysTick_enableInterrupt();
  72. /* Initialising ADC (MCLK/1//1) */
  73. MAP_ADC14_enableModule();
  74. MAP_ADC14_initModule(ADC_CLOCKSOURCE_MCLK, ADC_PREDIVIDER_1, ADC_DIVIDER_1, 0);
  75. /* Configuring GPIOs (P5.0 (A5) as the ADC input pin) */
  76. MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5, GPIO_PIN0, GPIO_TERTIARY_MODULE_FUNCTION);
  77. /* Configure ADC Resolution */
  78. ADC14_setResolution(ADC_10BIT);
  79. /* Configuring ADC Memory */
  80. MAP_ADC14_configureSingleSampleMode(ADC_MEM0, true);
  81. MAP_ADC14_configureConversionMemory(ADC_MEM0, ADC_VREFPOS_INTBUF_VREFNEG_VSS, ADC_INPUT_A5, false);
  82. /* Configuring Sample Timer */
  83. MAP_ADC14_enableSampleTimer(ADC_MANUAL_ITERATION);
  84. /* Enabling MASTER interrupts */
  85. MAP_Interrupt_enableMaster();
  86. while (1){
  87. //MAP_PCM_gotoLPM0();
  88. }
  89. }
  90. float bandstop_filter(float value){
  91. // Z1[0] = Z1[1];
  92. // Z1[], Z1[2], value};
  93. // Z2[] = {Z2[1], Z2[2], (Z1[0] + Z1[2]) - 1.080f * Z1[1] + (-0.775f * Z2[1]) + ( 0.959f * Z2[2])};
  94. Z1[0][0] = Z1[0][1];
  95. Z1[0][1] = Z1[0][2];
  96. Z1[0][2] = value;
  97. Z1[1][0] = Z1[1][1];
  98. Z1[1][1] = Z1[1][2];
  99. // Z2[2] = (Z1[0] + Z1[2]) - 1.080f * Z1[1] + (-0.775f * Z2[0]) + ( 0.959f * Z2[1]);
  100. Z1[1][2] = (Z1[0][0] + Z1[0][2]) - A1[0] * Z1[0][1] + (-1*A1[1] * Z1[1][0]) + (A1[2] * Z1[1][1]);
  101. return Z1[1][2];
  102. }
  103. //float bandstop_filter2(float value){
  104. //// Z1[0] = Z1[1];
  105. //// Z1[], Z1[2], value};
  106. //// Z2[] = {Z2[1], Z2[2], (Z1[0] + Z1[2]) - 1.080f * Z1[1] + (-0.775f * Z2[1]) + ( 0.959f * Z2[2])};
  107. // Z2[0][0] = Z2[0][1];
  108. // Z2[0][1] = Z2[0][2];
  109. // Z2[0][2] = value;
  110. // Z2[1][0] = Z2[1][1];
  111. // Z2[1][1] = Z2[1][2];
  112. //// Z2[2] = (Z2[0] + Z2[2]) - 1.080f * Z2[1] + (-0.775f * Z2[0]) + ( 0.959f * Z2[1]);
  113. // Z2[1][2] = (Z2[0][0] + Z2[0][2]) - A2[0] * Z2[0][1] + (-1*A2[1] * Z2[1][0]) + (A2[2] * Z2[1][1]);
  114. // return Z2[1][2];
  115. //}
  116. float lowpass_filter(float value) {
  117. Z2[0][0] = Z2[0][1];
  118. Z2[0][1] = Z2[0][2];
  119. Z2[0][2] = value / 3.589405582f;
  120. Z2[1][0] = Z2[1][1];
  121. Z2[1][1] = Z2[1][2];
  122. // Z2[1][2] = (Z2[0][0] + Z2[0][2]) + 2 * Z2[0][1] + ( -0.4918122372 * Z2[1][0]) + ( 1.3072850288 * Z2[1][1]);;
  123. Z2[1][2] = (Z2[0][0] + Z2[0][2]) + 2 * Z2[0][1] + ( -0.5869195081f * Z2[1][0]) + ( 1.4754804436f * Z2[1][1]);
  124. // (Z2[0][0] + Z2[0][2]) - 1.4547966009f * Z2[0][1] + ( -0.2905268567f * Z2[1][0]) + ( 0.9387270423f * Z2[1][1]);
  125. return Z2[1][2];
  126. }
  127. void SysTick_Handler(void)
  128. {
  129. P6OUT |= BIT0;
  130. float buffer = ADC14_getResult(ADC_MEM0); //Get the conversion result.
  131. buffer = bandstop_filter(buffer);// * sine[sine_index];
  132. // buffer -= 512;
  133. buffer = buffer * sine[sine_index];
  134. // buffer += 512;
  135. buffer = lowpass_filter(buffer);
  136. // float buffer = 256*(1+sine[sine_index]);
  137. P4OUT = buffer / 4; //We do this because the ADC is set to use 10 bits but P2OUT is only 8 bits.
  138. /* calculating sine index */
  139. sine_index++;
  140. if (sine_index >= SINE_SIZE) sine_index = 0;
  141. /* Enabling/Toggling Conversion */
  142. MAP_ADC14_enableConversion();
  143. MAP_ADC14_toggleConversionTrigger();
  144. MAP_ADC14_toggleConversionTrigger();
  145. P6OUT &= ~BIT0;
  146. }
  147. void ADC14_IRQHandler(void)
  148. {
  149. uint64_t status = MAP_ADC14_getEnabledInterruptStatus();
  150. MAP_ADC14_clearInterruptFlag(status);
  151. }