Chirp Signal Generator

Dependencies:   mbed

Fork of TAU_ZOOLOG_Playback_Rev1_1 by Yossi_Students

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?

UserRevisionLine numberNew 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 }