IIR_first.c
· 3.1 KiB · C
Raw
///////////////////////////////////////////////////////////////////////////////////////////////
// SINEIO
///////////////////////////////////////////////////////////////////////////////////////////////
#include <time.h>
#include "../myWin826.h"
#include "../826api.h"
#include "../RealTime.h"
#define SAMPLE_RATE 750 // SET ME
// IO card configuration constants
#define IO_BOARD_NUM 0 // no change
#define ADC_SLOT 0 // no change
#define DAC_ZERO_OUTPUT 0x8000
#define DAC_CONFIG_GAIN S826_DAC_SPAN_10_10 // -10 to 10 spans 20 volts so...
#define DAC_VRANGE 20.0 // This MUST correspond to the DAC_SPAN just above
#define DAC_CNT_RANGE 0xFFFF // 16-bit DAC
#define DAC_OFFSET_COUNTS 0x8000 // 32768 offset for a signed desired output mapped to unsigned DAC write.
#define DAC_CHANNEL 1 // SET ME! CHECK YOUR SETUP: DAC channel output
#define ADC_CHANNEL 0 // SET ME! CHECK YOUR SETUP: analog input channel to track
#define ADC_CNT_RANGE 0xFFFF // 2^16= 0xFFFF (16 bit converter)
#define ADC_GAIN S826_ADC_GAIN_1 // -10 to 10 option
#define ADC_VRANGE 20 // this must correspond to gain setting
#define ADC_ENABLE 1
int main()
{
int errcode = S826_ERR_OK;
int boardflags = S826_SystemOpen(); // open 826 driver and find all 826 boards
int slotdata; // adc data from the slot of interest
int ncount = 0;
uint dacout;
double voltagein = 0.0;
double voltageout = 0;
double v_prev = 0.0;
double A_coeff = 0.84606;
double B_coeff = 0.15394;
// instantiate our "real time" object that will pace our loop
RealTime realTime(SAMPLE_RATE);
// Configure data achqisition interfaces and start them running.
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"
X826(S826_AdcSlotlistWrite(IO_BOARD_NUM, 1 << ADC_SLOT, S826_BITWRITE)); // enable adc timeslot; disable all other slots
X826(S826_AdcEnableWrite(IO_BOARD_NUM, ADC_ENABLE)); // enable adc conversions
X826(S826_DacRangeWrite(IO_BOARD_NUM, DAC_CHANNEL, DAC_CONFIG_GAIN, 0)); // program dac output range: -10V to +10V
// commence pseudo-real-time loop.
realTime.Start();
while (!_kbhit())
{
// read ADC sample
X826(AdcReadSlot(IO_BOARD_NUM, ADC_SLOT, &slotdata));
signed short int adcin = slotdata;
// get the ADC sample as a voltage
voltagein = (double)(adcin * ADC_VRANGE) / ADC_CNT_RANGE;
voltageout = (A_coeff * v_prev) + (B_coeff * voltagein);
// set v_prev for use in next iteration through loop
v_prev = voltageout;
// scale the desired voltage to the DAC integer output.
dacout = (uint)(voltageout * (DAC_CNT_RANGE / DAC_VRANGE) + DAC_OFFSET_COUNTS);
// output to the DAC
X826(S826_DacDataWrite(IO_BOARD_NUM, DAC_CHANNEL, dacout, 0));
realTime.Sleep();
ncount++;
}
realTime.Stop(ncount); // stop real-time loop
X826(S826_DacDataWrite(IO_BOARD_NUM, DAC_CHANNEL, DAC_ZERO_OUTPUT, 0)); // put to zero at the end
S826_SystemClose();
return 0;
}
| 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 | |
| 97 |