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@21:7aa784deffc8, 2018-04-08 (annotated)
- Committer:
- Arkadi
- Date:
- Sun Apr 08 07:40:55 2018 +0000
- Revision:
- 21:7aa784deffc8
- Parent:
- 20:048516dc1015
- Child:
- 23:6dbd2d20697c
Added potentiometer support on A0 pin, for frequency setting
Who changed what in which revision?
| User | Revision | Line number | New contents of line | 
|---|---|---|---|
| TauZoolog | 3:25cd717ad782 | 1 | /* | 
| Arkadi | 16:8274b4ad84ee | 2 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | 
| Arkadi | 20:048516dc1015 | 3 | % Generate Chirp Signal - 27/03/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) | 
| TauZoolog | 3:25cd717ad782 | 13 | |
| TauZoolog | 3:25cd717ad782 | 14 | */ | 
| TauZoolog | 3:25cd717ad782 | 15 | #include "mbed.h" | 
| Arkadi | 16:8274b4ad84ee | 16 | #include "chirp.h" | 
| Arkadi | 21:7aa784deffc8 | 17 | #define PULSE_RATE 20.0f // in HZ | 
| Arkadi | 21:7aa784deffc8 | 18 | #define FREQ_POT_EN // Potentiometer to set PULSE Rate | 
| Arkadi | 21:7aa784deffc8 | 19 | #define MIN_FREQ 0.5f //(HZ) | 
| Arkadi | 21:7aa784deffc8 | 20 | |
| Arkadi | 21:7aa784deffc8 | 21 | float pulseRate=PULSE_RATE; | 
| Arkadi | 16:8274b4ad84ee | 22 | // Serial over USB as input device | 
| Arkadi | 16:8274b4ad84ee | 23 | Serial pc(SERIAL_TX, SERIAL_RX); | 
| TauZoolog | 3:25cd717ad782 | 24 | |
| TauZoolog | 3:25cd717ad782 | 25 | // mbed variables, Settings | 
| TauZoolog | 3:25cd717ad782 | 26 | AnalogOut out(PA_4); | 
| Arkadi | 21:7aa784deffc8 | 27 | AnalogIn potFreq(A0); | 
| Arkadi | 21:7aa784deffc8 | 28 | // Potentiometer analog INPUT | 
| TauZoolog | 3:25cd717ad782 | 29 | |
| Arkadi | 4:85dbf3e4d432 | 30 | // digital pins | 
| Arkadi | 4:85dbf3e4d432 | 31 | DigitalOut led(LED1); | 
| Arkadi | 16:8274b4ad84ee | 32 | DigitalOut outPulse(PA_6); // Toggle pin, Loop Freq | 
| TauZoolog | 3:25cd717ad782 | 33 | |
| TauZoolog | 3:25cd717ad782 | 34 | // User Button as interrupt | 
| Arkadi | 16:8274b4ad84ee | 35 | DigitalIn mybutton(USER_BUTTON); | 
| TauZoolog | 3:25cd717ad782 | 36 | |
| Arkadi | 16:8274b4ad84ee | 37 | //DAC declarations | 
| TauZoolog | 3:25cd717ad782 | 38 | DAC_HandleTypeDef hdac1; | 
| TauZoolog | 3:25cd717ad782 | 39 | |
| TauZoolog | 3:25cd717ad782 | 40 | // Dac Register for direct method of setting DAC value`s | 
| TauZoolog | 3:25cd717ad782 | 41 | __IO uint32_t Dac_Reg = 0; | 
| TauZoolog | 3:25cd717ad782 | 42 | |
| TauZoolog | 3:25cd717ad782 | 43 | // Variables | 
| Arkadi | 16:8274b4ad84ee | 44 | bool toggle_state=0; | 
| Arkadi | 8:4a9979fe0122 | 45 | |
| Arkadi | 8:4a9979fe0122 | 46 | // nop operation | 
| TauZoolog | 3:25cd717ad782 | 47 | inline void NOP() | 
| TauZoolog | 3:25cd717ad782 | 48 | { | 
| TauZoolog | 3:25cd717ad782 | 49 | __ASM volatile ("nop"); // one tick operation, Use to adjust frequency by slowing down the proccess | 
| TauZoolog | 3:25cd717ad782 | 50 | } | 
| TauZoolog | 3:25cd717ad782 | 51 | |
| Arkadi | 16:8274b4ad84ee | 52 | /* DAC1 init function */ | 
| Arkadi | 16:8274b4ad84ee | 53 | void DAC1_Init(void); | 
| TauZoolog | 3:25cd717ad782 | 54 | |
| TauZoolog | 3:25cd717ad782 | 55 | // Main procedure | 
| Arkadi | 4:85dbf3e4d432 | 56 | int main() | 
| Arkadi | 4:85dbf3e4d432 | 57 | { | 
| Arkadi | 4:85dbf3e4d432 | 58 | DAC1_Init(); | 
| TauZoolog | 3:25cd717ad782 | 59 | |
| Arkadi | 4:85dbf3e4d432 | 60 | HAL_DAC_Start(&hdac1, DAC_CHANNEL_1); | 
| TauZoolog | 3:25cd717ad782 | 61 | |
| Arkadi | 4:85dbf3e4d432 | 62 | // define Dac Register for direct method of setting DAC value`s | 
| Arkadi | 4:85dbf3e4d432 | 63 | Dac_Reg = (uint32_t) (hdac1.Instance); | 
| Arkadi | 4:85dbf3e4d432 | 64 | Dac_Reg += __HAL_DHR12R1_ALIGNEMENT(DAC_ALIGN_12B_R); | 
| TauZoolog | 3:25cd717ad782 | 65 | |
| Arkadi | 16:8274b4ad84ee | 66 | // set outputs | 
| Arkadi | 12:e2b4a11ebe5a | 67 | outPulse.write(0); | 
| Arkadi | 16:8274b4ad84ee | 68 | led.write(0); | 
| Arkadi | 16:8274b4ad84ee | 69 | // Output value using DAC | 
| Arkadi | 16:8274b4ad84ee | 70 | // HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, ADCValueOut); | 
| Arkadi | 16:8274b4ad84ee | 71 | *(__IO uint32_t *) Dac_Reg = (uint16_t)(4095/2); | 
| TauZoolog | 3:25cd717ad782 | 72 | |
| Arkadi | 4:85dbf3e4d432 | 73 | // Infinite loop | 
| Arkadi | 4:85dbf3e4d432 | 74 | while(true) { | 
| Arkadi | 16:8274b4ad84ee | 75 | if (mybutton.read()==0) { // if button pressed, generate pulse out | 
| Arkadi | 16:8274b4ad84ee | 76 | led.write(1); | 
| Arkadi | 21:7aa784deffc8 | 77 | |
| Arkadi | 20:048516dc1015 | 78 | ///////////////////////////////////////////////////////////////////////////////// | 
| Arkadi | 21:7aa784deffc8 | 79 | __disable_irq(); // Disable Interrupts | 
| Arkadi | 16:8274b4ad84ee | 80 | // generate chirp out | 
| Arkadi | 16:8274b4ad84ee | 81 | for (int ii=0; ii<NUM_SAMPLES; ii++) { | 
| Arkadi | 16:8274b4ad84ee | 82 | // toogle io for loop frequency | 
| Arkadi | 16:8274b4ad84ee | 83 | toggle_state=!toggle_state; | 
| Arkadi | 16:8274b4ad84ee | 84 | outPulse.write(toggle_state); | 
| Arkadi | 16:8274b4ad84ee | 85 | // generate delay for 1MHz Sample rate | 
| Arkadi | 18:18074899e25b | 86 | for (int jj=0; jj<31; jj++) { | 
| Arkadi | 16:8274b4ad84ee | 87 | NOP(); | 
| Arkadi | 16:8274b4ad84ee | 88 | } | 
| Arkadi | 18:18074899e25b | 89 | // micro nops :) | 
| Arkadi | 18:18074899e25b | 90 | NOP(); | 
| Arkadi | 16:8274b4ad84ee | 91 | NOP(); | 
| Arkadi | 16:8274b4ad84ee | 92 | NOP(); | 
| Arkadi | 16:8274b4ad84ee | 93 | NOP(); | 
| Arkadi | 16:8274b4ad84ee | 94 | NOP(); | 
| Arkadi | 16:8274b4ad84ee | 95 | // Output value using DAC | 
| Arkadi | 16:8274b4ad84ee | 96 | // HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, ADCValueOut); | 
| Arkadi | 16:8274b4ad84ee | 97 | *(__IO uint32_t *) Dac_Reg = chirpData[ii]; | 
| Arkadi | 4:85dbf3e4d432 | 98 | } | 
| Arkadi | 16:8274b4ad84ee | 99 | // Output value using DAC | 
| Arkadi | 16:8274b4ad84ee | 100 | // HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, ADCValueOut); | 
| Arkadi | 16:8274b4ad84ee | 101 | *(__IO uint32_t *) Dac_Reg = (uint16_t)(4095/2); | 
| Arkadi | 20:048516dc1015 | 102 | __enable_irq(); // Enable Interrupts | 
| Arkadi | 20:048516dc1015 | 103 | ////////////////////////////////////////////////////////////////////////////////// | 
| Arkadi | 21:7aa784deffc8 | 104 | |
| Arkadi | 18:18074899e25b | 105 | // generate delay between pulses | 
| Arkadi | 18:18074899e25b | 106 | // delay post pulse // sets the pulse rate | 
| Arkadi | 21:7aa784deffc8 | 107 | float waitTime = (1.0f/(2.0f*pulseRate) - (((float)NUM_SAMPLES)/1000000.0f)); | 
| Arkadi | 20:048516dc1015 | 108 | if (waitTime > 0) { | 
| Arkadi | 19:5a6bf2a0ecf6 | 109 | led.write(0); | 
| Arkadi | 19:5a6bf2a0ecf6 | 110 | wait(waitTime); | 
| Arkadi | 19:5a6bf2a0ecf6 | 111 | led.write(1); | 
| Arkadi | 21:7aa784deffc8 | 112 | wait(1.0f/(2.0f*pulseRate)); | 
| Arkadi | 20:048516dc1015 | 113 | } else { | 
| Arkadi | 20:048516dc1015 | 114 | wait(0.5); | 
| Arkadi | 20:048516dc1015 | 115 | printf("!!! Error Wait time is negative %f !!!\r\n", waitTime); | 
| Arkadi | 20:048516dc1015 | 116 | wait(0.5); | 
| Arkadi | 19:5a6bf2a0ecf6 | 117 | } | 
| Arkadi | 16:8274b4ad84ee | 118 | } // end button press | 
| Arkadi | 16:8274b4ad84ee | 119 | led.write(0); | 
| Arkadi | 21:7aa784deffc8 | 120 | |
| Arkadi | 21:7aa784deffc8 | 121 | // update freq based on potentiometer | 
| Arkadi | 21:7aa784deffc8 | 122 | #ifdef FREQ_POT_EN | 
| Arkadi | 21:7aa784deffc8 | 123 | pulseRate = potFreq * PULSE_RATE; | 
| Arkadi | 21:7aa784deffc8 | 124 | if (pulseRate < MIN_FREQ) pulseRate = MIN_FREQ; | 
| Arkadi | 21:7aa784deffc8 | 125 | //printf("Pulse Rate %f\r\n", pulseRate); | 
| Arkadi | 21:7aa784deffc8 | 126 | #endif | 
| Arkadi | 16:8274b4ad84ee | 127 | }// end while(True) | 
| Arkadi | 16:8274b4ad84ee | 128 | } | 
| Arkadi | 8:4a9979fe0122 | 129 | |
| Arkadi | 8:4a9979fe0122 | 130 | |
| Arkadi | 16:8274b4ad84ee | 131 | // init dac | 
| Arkadi | 16:8274b4ad84ee | 132 | |
| Arkadi | 16:8274b4ad84ee | 133 | /* DAC1 init function */ | 
| Arkadi | 16:8274b4ad84ee | 134 | void DAC1_Init(void) | 
| Arkadi | 16:8274b4ad84ee | 135 | { | 
| Arkadi | 16:8274b4ad84ee | 136 | DAC_ChannelConfTypeDef sConfig; | 
| TauZoolog | 3:25cd717ad782 | 137 | |
| Arkadi | 16:8274b4ad84ee | 138 | // DAC Initialization | 
| Arkadi | 16:8274b4ad84ee | 139 | hdac1.Instance = DAC; | 
| Arkadi | 16:8274b4ad84ee | 140 | if(HAL_DAC_Init(&hdac1) != HAL_OK) { | 
| Arkadi | 19:5a6bf2a0ecf6 | 141 | printf("!!! Error in DAC initialization !!!\r\n"); | 
| Arkadi | 16:8274b4ad84ee | 142 | } | 
| Arkadi | 16:8274b4ad84ee | 143 | |
| Arkadi | 16:8274b4ad84ee | 144 | // DAC channel OUT1 config | 
| Arkadi | 16:8274b4ad84ee | 145 | sConfig.DAC_Trigger = DAC_TRIGGER_NONE; | 
| Arkadi | 16:8274b4ad84ee | 146 | sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE; | 
| Arkadi | 16:8274b4ad84ee | 147 | if (HAL_DAC_ConfigChannel(&hdac1, &sConfig, DAC_CHANNEL_1) != HAL_OK) { | 
| Arkadi | 19:5a6bf2a0ecf6 | 148 | printf("!!! Error in DAC channel initialization !!!\r\n"); | 
| Arkadi | 5:65833e8cf4cf | 149 | } | 
| Arkadi | 4:85dbf3e4d432 | 150 | } | 
