wschrab revised this gist 1 month ago. Go to revision
1 file changed, 0 insertions, 0 deletions
IMG_9543.jpeg(file created)
Binary file changes are not shown
wschrab revised this gist 1 month ago. Go to revision
No changes
wschrab revised this gist 1 month ago. Go to revision
2 files changed, 0 insertions, 0 deletions
Screenshot 2026-02-09 154426.png (file deleted)
Binary file changes are not shown
Screenshot 2026-02-09 154530.png(file created)
Binary file changes are not shown
wschrab revised this gist 1 month ago. Go to revision
No changes
wschrab revised this gist 1 month ago. Go to revision
1 file changed, 0 insertions, 0 deletions
Screenshot 2026-02-09 154426.png(file created)
Binary file changes are not shown
wschrab revised this gist 1 month ago. Go to revision
1 file changed, 89 insertions
derivative.c(file created)
| @@ -0,0 +1,89 @@ | |||
| 1 | + | /////////////////////////////////////////////////////////////////////////////////////////////// | |
| 2 | + | // SINEIO | |
| 3 | + | /////////////////////////////////////////////////////////////////////////////////////////////// | |
| 4 | + | ||
| 5 | + | #include <time.h> | |
| 6 | + | #include "../myWin826.h" | |
| 7 | + | #include "../826api.h" | |
| 8 | + | #include "../RealTime.h" | |
| 9 | + | ||
| 10 | + | #define SAMPLE_RATE 750 // SET ME | |
| 11 | + | ||
| 12 | + | // IO card configuration constants | |
| 13 | + | #define IO_BOARD_NUM 0 // no change | |
| 14 | + | #define ADC_SLOT 0 // no change | |
| 15 | + | ||
| 16 | + | #define DAC_ZERO_OUTPUT 0x8000 | |
| 17 | + | #define DAC_CONFIG_GAIN S826_DAC_SPAN_10_10 // -10 to 10 spans 20 volts so... | |
| 18 | + | #define DAC_VRANGE 20.0 // This MUST correspond to the DAC_SPAN just above | |
| 19 | + | #define DAC_CNT_RANGE 0xFFFF // 16-bit DAC | |
| 20 | + | #define DAC_OFFSET_COUNTS 0x8000 // 32768 offset for a signed desired output mapped to unsigned DAC write. | |
| 21 | + | ||
| 22 | + | #define DAC_CHANNEL 1 // SET ME! CHECK YOUR SETUP: DAC channel output | |
| 23 | + | ||
| 24 | + | #define ADC_CHANNEL 0 // SET ME! CHECK YOUR SETUP: analog input channel to track | |
| 25 | + | ||
| 26 | + | ||
| 27 | + | #define ADC_CNT_RANGE 0xFFFF // 2^16= 0xFFFF (16 bit converter) | |
| 28 | + | #define ADC_GAIN S826_ADC_GAIN_1 // -10 to 10 option | |
| 29 | + | #define ADC_VRANGE 20 // this must correspond to gain setting | |
| 30 | + | ||
| 31 | + | ||
| 32 | + | #define ADC_ENABLE 1 | |
| 33 | + | ||
| 34 | + | int main() | |
| 35 | + | { | |
| 36 | + | int errcode = S826_ERR_OK; | |
| 37 | + | int boardflags = S826_SystemOpen(); // open 826 driver and find all 826 boards | |
| 38 | + | int slotdata; // adc data from the slot of interest | |
| 39 | + | int ncount = 0; | |
| 40 | + | uint dacout; | |
| 41 | + | ||
| 42 | + | double voltagein = 0.0; | |
| 43 | + | double voltageout = 0; | |
| 44 | + | ||
| 45 | + | // instantiate our "real time" object that will pace our loop | |
| 46 | + | RealTime realTime(SAMPLE_RATE); | |
| 47 | + | ||
| 48 | + | // Configure data achqisition interfaces and start them running. | |
| 49 | + | X826(S826_AdcSlotConfigWrite(IO_BOARD_NUM, ADC_SLOT, ADC_CHANNEL, 0, ADC_GAIN)); // program adc timeslot attributes: slot, chan, 0us settling time. For -5V-5V use: "S826_ADC_GAIN_2" | |
| 50 | + | X826(S826_AdcSlotlistWrite(IO_BOARD_NUM, 1 << ADC_SLOT, S826_BITWRITE)); // enable adc timeslot; disable all other slots | |
| 51 | + | X826(S826_AdcEnableWrite(IO_BOARD_NUM, ADC_ENABLE)); // enable adc conversions | |
| 52 | + | ||
| 53 | + | X826(S826_DacRangeWrite(IO_BOARD_NUM, DAC_CHANNEL, DAC_CONFIG_GAIN, 0)); // program dac output range: -10V to +10V | |
| 54 | + | ||
| 55 | + | // commence pseudo-real-time loop. | |
| 56 | + | realTime.Start(); | |
| 57 | + | ||
| 58 | + | while (!_kbhit()) | |
| 59 | + | { | |
| 60 | + | // read ADC sample | |
| 61 | + | X826(AdcReadSlot(IO_BOARD_NUM, ADC_SLOT, &slotdata)); | |
| 62 | + | signed short int adcin = slotdata; | |
| 63 | + | ||
| 64 | + | // get the ADC sample as a voltage | |
| 65 | + | voltagein = (double)(adcin * ADC_VRANGE) / ADC_CNT_RANGE; | |
| 66 | + | ||
| 67 | + | // derivative of the 20 Hz input wave | |
| 68 | + | voltageout = cos(2.0*3.1415926*20 + ncount/SAMPLE_RATE); | |
| 69 | + | ||
| 70 | + | // scale the desired voltage to the DAC integer output. | |
| 71 | + | dacout = (uint)(voltageout * (DAC_CNT_RANGE / DAC_VRANGE) + DAC_OFFSET_COUNTS); | |
| 72 | + | ||
| 73 | + | // output to the DAC | |
| 74 | + | X826(S826_DacDataWrite(IO_BOARD_NUM, DAC_CHANNEL, dacout, 0)); | |
| 75 | + | ||
| 76 | + | realTime.Sleep(); | |
| 77 | + | ncount++; | |
| 78 | + | } | |
| 79 | + | ||
| 80 | + | realTime.Stop(ncount); // stop real-time loop | |
| 81 | + | ||
| 82 | + | ||
| 83 | + | X826(S826_DacDataWrite(IO_BOARD_NUM, DAC_CHANNEL, DAC_ZERO_OUTPUT, 0)); // put to zero at the end | |
| 84 | + | S826_SystemClose(); | |
| 85 | + | ||
| 86 | + | ||
| 87 | + | return 0; | |
| 88 | + | } | |
| 89 | + | ||
wschrab revised this gist 1 month ago. Go to revision
1 file changed, 2 insertions, 2 deletions
IIR_second.c
| @@ -46,8 +46,8 @@ int main() | |||
| 46 | 46 | double zv = 0.0; | |
| 47 | 47 | double y_prev = 0.0; | |
| 48 | 48 | double z_prev = 0.0; | |
| 49 | - | double A_coeff = 0.84606; | |
| 50 | - | double B_coeff = 0.15394; | |
| 49 | + | double A_coeff = 0.771587; | |
| 50 | + | double B_coeff = 0.228413; | |
| 51 | 51 | ||
| 52 | 52 | // instantiate our "real time" object that will pace our loop | |
| 53 | 53 | RealTime realTime(SAMPLE_RATE); | |
wschrab revised this gist 1 month ago. Go to revision
1 file changed, 100 insertions
IIR_second.c(file created)
| @@ -0,0 +1,100 @@ | |||
| 1 | + | /////////////////////////////////////////////////////////////////////////////////////////////// | |
| 2 | + | // SINEIO | |
| 3 | + | /////////////////////////////////////////////////////////////////////////////////////////////// | |
| 4 | + | ||
| 5 | + | #include <time.h> | |
| 6 | + | #include "../myWin826.h" | |
| 7 | + | #include "../826api.h" | |
| 8 | + | #include "../RealTime.h" | |
| 9 | + | ||
| 10 | + | #define SAMPLE_RATE 750 // SET ME | |
| 11 | + | ||
| 12 | + | // IO card configuration constants | |
| 13 | + | #define IO_BOARD_NUM 0 // no change | |
| 14 | + | #define ADC_SLOT 0 // no change | |
| 15 | + | ||
| 16 | + | #define DAC_ZERO_OUTPUT 0x8000 | |
| 17 | + | #define DAC_CONFIG_GAIN S826_DAC_SPAN_10_10 // -10 to 10 spans 20 volts so... | |
| 18 | + | #define DAC_VRANGE 20.0 // This MUST correspond to the DAC_SPAN just above | |
| 19 | + | #define DAC_CNT_RANGE 0xFFFF // 16-bit DAC | |
| 20 | + | #define DAC_OFFSET_COUNTS 0x8000 // 32768 offset for a signed desired output mapped to unsigned DAC write. | |
| 21 | + | ||
| 22 | + | #define DAC_CHANNEL 1 // SET ME! CHECK YOUR SETUP: DAC channel output | |
| 23 | + | ||
| 24 | + | #define ADC_CHANNEL 0 // SET ME! CHECK YOUR SETUP: analog input channel to track | |
| 25 | + | ||
| 26 | + | ||
| 27 | + | #define ADC_CNT_RANGE 0xFFFF // 2^16= 0xFFFF (16 bit converter) | |
| 28 | + | #define ADC_GAIN S826_ADC_GAIN_1 // -10 to 10 option | |
| 29 | + | #define ADC_VRANGE 20 // this must correspond to gain setting | |
| 30 | + | ||
| 31 | + | ||
| 32 | + | #define ADC_ENABLE 1 | |
| 33 | + | ||
| 34 | + | int main() | |
| 35 | + | { | |
| 36 | + | int errcode = S826_ERR_OK; | |
| 37 | + | int boardflags = S826_SystemOpen(); // open 826 driver and find all 826 boards | |
| 38 | + | int slotdata; // adc data from the slot of interest | |
| 39 | + | int ncount = 0; | |
| 40 | + | uint dacout; | |
| 41 | + | ||
| 42 | + | double voltagein = 0.0; | |
| 43 | + | double voltageout = 0; | |
| 44 | + | ||
| 45 | + | double yv = 0.0; | |
| 46 | + | double zv = 0.0; | |
| 47 | + | double y_prev = 0.0; | |
| 48 | + | double z_prev = 0.0; | |
| 49 | + | double A_coeff = 0.84606; | |
| 50 | + | double B_coeff = 0.15394; | |
| 51 | + | ||
| 52 | + | // instantiate our "real time" object that will pace our loop | |
| 53 | + | RealTime realTime(SAMPLE_RATE); | |
| 54 | + | ||
| 55 | + | // Configure data achqisition interfaces and start them running. | |
| 56 | + | X826(S826_AdcSlotConfigWrite(IO_BOARD_NUM, ADC_SLOT, ADC_CHANNEL, 0, ADC_GAIN)); // program adc timeslot attributes: slot, chan, 0us settling time. For -5V-5V use: "S826_ADC_GAIN_2" | |
| 57 | + | X826(S826_AdcSlotlistWrite(IO_BOARD_NUM, 1 << ADC_SLOT, S826_BITWRITE)); // enable adc timeslot; disable all other slots | |
| 58 | + | X826(S826_AdcEnableWrite(IO_BOARD_NUM, ADC_ENABLE)); // enable adc conversions | |
| 59 | + | ||
| 60 | + | X826(S826_DacRangeWrite(IO_BOARD_NUM, DAC_CHANNEL, DAC_CONFIG_GAIN, 0)); // program dac output range: -10V to +10V | |
| 61 | + | ||
| 62 | + | // commence pseudo-real-time loop. | |
| 63 | + | realTime.Start(); | |
| 64 | + | ||
| 65 | + | while (!_kbhit()) | |
| 66 | + | { | |
| 67 | + | // read ADC sample | |
| 68 | + | X826(AdcReadSlot(IO_BOARD_NUM, ADC_SLOT, &slotdata)); | |
| 69 | + | signed short int adcin = slotdata; | |
| 70 | + | ||
| 71 | + | // get the ADC sample as a voltage | |
| 72 | + | voltagein = (double)(adcin * ADC_VRANGE) / ADC_CNT_RANGE; | |
| 73 | + | yv = (A_coeff * y_prev) + (B_coeff * voltagein); | |
| 74 | + | zv = (A_coeff * z_prev) + (B_coeff * yv); | |
| 75 | + | ||
| 76 | + | // set v_prev for use in next iteration through loop | |
| 77 | + | y_prev = yv; | |
| 78 | + | z_prev = zv; | |
| 79 | + | ||
| 80 | + | voltageout = zv; | |
| 81 | + | ||
| 82 | + | // scale the desired voltage to the DAC integer output. | |
| 83 | + | dacout = (uint)(voltageout * (DAC_CNT_RANGE / DAC_VRANGE) + DAC_OFFSET_COUNTS); | |
| 84 | + | ||
| 85 | + | // output to the DAC | |
| 86 | + | X826(S826_DacDataWrite(IO_BOARD_NUM, DAC_CHANNEL, dacout, 0)); | |
| 87 | + | ||
| 88 | + | realTime.Sleep(); | |
| 89 | + | ncount++; | |
| 90 | + | } | |
| 91 | + | ||
| 92 | + | realTime.Stop(ncount); // stop real-time loop | |
| 93 | + | ||
| 94 | + | ||
| 95 | + | X826(S826_DacDataWrite(IO_BOARD_NUM, DAC_CHANNEL, DAC_ZERO_OUTPUT, 0)); // put to zero at the end | |
| 96 | + | S826_SystemClose(); | |
| 97 | + | ||
| 98 | + | ||
| 99 | + | return 0; | |
| 100 | + | } | |
wschrab revised this gist 1 month ago. Go to revision
1 file changed, 0 insertions, 0 deletions
IIR_first.cpp renamed to IIR_first.c
File renamed without changes
wschrab revised this gist 1 month ago. Go to revision
1 file changed, 96 insertions
IIR_first.cpp(file created)
| @@ -0,0 +1,96 @@ | |||
| 1 | + | /////////////////////////////////////////////////////////////////////////////////////////////// | |
| 2 | + | // SINEIO | |
| 3 | + | /////////////////////////////////////////////////////////////////////////////////////////////// | |
| 4 | + | ||
| 5 | + | #include <time.h> | |
| 6 | + | #include "../myWin826.h" | |
| 7 | + | #include "../826api.h" | |
| 8 | + | #include "../RealTime.h" | |
| 9 | + | ||
| 10 | + | #define SAMPLE_RATE 750 // SET ME | |
| 11 | + | ||
| 12 | + | // IO card configuration constants | |
| 13 | + | #define IO_BOARD_NUM 0 // no change | |
| 14 | + | #define ADC_SLOT 0 // no change | |
| 15 | + | ||
| 16 | + | #define DAC_ZERO_OUTPUT 0x8000 | |
| 17 | + | #define DAC_CONFIG_GAIN S826_DAC_SPAN_10_10 // -10 to 10 spans 20 volts so... | |
| 18 | + | #define DAC_VRANGE 20.0 // This MUST correspond to the DAC_SPAN just above | |
| 19 | + | #define DAC_CNT_RANGE 0xFFFF // 16-bit DAC | |
| 20 | + | #define DAC_OFFSET_COUNTS 0x8000 // 32768 offset for a signed desired output mapped to unsigned DAC write. | |
| 21 | + | ||
| 22 | + | #define DAC_CHANNEL 1 // SET ME! CHECK YOUR SETUP: DAC channel output | |
| 23 | + | ||
| 24 | + | #define ADC_CHANNEL 0 // SET ME! CHECK YOUR SETUP: analog input channel to track | |
| 25 | + | ||
| 26 | + | ||
| 27 | + | #define ADC_CNT_RANGE 0xFFFF // 2^16= 0xFFFF (16 bit converter) | |
| 28 | + | #define ADC_GAIN S826_ADC_GAIN_1 // -10 to 10 option | |
| 29 | + | #define ADC_VRANGE 20 // this must correspond to gain setting | |
| 30 | + | ||
| 31 | + | ||
| 32 | + | #define ADC_ENABLE 1 | |
| 33 | + | ||
| 34 | + | int main() | |
| 35 | + | { | |
| 36 | + | int errcode = S826_ERR_OK; | |
| 37 | + | int boardflags = S826_SystemOpen(); // open 826 driver and find all 826 boards | |
| 38 | + | int slotdata; // adc data from the slot of interest | |
| 39 | + | int ncount = 0; | |
| 40 | + | uint dacout; | |
| 41 | + | ||
| 42 | + | double voltagein = 0.0; | |
| 43 | + | double voltageout = 0; | |
| 44 | + | ||
| 45 | + | double v_prev = 0.0; | |
| 46 | + | double A_coeff = 0.84606; | |
| 47 | + | double B_coeff = 0.15394; | |
| 48 | + | ||
| 49 | + | // instantiate our "real time" object that will pace our loop | |
| 50 | + | RealTime realTime(SAMPLE_RATE); | |
| 51 | + | ||
| 52 | + | // Configure data achqisition interfaces and start them running. | |
| 53 | + | X826(S826_AdcSlotConfigWrite(IO_BOARD_NUM, ADC_SLOT, ADC_CHANNEL, 0, ADC_GAIN)); // program adc timeslot attributes: slot, chan, 0us settling time. For -5V-5V use: "S826_ADC_GAIN_2" | |
| 54 | + | X826(S826_AdcSlotlistWrite(IO_BOARD_NUM, 1 << ADC_SLOT, S826_BITWRITE)); // enable adc timeslot; disable all other slots | |
| 55 | + | X826(S826_AdcEnableWrite(IO_BOARD_NUM, ADC_ENABLE)); // enable adc conversions | |
| 56 | + | ||
| 57 | + | X826(S826_DacRangeWrite(IO_BOARD_NUM, DAC_CHANNEL, DAC_CONFIG_GAIN, 0)); // program dac output range: -10V to +10V | |
| 58 | + | ||
| 59 | + | // commence pseudo-real-time loop. | |
| 60 | + | realTime.Start(); | |
| 61 | + | ||
| 62 | + | while (!_kbhit()) | |
| 63 | + | { | |
| 64 | + | // read ADC sample | |
| 65 | + | X826(AdcReadSlot(IO_BOARD_NUM, ADC_SLOT, &slotdata)); | |
| 66 | + | signed short int adcin = slotdata; | |
| 67 | + | ||
| 68 | + | // get the ADC sample as a voltage | |
| 69 | + | voltagein = (double)(adcin * ADC_VRANGE) / ADC_CNT_RANGE; | |
| 70 | + | voltageout = (A_coeff * v_prev) + (B_coeff * voltagein); | |
| 71 | + | ||
| 72 | + | // set v_prev for use in next iteration through loop | |
| 73 | + | v_prev = voltageout; | |
| 74 | + | ||
| 75 | + | // scale the desired voltage to the DAC integer output. | |
| 76 | + | dacout = (uint)(voltageout * (DAC_CNT_RANGE / DAC_VRANGE) + DAC_OFFSET_COUNTS); | |
| 77 | + | ||
| 78 | + | // output to the DAC | |
| 79 | + | X826(S826_DacDataWrite(IO_BOARD_NUM, DAC_CHANNEL, dacout, 0)); | |
| 80 | + | ||
| 81 | + | realTime.Sleep(); | |
| 82 | + | ncount++; | |
| 83 | + | } | |
| 84 | + | ||
| 85 | + | realTime.Stop(ncount); // stop real-time loop | |
| 86 | + | ||
| 87 | + | ||
| 88 | + | X826(S826_DacDataWrite(IO_BOARD_NUM, DAC_CHANNEL, DAC_ZERO_OUTPUT, 0)); // put to zero at the end | |
| 89 | + | S826_SystemClose(); | |
| 90 | + | ||
| 91 | + | ||
| 92 | + | return 0; | |
| 93 | + | } | |
| 94 | + | ||
| 95 | + | ||
| 96 | + | ||