📄 dm6430-auto-scan.c
字号:
/* FILE NAME: dm6430-auto-scan.c FILE DESCRIPTION: Automatic channel scan sample program This program uses the sample counter and the pacer clock features of the DM6430 to do MULTI-SCAN sampling. The board is set up to sample a set of channels, 3 times every time the board receives a trigger from the on board 8254. While the measurement is running the acquired A/D data is displayed on the screen, one line with every sample. PROJECT NAME: Linux DM6430 Driver, Library, and Example Programs PROJECT VERSION: (Defined in README.TXT) Copyright 2004 RTD Embedded Technologies, Inc. All Rights Reserved.*/#include <errno.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/poll.h>#include <unistd.h>#include <dm6430lib.h>#define FIRST_CHAN2 DM6430HR_AIN1 // First channel to scan.#define NUM_OF_CHAN2 4 // Number of channels to scan.#define RATE2 1000 // Sample rate in [Hz].#define USER_RATE2 1 // Measurement trigger period in [Hz].#define ADSLOPE2 (65536.0/20.0) // Number Bits divided by AD Range.char *program_name_p;static voidusage(void) { fprintf( stderr, "\n" "Usage: %s MINOR_NUMBER" "\n", program_name_p ); exit(EXIT_FAILURE);}static voidverify_success(int status, const char *message_p) { if (status == -1) { perror(message_p); exit(EXIT_FAILURE); }}intisstdindata(int timeout) { struct pollfd in = {0, POLLIN | POLLERR | POLLPRI, 0}; int num_fds; while (((num_fds = poll(&in, 1, timeout)) == -1) && (errno == EINTR)) ; return ((num_fds == 1) && (in.revents & (POLLIN | POLLPRI)));}intmain(int argument_count, char **arguments_p_p) { ADTableRow ADTable[NUM_OF_CHAN2]; double ActualRate0; double dummy; int channel; int descriptor; int status; unsigned int minor_number; program_name_p = arguments_p_p[0]; if (argument_count != 2) { fprintf(stderr, "Invalid number of options given.\n"); usage(); } if (sscanf(arguments_p_p[1], "%u", &minor_number) == 0) { fprintf(stderr, "Invalid device minor number.\n"); usage(); } descriptor = OpenBoard6430(minor_number); verify_success(descriptor, "OpenBoard6430() FAILED"); status = InitBoard6430(descriptor); verify_success(status, "InitBoard6430() FAILED"); for (channel = 0; channel < NUM_OF_CHAN2; channel++) { ADTable[channel].Channel = (FIRST_CHAN2 + channel); ADTable[channel].Gain = DM6430HR_GAINx1; ADTable[channel].Se_Diff = DM6430HR_SE_SE; ADTable[channel].Pause = 0; ADTable[channel].Skip = 0; } status = SetPacerClock6430(descriptor, RATE2 * NUM_OF_CHAN2, &dummy); verify_success(status, "SetPacerClock6430() FAILED"); status = SetUserClock6430( descriptor, DM6430HR_CLK0, 8000000, 20000, &ActualRate0 ); verify_success(status, "SetUserClock6430() FAILED"); status = SetUserClock6430( descriptor, DM6430HR_CLK1, ActualRate0, USER_RATE2, &dummy ); verify_success(status, "SetUserClock6430() FAILED"); status = SetTriggerRepeat6430(descriptor, DM6430HR_REPEAT_REPEAT); verify_success(status, "SetTriggerRepeat6430() FAILED"); status = SetStartTrigger6430(descriptor, DM6430HR_START_TRIG_USER_TC1); verify_success(status, "SetStartTrigger6430() FAILED"); status = SetStopTrigger6430(descriptor, DM6430HR_STOP_TRIG_SAMPLE_CNT); verify_success(status, "SetStopTrigger6430() FAILED"); status = SetConversionSelect6430(descriptor, DM6430HR_CONV_PACER_CLOCK); verify_success(status, "SetConversionSelect6430() FAILED"); status = LoadADSampleCounter6430(descriptor, NUM_OF_CHAN2 * 3); verify_success(status, "LoadADSampleCounter6430() FAILED"); status = LoadADTable6430(descriptor, NUM_OF_CHAN2, ADTable); verify_success(status, "LoadADTable6430() FAILED"); status = EnableTables6430(descriptor, 1, 0); verify_success(status, "EnableTables6430() FAILED"); status = ClearADFIFO6430(descriptor); verify_success(status, "ClearADFIFO6430() FAILED"); fprintf(stdout, "AIN1 - AIN4 range = bipolar 10V\nPress Enter for stop\n"); status = StartConversion6430(descriptor); verify_success(status, "StartConversion6430() FAILED"); while (!isstdindata(200)) { for (channel = 0; channel < NUM_OF_CHAN2; channel++ ) { int empty_flag; int16_t data; do { status = IsADFIFOEmpty6430(descriptor, &empty_flag); verify_success(status, "IsADFIFOEmpty6430() FAILED"); } while (empty_flag); status = ReadADData6430(descriptor, &data); verify_success(status, "ReadADData6430() FAILED"); fprintf( stdout, "CH%d: %+04.1lf mV\n", (channel + 1), data / ADSLOPE2 ); } fprintf(stdout, "\n"); } exit(EXIT_SUCCESS);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -