Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
Fork of TAU_ZOOLOG_Chirp_Generator by
main.cpp@23:6dbd2d20697c, 2018-04-25 (annotated)
- Committer:
- Arkadi
- Date:
- Wed Apr 25 08:51:50 2018 +0000
- Revision:
- 23:6dbd2d20697c
- Parent:
- 21:7aa784deffc8
- Child:
- 25:060831b7aadd
Ultrasonic Audio File Player
Who changed what in which revision?
| User | Revision | Line number | New 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 | 23:6dbd2d20697c | 18 | #define PULSE_RATE 2.0f // in HZ |
| Arkadi | 21:7aa784deffc8 | 19 | #define FREQ_POT_EN // Potentiometer to set PULSE Rate |
| Arkadi | 23:6dbd2d20697c | 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 | 23:6dbd2d20697c | 97 | |
| Arkadi | 23:6dbd2d20697c | 98 | #ifdef SAMPLE_RATE_375_KHZ |
| Arkadi | 23:6dbd2d20697c | 99 | // generate delay |
| Arkadi | 23:6dbd2d20697c | 100 | for (int jj=0; jj<69; jj++) { |
| Arkadi | 23:6dbd2d20697c | 101 | NOP(); |
| Arkadi | 23:6dbd2d20697c | 102 | } |
| Arkadi | 23:6dbd2d20697c | 103 | // micro nops :) |
| Arkadi | 23:6dbd2d20697c | 104 | NOP(); |
| Arkadi | 23:6dbd2d20697c | 105 | NOP(); |
| Arkadi | 23:6dbd2d20697c | 106 | NOP(); |
| Arkadi | 23:6dbd2d20697c | 107 | //NOP(); |
| Arkadi | 23:6dbd2d20697c | 108 | //NOP(); |
| Arkadi | 23:6dbd2d20697c | 109 | #endif |
| Arkadi | 16:8274b4ad84ee | 110 | // Output value using DAC |
| Arkadi | 16:8274b4ad84ee | 111 | // HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, ADCValueOut); |
| Arkadi | 16:8274b4ad84ee | 112 | *(__IO uint32_t *) Dac_Reg = chirpData[ii]; |
| Arkadi | 4:85dbf3e4d432 | 113 | } |
| Arkadi | 16:8274b4ad84ee | 114 | // Output value using DAC |
| Arkadi | 16:8274b4ad84ee | 115 | // HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, ADCValueOut); |
| Arkadi | 16:8274b4ad84ee | 116 | *(__IO uint32_t *) Dac_Reg = (uint16_t)(4095/2); |
| Arkadi | 20:048516dc1015 | 117 | __enable_irq(); // Enable Interrupts |
| Arkadi | 20:048516dc1015 | 118 | ////////////////////////////////////////////////////////////////////////////////// |
| Arkadi | 21:7aa784deffc8 | 119 | |
| Arkadi | 18:18074899e25b | 120 | // generate delay between pulses |
| Arkadi | 18:18074899e25b | 121 | // delay post pulse // sets the pulse rate |
| Arkadi | 21:7aa784deffc8 | 122 | float waitTime = (1.0f/(2.0f*pulseRate) - (((float)NUM_SAMPLES)/1000000.0f)); |
| Arkadi | 20:048516dc1015 | 123 | if (waitTime > 0) { |
| Arkadi | 19:5a6bf2a0ecf6 | 124 | led.write(0); |
| Arkadi | 19:5a6bf2a0ecf6 | 125 | wait(waitTime); |
| Arkadi | 19:5a6bf2a0ecf6 | 126 | led.write(1); |
| Arkadi | 21:7aa784deffc8 | 127 | wait(1.0f/(2.0f*pulseRate)); |
| Arkadi | 20:048516dc1015 | 128 | } else { |
| Arkadi | 20:048516dc1015 | 129 | wait(0.5); |
| Arkadi | 20:048516dc1015 | 130 | printf("!!! Error Wait time is negative %f !!!\r\n", waitTime); |
| Arkadi | 20:048516dc1015 | 131 | wait(0.5); |
| Arkadi | 19:5a6bf2a0ecf6 | 132 | } |
| Arkadi | 16:8274b4ad84ee | 133 | } // end button press |
| Arkadi | 16:8274b4ad84ee | 134 | led.write(0); |
| Arkadi | 21:7aa784deffc8 | 135 | |
| Arkadi | 21:7aa784deffc8 | 136 | // update freq based on potentiometer |
| Arkadi | 21:7aa784deffc8 | 137 | #ifdef FREQ_POT_EN |
| Arkadi | 21:7aa784deffc8 | 138 | pulseRate = potFreq * PULSE_RATE; |
| Arkadi | 21:7aa784deffc8 | 139 | if (pulseRate < MIN_FREQ) pulseRate = MIN_FREQ; |
| Arkadi | 21:7aa784deffc8 | 140 | //printf("Pulse Rate %f\r\n", pulseRate); |
| Arkadi | 21:7aa784deffc8 | 141 | #endif |
| Arkadi | 16:8274b4ad84ee | 142 | }// end while(True) |
| Arkadi | 16:8274b4ad84ee | 143 | } |
| Arkadi | 8:4a9979fe0122 | 144 | |
| Arkadi | 8:4a9979fe0122 | 145 | |
| Arkadi | 16:8274b4ad84ee | 146 | // init dac |
| Arkadi | 16:8274b4ad84ee | 147 | |
| Arkadi | 16:8274b4ad84ee | 148 | /* DAC1 init function */ |
| Arkadi | 16:8274b4ad84ee | 149 | void DAC1_Init(void) |
| Arkadi | 16:8274b4ad84ee | 150 | { |
| Arkadi | 16:8274b4ad84ee | 151 | DAC_ChannelConfTypeDef sConfig; |
| TauZoolog | 3:25cd717ad782 | 152 | |
| Arkadi | 16:8274b4ad84ee | 153 | // DAC Initialization |
| Arkadi | 16:8274b4ad84ee | 154 | hdac1.Instance = DAC; |
| Arkadi | 16:8274b4ad84ee | 155 | if(HAL_DAC_Init(&hdac1) != HAL_OK) { |
| Arkadi | 19:5a6bf2a0ecf6 | 156 | printf("!!! Error in DAC initialization !!!\r\n"); |
| Arkadi | 16:8274b4ad84ee | 157 | } |
| Arkadi | 16:8274b4ad84ee | 158 | |
| Arkadi | 16:8274b4ad84ee | 159 | // DAC channel OUT1 config |
| Arkadi | 16:8274b4ad84ee | 160 | sConfig.DAC_Trigger = DAC_TRIGGER_NONE; |
| Arkadi | 16:8274b4ad84ee | 161 | sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE; |
| Arkadi | 16:8274b4ad84ee | 162 | if (HAL_DAC_ConfigChannel(&hdac1, &sConfig, DAC_CHANNEL_1) != HAL_OK) { |
| Arkadi | 19:5a6bf2a0ecf6 | 163 | printf("!!! Error in DAC channel initialization !!!\r\n"); |
| Arkadi | 5:65833e8cf4cf | 164 | } |
| Arkadi | 4:85dbf3e4d432 | 165 | } |
