📄 dm6430-sample-counter.c
字号:
/* FILE NAME: dm6430-sample-counter.c FILE DESCRIPTION: Sample counter example program This program demonstrates how to use the sample counter to generate interrupts. The pacer clock is used to drive A/D conversion. Conversion is started by a software trigger. Conversion is stopped when the sample counter counts down. Samples are printed on the screen. 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>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); }}static 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)));}#define ADCHANNEL9 DM6430HR_AIN1 // A/D channel#define RATE9 1000 // Clock rate in 'Hz'#define ADSLOPE9 (65536.0/20.0) // Number Bits divided by AD Range#define NUM_OF_SAMPLES9 512 // Number of samples in a buffer#define IRQCHANNEL9 DM6430HR_INT1 // interrupt channelintmain(int argument_count, char **arguments_p_p) { double Actual_PACER_RATE; int descriptor; int monSamples1 = 200; int status; unsigned int minor_number; unsigned long local_counter = 0; 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"); status = SetPacerClock6430(descriptor, RATE9, &Actual_PACER_RATE); verify_success(status, "SetPacerClock6430() FAILED"); status = SetStartTrigger6430(descriptor, DM6430HR_START_TRIG_SOFTWARE); 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 = SetChannelGain6430( descriptor, ADCHANNEL9, DM6430HR_GAINx1, DM6430HR_SE_SE ); verify_success(status, "SetChannelGain6430() FAILED"); status = LoadADSampleCounter6430(descriptor, NUM_OF_SAMPLES9); verify_success(status, "LoadADSampleCounter6430() FAILED"); status = SetIRQ0Source6430(descriptor, IRQS_AD_SAMPLE_CNT_6430); verify_success(status, "SetIRQ0Source6430() FAILED"); fprintf(stdout, "Channel AIN%d : %6.2lf Volts\n", ADCHANNEL9 + 1, 0.0); fprintf( stdout, "IRQ has been set up.\nInput channel AIN%d sampled at %d Hz.\n", ADCHANNEL9 + 1, RATE9 ); status = ClearIRQ06430(descriptor); verify_success(status, "ClearIRQ06430() FAILED"); status = EnableIRQ6430(descriptor, IRQCHANNEL9); verify_success(status, "EnableIRQ6430() FAILED"); status = StartConversion6430(descriptor); verify_success(status, "StartConversion6430() FAILED"); while (!isstdindata(200)) { unsigned long irqcounter; status = GetIRQCounter6430(descriptor, IRQCHANNEL9, &irqcounter); verify_success(status, "GetIRQCounter6430() FAILED"); /* * The code in the following if-statement is executed exactly once * since only one interrupt should occur and then A/D conversion is * halted. */ if (irqcounter != local_counter) { int sample; int16_t data; local_counter = irqcounter; for (sample = 0; sample < monSamples1; sample++) { status = ReadADData6430(descriptor, &data); verify_success(status, "ReadADData6430() FAILED"); fprintf(stdout, "%5.2lf mV\n", data / ADSLOPE9); } fprintf(stdout, "# of interrupts: %ld\n", irqcounter); fprintf(stdout, "Conversion halted. Press ENTER to exit.\n"); } } status = DisableIRQ6430(descriptor, IRQCHANNEL9); verify_success(status, "DisableIRQ6430() FAILED"); status = DoneTimer6430(descriptor); verify_success(status, "DoneTimer6430() FAILED"); status = CloseBoard6430(descriptor); verify_success(status, "CloseBoard6430() FAILED"); exit(EXIT_SUCCESS);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -