Chirp Signal Generator

Dependencies:   mbed

Fork of TAU_ZOOLOG_Playback_Rev1_1 by Yossi_Students

Committer:
Arkadi
Date:
Tue Mar 27 07:58:22 2018 +0000
Revision:
20:048516dc1015
Parent:
19:5a6bf2a0ecf6
Child:
21:7aa784deffc8
Added disable interrupts during chirp out, so the systick interrupt wont interfere with the software timing.

Who changed what in which revision?

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