Chirp Signal Generator

Dependencies:   mbed

Fork of TAU_ZOOLOG_Playback_Rev1_1 by Yossi_Students

Committer:
Arkadi
Date:
Sun Jul 15 10:26:46 2018 +0000
Revision:
23:024fd1442fce
Parent:
21:7aa784deffc8
Adjustment to 1MHz sample rate

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 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 23:024fd1442fce 95 NOP();
Arkadi 23:024fd1442fce 96 NOP();
Arkadi 16:8274b4ad84ee 97 // Output value using DAC
Arkadi 16:8274b4ad84ee 98 // HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, ADCValueOut);
Arkadi 16:8274b4ad84ee 99 *(__IO uint32_t *) Dac_Reg = chirpData[ii];
Arkadi 4:85dbf3e4d432 100 }
Arkadi 16:8274b4ad84ee 101 // Output value using DAC
Arkadi 16:8274b4ad84ee 102 // HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, ADCValueOut);
Arkadi 16:8274b4ad84ee 103 *(__IO uint32_t *) Dac_Reg = (uint16_t)(4095/2);
Arkadi 20:048516dc1015 104 __enable_irq(); // Enable Interrupts
Arkadi 20:048516dc1015 105 //////////////////////////////////////////////////////////////////////////////////
Arkadi 21:7aa784deffc8 106
Arkadi 18:18074899e25b 107 // generate delay between pulses
Arkadi 18:18074899e25b 108 // delay post pulse // sets the pulse rate
Arkadi 21:7aa784deffc8 109 float waitTime = (1.0f/(2.0f*pulseRate) - (((float)NUM_SAMPLES)/1000000.0f));
Arkadi 20:048516dc1015 110 if (waitTime > 0) {
Arkadi 19:5a6bf2a0ecf6 111 led.write(0);
Arkadi 19:5a6bf2a0ecf6 112 wait(waitTime);
Arkadi 19:5a6bf2a0ecf6 113 led.write(1);
Arkadi 21:7aa784deffc8 114 wait(1.0f/(2.0f*pulseRate));
Arkadi 20:048516dc1015 115 } else {
Arkadi 20:048516dc1015 116 wait(0.5);
Arkadi 20:048516dc1015 117 printf("!!! Error Wait time is negative %f !!!\r\n", waitTime);
Arkadi 20:048516dc1015 118 wait(0.5);
Arkadi 19:5a6bf2a0ecf6 119 }
Arkadi 16:8274b4ad84ee 120 } // end button press
Arkadi 16:8274b4ad84ee 121 led.write(0);
Arkadi 21:7aa784deffc8 122
Arkadi 21:7aa784deffc8 123 // update freq based on potentiometer
Arkadi 21:7aa784deffc8 124 #ifdef FREQ_POT_EN
Arkadi 21:7aa784deffc8 125 pulseRate = potFreq * PULSE_RATE;
Arkadi 21:7aa784deffc8 126 if (pulseRate < MIN_FREQ) pulseRate = MIN_FREQ;
Arkadi 21:7aa784deffc8 127 //printf("Pulse Rate %f\r\n", pulseRate);
Arkadi 21:7aa784deffc8 128 #endif
Arkadi 16:8274b4ad84ee 129 }// end while(True)
Arkadi 16:8274b4ad84ee 130 }
Arkadi 8:4a9979fe0122 131
Arkadi 8:4a9979fe0122 132
Arkadi 16:8274b4ad84ee 133 // init dac
Arkadi 16:8274b4ad84ee 134
Arkadi 16:8274b4ad84ee 135 /* DAC1 init function */
Arkadi 16:8274b4ad84ee 136 void DAC1_Init(void)
Arkadi 16:8274b4ad84ee 137 {
Arkadi 16:8274b4ad84ee 138 DAC_ChannelConfTypeDef sConfig;
TauZoolog 3:25cd717ad782 139
Arkadi 16:8274b4ad84ee 140 // DAC Initialization
Arkadi 16:8274b4ad84ee 141 hdac1.Instance = DAC;
Arkadi 16:8274b4ad84ee 142 if(HAL_DAC_Init(&hdac1) != HAL_OK) {
Arkadi 19:5a6bf2a0ecf6 143 printf("!!! Error in DAC initialization !!!\r\n");
Arkadi 16:8274b4ad84ee 144 }
Arkadi 16:8274b4ad84ee 145
Arkadi 16:8274b4ad84ee 146 // DAC channel OUT1 config
Arkadi 16:8274b4ad84ee 147 sConfig.DAC_Trigger = DAC_TRIGGER_NONE;
Arkadi 16:8274b4ad84ee 148 sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
Arkadi 16:8274b4ad84ee 149 if (HAL_DAC_ConfigChannel(&hdac1, &sConfig, DAC_CHANNEL_1) != HAL_OK) {
Arkadi 19:5a6bf2a0ecf6 150 printf("!!! Error in DAC channel initialization !!!\r\n");
Arkadi 5:65833e8cf4cf 151 }
Arkadi 4:85dbf3e4d432 152 }