Ultrasonic Audio File Player
Dependencies: mbed
Fork of TAU_ZOOLOG_Chirp_Generator by
main.cpp@19:5a6bf2a0ecf6, 2018-03-26 (annotated)
- Committer:
- Arkadi
- Date:
- Mon Mar 26 12:12:37 2018 +0000
- Revision:
- 19:5a6bf2a0ecf6
- Parent:
- 18:18074899e25b
- Child:
- 20:048516dc1015
Updated delay time to compensate chirp length
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
TauZoolog | 3:25cd717ad782 | 1 | /* |
Arkadi | 16:8274b4ad84ee | 2 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
Arkadi | 17:c0c17da42990 | 3 | % Generate Chirp Signal - 21/08/2017 % |
Arkadi | 16:8274b4ad84ee | 4 | % Arkadi Rafalovich - % Arkadiraf@gmail.com % |
Arkadi | 16:8274b4ad84ee | 5 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
TauZoolog | 3:25cd717ad782 | 6 | |
TauZoolog | 3:25cd717ad782 | 7 | Pinout: |
TauZoolog | 3:25cd717ad782 | 8 | DAC -- PA_4 -- A2 |
TauZoolog | 3:25cd717ad782 | 9 | |
TauZoolog | 3:25cd717ad782 | 10 | I/O -- PA_5 -- D13 (Status LED, Condition) |
TauZoolog | 3:25cd717ad782 | 11 | I/O -- PA_6 -- D12 (Toggle Pin, Loop Freq) |
TauZoolog | 3:25cd717ad782 | 12 | |
TauZoolog | 3:25cd717ad782 | 13 | */ |
TauZoolog | 3:25cd717ad782 | 14 | #include "mbed.h" |
Arkadi | 16:8274b4ad84ee | 15 | #include "chirp.h" |
Arkadi | 18:18074899e25b | 16 | #define PULSE_RATE 10.0f // in HZ |
Arkadi | 16:8274b4ad84ee | 17 | // Serial over USB as input device |
Arkadi | 16:8274b4ad84ee | 18 | Serial pc(SERIAL_TX, SERIAL_RX); |
TauZoolog | 3:25cd717ad782 | 19 | |
TauZoolog | 3:25cd717ad782 | 20 | // mbed variables, Settings |
TauZoolog | 3:25cd717ad782 | 21 | AnalogOut out(PA_4); |
TauZoolog | 3:25cd717ad782 | 22 | |
Arkadi | 4:85dbf3e4d432 | 23 | // digital pins |
Arkadi | 4:85dbf3e4d432 | 24 | DigitalOut led(LED1); |
Arkadi | 16:8274b4ad84ee | 25 | DigitalOut outPulse(PA_6); // Toggle pin, Loop Freq |
TauZoolog | 3:25cd717ad782 | 26 | |
TauZoolog | 3:25cd717ad782 | 27 | // User Button as interrupt |
Arkadi | 16:8274b4ad84ee | 28 | DigitalIn mybutton(USER_BUTTON); |
TauZoolog | 3:25cd717ad782 | 29 | |
Arkadi | 16:8274b4ad84ee | 30 | //DAC declarations |
TauZoolog | 3:25cd717ad782 | 31 | DAC_HandleTypeDef hdac1; |
TauZoolog | 3:25cd717ad782 | 32 | |
TauZoolog | 3:25cd717ad782 | 33 | // Dac Register for direct method of setting DAC value`s |
TauZoolog | 3:25cd717ad782 | 34 | __IO uint32_t Dac_Reg = 0; |
TauZoolog | 3:25cd717ad782 | 35 | |
TauZoolog | 3:25cd717ad782 | 36 | // Variables |
Arkadi | 16:8274b4ad84ee | 37 | bool toggle_state=0; |
Arkadi | 8:4a9979fe0122 | 38 | |
Arkadi | 8:4a9979fe0122 | 39 | // nop operation |
TauZoolog | 3:25cd717ad782 | 40 | inline void NOP() |
TauZoolog | 3:25cd717ad782 | 41 | { |
TauZoolog | 3:25cd717ad782 | 42 | __ASM volatile ("nop"); // one tick operation, Use to adjust frequency by slowing down the proccess |
TauZoolog | 3:25cd717ad782 | 43 | } |
TauZoolog | 3:25cd717ad782 | 44 | |
Arkadi | 16:8274b4ad84ee | 45 | /* DAC1 init function */ |
Arkadi | 16:8274b4ad84ee | 46 | void DAC1_Init(void); |
TauZoolog | 3:25cd717ad782 | 47 | |
TauZoolog | 3:25cd717ad782 | 48 | // Main procedure |
Arkadi | 4:85dbf3e4d432 | 49 | int main() |
Arkadi | 4:85dbf3e4d432 | 50 | { |
Arkadi | 4:85dbf3e4d432 | 51 | DAC1_Init(); |
TauZoolog | 3:25cd717ad782 | 52 | |
Arkadi | 4:85dbf3e4d432 | 53 | HAL_DAC_Start(&hdac1, DAC_CHANNEL_1); |
TauZoolog | 3:25cd717ad782 | 54 | |
Arkadi | 4:85dbf3e4d432 | 55 | // define Dac Register for direct method of setting DAC value`s |
Arkadi | 4:85dbf3e4d432 | 56 | Dac_Reg = (uint32_t) (hdac1.Instance); |
Arkadi | 4:85dbf3e4d432 | 57 | Dac_Reg += __HAL_DHR12R1_ALIGNEMENT(DAC_ALIGN_12B_R); |
TauZoolog | 3:25cd717ad782 | 58 | |
Arkadi | 16:8274b4ad84ee | 59 | // set outputs |
Arkadi | 12:e2b4a11ebe5a | 60 | outPulse.write(0); |
Arkadi | 16:8274b4ad84ee | 61 | led.write(0); |
Arkadi | 16:8274b4ad84ee | 62 | // Output value using DAC |
Arkadi | 16:8274b4ad84ee | 63 | // HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, ADCValueOut); |
Arkadi | 16:8274b4ad84ee | 64 | *(__IO uint32_t *) Dac_Reg = (uint16_t)(4095/2); |
TauZoolog | 3:25cd717ad782 | 65 | |
Arkadi | 4:85dbf3e4d432 | 66 | // Infinite loop |
Arkadi | 4:85dbf3e4d432 | 67 | while(true) { |
Arkadi | 16:8274b4ad84ee | 68 | if (mybutton.read()==0) { // if button pressed, generate pulse out |
Arkadi | 16:8274b4ad84ee | 69 | led.write(1); |
Arkadi | 16:8274b4ad84ee | 70 | // generate chirp out |
Arkadi | 16:8274b4ad84ee | 71 | for (int ii=0; ii<NUM_SAMPLES; ii++) { |
Arkadi | 16:8274b4ad84ee | 72 | // toogle io for loop frequency |
Arkadi | 16:8274b4ad84ee | 73 | toggle_state=!toggle_state; |
Arkadi | 16:8274b4ad84ee | 74 | outPulse.write(toggle_state); |
Arkadi | 16:8274b4ad84ee | 75 | // generate delay for 1MHz Sample rate |
Arkadi | 18:18074899e25b | 76 | for (int jj=0; jj<31; jj++) { |
Arkadi | 16:8274b4ad84ee | 77 | NOP(); |
Arkadi | 16:8274b4ad84ee | 78 | } |
Arkadi | 18:18074899e25b | 79 | // micro nops :) |
Arkadi | 18:18074899e25b | 80 | NOP(); |
Arkadi | 16:8274b4ad84ee | 81 | NOP(); |
Arkadi | 16:8274b4ad84ee | 82 | NOP(); |
Arkadi | 16:8274b4ad84ee | 83 | NOP(); |
Arkadi | 16:8274b4ad84ee | 84 | NOP(); |
Arkadi | 16:8274b4ad84ee | 85 | // Output value using DAC |
Arkadi | 16:8274b4ad84ee | 86 | // HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, ADCValueOut); |
Arkadi | 16:8274b4ad84ee | 87 | *(__IO uint32_t *) Dac_Reg = chirpData[ii]; |
Arkadi | 4:85dbf3e4d432 | 88 | } |
Arkadi | 16:8274b4ad84ee | 89 | // Output value using DAC |
Arkadi | 16:8274b4ad84ee | 90 | // HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, ADCValueOut); |
Arkadi | 16:8274b4ad84ee | 91 | *(__IO uint32_t *) Dac_Reg = (uint16_t)(4095/2); |
Arkadi | 18:18074899e25b | 92 | |
Arkadi | 18:18074899e25b | 93 | // generate delay between pulses |
Arkadi | 18:18074899e25b | 94 | // delay post pulse // sets the pulse rate |
Arkadi | 19:5a6bf2a0ecf6 | 95 | float waitTime = (1.0f/(2.0f*PULSE_RATE) - (((float)NUM_SAMPLES)/1000000.0f)); |
Arkadi | 19:5a6bf2a0ecf6 | 96 | if (waitTime > 0){ |
Arkadi | 19:5a6bf2a0ecf6 | 97 | led.write(0); |
Arkadi | 19:5a6bf2a0ecf6 | 98 | wait(waitTime); |
Arkadi | 19:5a6bf2a0ecf6 | 99 | led.write(1); |
Arkadi | 19:5a6bf2a0ecf6 | 100 | wait(1.0f/(2.0f*PULSE_RATE)); |
Arkadi | 19:5a6bf2a0ecf6 | 101 | }else{ |
Arkadi | 19:5a6bf2a0ecf6 | 102 | wait(0.5); |
Arkadi | 19:5a6bf2a0ecf6 | 103 | printf("!!! Error Wait time is negative %f !!!\r\n", waitTime); |
Arkadi | 19:5a6bf2a0ecf6 | 104 | wait(0.5); |
Arkadi | 19:5a6bf2a0ecf6 | 105 | } |
Arkadi | 16:8274b4ad84ee | 106 | } // end button press |
Arkadi | 16:8274b4ad84ee | 107 | led.write(0); |
Arkadi | 16:8274b4ad84ee | 108 | }// end while(True) |
Arkadi | 16:8274b4ad84ee | 109 | } |
Arkadi | 8:4a9979fe0122 | 110 | |
Arkadi | 8:4a9979fe0122 | 111 | |
Arkadi | 16:8274b4ad84ee | 112 | // init dac |
Arkadi | 16:8274b4ad84ee | 113 | |
Arkadi | 16:8274b4ad84ee | 114 | /* DAC1 init function */ |
Arkadi | 16:8274b4ad84ee | 115 | void DAC1_Init(void) |
Arkadi | 16:8274b4ad84ee | 116 | { |
Arkadi | 16:8274b4ad84ee | 117 | DAC_ChannelConfTypeDef sConfig; |
TauZoolog | 3:25cd717ad782 | 118 | |
Arkadi | 16:8274b4ad84ee | 119 | // DAC Initialization |
Arkadi | 16:8274b4ad84ee | 120 | hdac1.Instance = DAC; |
Arkadi | 16:8274b4ad84ee | 121 | if(HAL_DAC_Init(&hdac1) != HAL_OK) { |
Arkadi | 19:5a6bf2a0ecf6 | 122 | printf("!!! Error in DAC initialization !!!\r\n"); |
Arkadi | 16:8274b4ad84ee | 123 | } |
Arkadi | 16:8274b4ad84ee | 124 | |
Arkadi | 16:8274b4ad84ee | 125 | // DAC channel OUT1 config |
Arkadi | 16:8274b4ad84ee | 126 | sConfig.DAC_Trigger = DAC_TRIGGER_NONE; |
Arkadi | 16:8274b4ad84ee | 127 | sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE; |
Arkadi | 16:8274b4ad84ee | 128 | if (HAL_DAC_ConfigChannel(&hdac1, &sConfig, DAC_CHANNEL_1) != HAL_OK) { |
Arkadi | 19:5a6bf2a0ecf6 | 129 | printf("!!! Error in DAC channel initialization !!!\r\n"); |
Arkadi | 5:65833e8cf4cf | 130 | } |
Arkadi | 4:85dbf3e4d432 | 131 | } |