Ultrasonic Audio File Player

Dependencies:   mbed

Fork of TAU_ZOOLOG_Chirp_Generator by Yossi_Students

Committer:
Arkadi
Date:
Sun Jul 15 10:36:59 2018 +0000
Revision:
27:2091f3f4b96b
Parent:
26:c07bf3beb241
minor freq adjustment

Who changed what in which revision?

UserRevisionLine numberNew contents of line
TauZoolog 3:25cd717ad782 1 /*
Arkadi 16:8274b4ad84ee 2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Arkadi 23:6dbd2d20697c 3 % Generate WAVE Signal - 25/04/2018 %
Arkadi 16:8274b4ad84ee 4 % Arkadi Rafalovich - % Arkadiraf@gmail.com %
Arkadi 16:8274b4ad84ee 5 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Arkadi 20:048516dc1015 6 % Updates:
Arkadi 20:048516dc1015 7 % Disable interrupt during chirp out, fixes systic interrupt delays at 1ms interval for 0.5 us
TauZoolog 3:25cd717ad782 8 Pinout:
TauZoolog 3:25cd717ad782 9 DAC -- PA_4 -- A2
TauZoolog 3:25cd717ad782 10
TauZoolog 3:25cd717ad782 11 I/O -- PA_5 -- D13 (Status LED, Condition)
TauZoolog 3:25cd717ad782 12 I/O -- PA_6 -- D12 (Toggle Pin, Loop Freq)
Arkadi 23:6dbd2d20697c 13 Analog PA_0 -- A0 (Potentiometer)
TauZoolog 3:25cd717ad782 14
TauZoolog 3:25cd717ad782 15 */
TauZoolog 3:25cd717ad782 16 #include "mbed.h"
Arkadi 23:6dbd2d20697c 17 #include "signal.h"
Arkadi 25:060831b7aadd 18 #define PULSE_RATE 10.0f // in HZ
Arkadi 21:7aa784deffc8 19 #define FREQ_POT_EN // Potentiometer to set PULSE Rate
Arkadi 26:c07bf3beb241 20 #define MIN_FREQ 0.1f //(HZ)
Arkadi 23:6dbd2d20697c 21 #define SAMPLE_RATE_375_KHZ // basic sample rate is 1Mhz, this mode adds delay in between sample to meet the audio sample rate
Arkadi 21:7aa784deffc8 22
Arkadi 21:7aa784deffc8 23 float pulseRate=PULSE_RATE;
Arkadi 16:8274b4ad84ee 24 // Serial over USB as input device
Arkadi 16:8274b4ad84ee 25 Serial pc(SERIAL_TX, SERIAL_RX);
TauZoolog 3:25cd717ad782 26
TauZoolog 3:25cd717ad782 27 // mbed variables, Settings
TauZoolog 3:25cd717ad782 28 AnalogOut out(PA_4);
Arkadi 21:7aa784deffc8 29 AnalogIn potFreq(A0);
Arkadi 21:7aa784deffc8 30 // Potentiometer analog INPUT
TauZoolog 3:25cd717ad782 31
Arkadi 4:85dbf3e4d432 32 // digital pins
Arkadi 4:85dbf3e4d432 33 DigitalOut led(LED1);
Arkadi 16:8274b4ad84ee 34 DigitalOut outPulse(PA_6); // Toggle pin, Loop Freq
TauZoolog 3:25cd717ad782 35
TauZoolog 3:25cd717ad782 36 // User Button as interrupt
Arkadi 16:8274b4ad84ee 37 DigitalIn mybutton(USER_BUTTON);
TauZoolog 3:25cd717ad782 38
Arkadi 16:8274b4ad84ee 39 //DAC declarations
TauZoolog 3:25cd717ad782 40 DAC_HandleTypeDef hdac1;
TauZoolog 3:25cd717ad782 41
TauZoolog 3:25cd717ad782 42 // Dac Register for direct method of setting DAC value`s
TauZoolog 3:25cd717ad782 43 __IO uint32_t Dac_Reg = 0;
TauZoolog 3:25cd717ad782 44
TauZoolog 3:25cd717ad782 45 // Variables
Arkadi 16:8274b4ad84ee 46 bool toggle_state=0;
Arkadi 8:4a9979fe0122 47
Arkadi 8:4a9979fe0122 48 // nop operation
TauZoolog 3:25cd717ad782 49 inline void NOP()
TauZoolog 3:25cd717ad782 50 {
TauZoolog 3:25cd717ad782 51 __ASM volatile ("nop"); // one tick operation, Use to adjust frequency by slowing down the proccess
TauZoolog 3:25cd717ad782 52 }
TauZoolog 3:25cd717ad782 53
Arkadi 16:8274b4ad84ee 54 /* DAC1 init function */
Arkadi 16:8274b4ad84ee 55 void DAC1_Init(void);
TauZoolog 3:25cd717ad782 56
TauZoolog 3:25cd717ad782 57 // Main procedure
Arkadi 4:85dbf3e4d432 58 int main()
Arkadi 4:85dbf3e4d432 59 {
Arkadi 4:85dbf3e4d432 60 DAC1_Init();
TauZoolog 3:25cd717ad782 61
Arkadi 4:85dbf3e4d432 62 HAL_DAC_Start(&hdac1, DAC_CHANNEL_1);
TauZoolog 3:25cd717ad782 63
Arkadi 4:85dbf3e4d432 64 // define Dac Register for direct method of setting DAC value`s
Arkadi 4:85dbf3e4d432 65 Dac_Reg = (uint32_t) (hdac1.Instance);
Arkadi 4:85dbf3e4d432 66 Dac_Reg += __HAL_DHR12R1_ALIGNEMENT(DAC_ALIGN_12B_R);
TauZoolog 3:25cd717ad782 67
Arkadi 16:8274b4ad84ee 68 // set outputs
Arkadi 12:e2b4a11ebe5a 69 outPulse.write(0);
Arkadi 16:8274b4ad84ee 70 led.write(0);
Arkadi 16:8274b4ad84ee 71 // Output value using DAC
Arkadi 16:8274b4ad84ee 72 // HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, ADCValueOut);
Arkadi 16:8274b4ad84ee 73 *(__IO uint32_t *) Dac_Reg = (uint16_t)(4095/2);
TauZoolog 3:25cd717ad782 74
Arkadi 4:85dbf3e4d432 75 // Infinite loop
Arkadi 4:85dbf3e4d432 76 while(true) {
Arkadi 16:8274b4ad84ee 77 if (mybutton.read()==0) { // if button pressed, generate pulse out
Arkadi 16:8274b4ad84ee 78 led.write(1);
Arkadi 21:7aa784deffc8 79
Arkadi 20:048516dc1015 80 /////////////////////////////////////////////////////////////////////////////////
Arkadi 21:7aa784deffc8 81 __disable_irq(); // Disable Interrupts
Arkadi 16:8274b4ad84ee 82 // generate chirp out
Arkadi 16:8274b4ad84ee 83 for (int ii=0; ii<NUM_SAMPLES; ii++) {
Arkadi 16:8274b4ad84ee 84 // toogle io for loop frequency
Arkadi 16:8274b4ad84ee 85 toggle_state=!toggle_state;
Arkadi 16:8274b4ad84ee 86 outPulse.write(toggle_state);
Arkadi 16:8274b4ad84ee 87 // generate delay for 1MHz Sample rate
Arkadi 18:18074899e25b 88 for (int jj=0; jj<31; jj++) {
Arkadi 16:8274b4ad84ee 89 NOP();
Arkadi 16:8274b4ad84ee 90 }
Arkadi 18:18074899e25b 91 // micro nops :)
Arkadi 18:18074899e25b 92 NOP();
Arkadi 16:8274b4ad84ee 93 NOP();
Arkadi 16:8274b4ad84ee 94 NOP();
Arkadi 16:8274b4ad84ee 95 NOP();
Arkadi 16:8274b4ad84ee 96 NOP();
Arkadi 26:c07bf3beb241 97 NOP();
Arkadi 26:c07bf3beb241 98 NOP();
Arkadi 23:6dbd2d20697c 99
Arkadi 23:6dbd2d20697c 100 #ifdef SAMPLE_RATE_375_KHZ
Arkadi 23:6dbd2d20697c 101 // generate delay
Arkadi 26:c07bf3beb241 102 for (int jj=0; jj<61; jj++) {
Arkadi 23:6dbd2d20697c 103 NOP();
Arkadi 23:6dbd2d20697c 104 }
Arkadi 23:6dbd2d20697c 105 // micro nops :)
Arkadi 27:2091f3f4b96b 106 //NOP();
Arkadi 27:2091f3f4b96b 107 //NOP();
Arkadi 26:c07bf3beb241 108 NOP();
Arkadi 26:c07bf3beb241 109 NOP();
Arkadi 26:c07bf3beb241 110 NOP();
Arkadi 23:6dbd2d20697c 111 #endif
Arkadi 16:8274b4ad84ee 112 // Output value using DAC
Arkadi 16:8274b4ad84ee 113 // HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, ADCValueOut);
Arkadi 16:8274b4ad84ee 114 *(__IO uint32_t *) Dac_Reg = chirpData[ii];
Arkadi 4:85dbf3e4d432 115 }
Arkadi 16:8274b4ad84ee 116 // Output value using DAC
Arkadi 16:8274b4ad84ee 117 // HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, ADCValueOut);
Arkadi 16:8274b4ad84ee 118 *(__IO uint32_t *) Dac_Reg = (uint16_t)(4095/2);
Arkadi 20:048516dc1015 119 __enable_irq(); // Enable Interrupts
Arkadi 20:048516dc1015 120 //////////////////////////////////////////////////////////////////////////////////
Arkadi 21:7aa784deffc8 121
Arkadi 18:18074899e25b 122 // generate delay between pulses
Arkadi 18:18074899e25b 123 // delay post pulse // sets the pulse rate
Arkadi 21:7aa784deffc8 124 float waitTime = (1.0f/(2.0f*pulseRate) - (((float)NUM_SAMPLES)/1000000.0f));
Arkadi 20:048516dc1015 125 if (waitTime > 0) {
Arkadi 19:5a6bf2a0ecf6 126 led.write(0);
Arkadi 19:5a6bf2a0ecf6 127 wait(waitTime);
Arkadi 19:5a6bf2a0ecf6 128 led.write(1);
Arkadi 21:7aa784deffc8 129 wait(1.0f/(2.0f*pulseRate));
Arkadi 20:048516dc1015 130 } else {
Arkadi 20:048516dc1015 131 wait(0.5);
Arkadi 20:048516dc1015 132 printf("!!! Error Wait time is negative %f !!!\r\n", waitTime);
Arkadi 20:048516dc1015 133 wait(0.5);
Arkadi 19:5a6bf2a0ecf6 134 }
Arkadi 16:8274b4ad84ee 135 } // end button press
Arkadi 16:8274b4ad84ee 136 led.write(0);
Arkadi 21:7aa784deffc8 137
Arkadi 21:7aa784deffc8 138 // update freq based on potentiometer
Arkadi 21:7aa784deffc8 139 #ifdef FREQ_POT_EN
Arkadi 21:7aa784deffc8 140 pulseRate = potFreq * PULSE_RATE;
Arkadi 21:7aa784deffc8 141 if (pulseRate < MIN_FREQ) pulseRate = MIN_FREQ;
Arkadi 21:7aa784deffc8 142 //printf("Pulse Rate %f\r\n", pulseRate);
Arkadi 21:7aa784deffc8 143 #endif
Arkadi 16:8274b4ad84ee 144 }// end while(True)
Arkadi 16:8274b4ad84ee 145 }
Arkadi 8:4a9979fe0122 146
Arkadi 8:4a9979fe0122 147
Arkadi 16:8274b4ad84ee 148 // init dac
Arkadi 16:8274b4ad84ee 149
Arkadi 16:8274b4ad84ee 150 /* DAC1 init function */
Arkadi 16:8274b4ad84ee 151 void DAC1_Init(void)
Arkadi 16:8274b4ad84ee 152 {
Arkadi 16:8274b4ad84ee 153 DAC_ChannelConfTypeDef sConfig;
TauZoolog 3:25cd717ad782 154
Arkadi 16:8274b4ad84ee 155 // DAC Initialization
Arkadi 16:8274b4ad84ee 156 hdac1.Instance = DAC;
Arkadi 16:8274b4ad84ee 157 if(HAL_DAC_Init(&hdac1) != HAL_OK) {
Arkadi 19:5a6bf2a0ecf6 158 printf("!!! Error in DAC initialization !!!\r\n");
Arkadi 16:8274b4ad84ee 159 }
Arkadi 16:8274b4ad84ee 160
Arkadi 16:8274b4ad84ee 161 // DAC channel OUT1 config
Arkadi 16:8274b4ad84ee 162 sConfig.DAC_Trigger = DAC_TRIGGER_NONE;
Arkadi 16:8274b4ad84ee 163 sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
Arkadi 16:8274b4ad84ee 164 if (HAL_DAC_ConfigChannel(&hdac1, &sConfig, DAC_CHANNEL_1) != HAL_OK) {
Arkadi 19:5a6bf2a0ecf6 165 printf("!!! Error in DAC channel initialization !!!\r\n");
Arkadi 5:65833e8cf4cf 166 }
Arkadi 4:85dbf3e4d432 167 }