⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dm6430-sample-counter.c

📁 rt 6430 采集卡 linux下驱动源代码
💻 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 + -