FRDM K64平台QMX系统下ADC采样值可否批量获取sample值
大家好,小弟近来在QMX系统中做一个ADC采样的评估,想对一个通道的ADC的采样值批量读取后再做二次处理,通过网上的例子,现在可以读取当前值,但想问下,有办法可以通过read这个api批量读取所有的sample值么?我的通道配置是这样的:
/* Logical channel #1 init struct */
const ADC_INIT_CHANNEL_STRUCT adc_channel_param1 =
{
ADC0_SOURCE_ADPM0,
ADC_CHANNEL_MEASURE_LOOP | ADC_CHANNEL_START_TRIGGERED,
4096, /* number of samples in one run sequence */
0, /* time offset from trigger point in us */
20, /* period in us (= 0.00002 sec) */
0x10000, /* scale range of result (not used now) */
4096, /* circular buffer size (sample count) */
ADC_TRIGGER, /* logical trigger ID that starts this ADC channel */
#if MQX_USE_LWEVENTS
&evn,
0x01 /* mask of event to be set */
#endif
};
最终目标是想实现按照一定的采样率例如50KHz采样率,采集满4096点的数据后,批量读出,现在是用fopen和read这两个api实现的单个结果的读取,可否批量读出4096个sample呢?请各位高手指教,谢谢!
例程大致如下:
#if MQX_USE_LWEVENTS
if (_lwevent_create(&evn, 0) != MQX_OK) {
printf("\nMake event failed!\n");
_task_block();
}
#endif
printf("Opening ADC device ...");
f = fopen(ADC_0, (const char*)&adc_init);
if(f != NULL)
{
printf("done\n");
}
else
{
printf("failed\n");
_task_block();
}
printf("Opening channel #1 ...");
f_ch1 = fopen(ADC_0 "first", (const char*)&adc_channel_param1);
if(f_ch1 != NULL)
{
printf("done, prepared to start by trigger\n");
}
else
{
printf("failed\n");
_task_block();
}
_time_delay(1000);
printf("Triggering channel #1...");
ioctl(f, ADC_IOCTL_FIRE_TRIGGER, (void*)ADC_TRIGGER);
printf("triggered!\n");
for(i = 0; ; i++)
{
/* channel 1 sample ready? */
if (read(f_ch1, &data, sizeof(data) ))
printf("ADC ch 1: %4d \n", data.result);
_time_delay(100);
} 门外汉瞎说一下:底层用内存池存满了,发一个事件给进程,再来读不就OK了哇。像STM32单片机的ADC就可以用DMA驱动由硬件自动放到缓冲区循环采集,应用程序想读随时去读就OK了。不占用软件资源和CPU。 嗯,这个原理我明白,不过像请教下,能否调用一次read读出所有sample值呢? 不知楼主使用的是 MQX那个版本, 我们推荐客户使用lwadc driver, lwadc driver 更好使用 。 老版本的 adc driver. 在MQX 4.1中就已经删除了。 adc 驱动我们都是在底层自己做
页:
[1]