daicp 发表于 2014-9-12 12:50:40

在KDS环境下 KL16 6路ADC中断连续采样要怎样设置呢?

在KDS环境下 KL166路ADC中断连续采样要怎样设置呢?

KDS帮助文档应用只是一路ADC的例程,多路的按帮助文档试了很多次也不成功,请FSL版主,各位高手指点。

#define NUMBER_OF_MEASUREMENTS 10U
#define SAMPLE_GROUP_SIZE 1U

volatile uint8_t ConversionCount = 0U;
volatile AD1_TResultData MeasuredValues;
LDD_TDeviceData *MyADCPtr;
LDD_TError Error;

void main(void)
{
...
MyADCPtr = AD1_Init((LDD_TUserData *)NULL);      /* Initialize the device */
Error = AD1_SelectSampleGroup(MyADCPtr, 0U);       /* Select sample group 0 */
Error = AD1_StartLoopMeasurement(MyADCPtr);      /* Start continuous measurement */
for(;;) {
    if (ConversionCount == NUMBER_OF_MEASUREMENTS) { /* After NUMBER_OF_MEASUREMENTS cycles the conversion is stopped */
       Error = AD1_CancelMeasurement(MyADCPtr);      /* Stop continuous measurement */
    }
}
}

Content of Event.c:

extern volatile uint8_t ConversionCount;
extern volatile AD1_TResultData MeasuredValues[];
extern LDD_TDeviceData *MyADCPtr;
extern LDD_TError Error;

void AD1_OnMeasurementComplete(LDD_TUserData *UserDataPtr)
{
ConversionCount++;                                 /* Increment counter of conversions */
Error = AD1_GetMeasuredValues(MyADCPtr, (LDD_TData *)MeasuredValues);/* Read measured values */
}
这是KDS帮助的例程

daicp 发表于 2014-9-12 13:48:50

channel 0 已经可以正常转换数据,但是channel1-5还没有数据,初学FSL,请FAE多多支持

bbstr 发表于 2014-9-12 14:21:24

从你这个代码片段里没有中断处理的代码,你看看来中断后,你有没有清除中断,重新开启中断。另外,就是用poll的方式,看看 是不是寄存器都配置对了,ad采集常用的做法是启动一个dma,数据满的时候来一次dma中断把数据都读到数组里,就可以看到不同通道的ad值了

daicp 发表于 2014-9-12 14:40:51

bbstr 发表于 2014-9-12 14:21
从你这个代码片段里没有中断处理的代码,你看看来中断后,你有没有清除中断,重新开启中断。另外,就是用po ...

中断代码:

/*
** ===================================================================
**   Method      :AD_NTC1_6_MeasurementCompleteInterrupt (component ADC_LDD)
**
**   Description :
**         Measurement complete interrupt handler
**         This method is internal. It is used by Processor Expert only.
** ===================================================================
*/
PE_ISR(AD_NTC1_6_MeasurementCompleteInterrupt)
{
/* {Default RTOS Adapter} ISR parameter is passed through the global variable */
AD_NTC1_6_TDeviceDataPtr DeviceDataPrv = INT_ADC0__DEFAULT_RTOS_ISRPARAM;
AD_NTC1_6_OnMeasurementComplete(DeviceDataPrv->UserData);
(void)ADC_PDD_GetResultValueRaw(ADC0_BASE_PTR, 0U); /* Clear conversion complete flag */
}

/*
** ===================================================================
**   Event       :AD_NTC1_6_OnMeasurementComplete (module Events)
**
**   Component   :AD_NTC1_6
*/
/*!
**   @brief
**         Called after measurement is done,
**         is enabled, OnMeasurementComplete event is enabled and ADC
**         device is enabled. See method or [Event
**         mask] property group to enable this event and
**         method or property to enable ADC
**         device. If DMA is enabled , this event is called after the
**         configured number of measurements and DMA transfer is done.
**   @param
**         UserDataPtr   - Pointer to the user or
**                           RTOS specific data. The pointer is passed
**                           as the parameter of Init method.
*/
/* ===================================================================*/

extern volatile uint8_t ConversionCount;
extern volatile AD_NTC1_6_TResultData MeasuredValues[];
extern LDD_TDeviceData *MyADCPtr;
extern LDD_TError ADCError;



void AD_NTC1_6_OnMeasurementComplete(LDD_TUserData *UserDataPtr)
{
/* Write your code here ... */
        ConversionCount++;                                 /* Increment counter of conversions */
    ADCError = AD_NTC1_6_GetMeasuredValues(MyADCPtr, (LDD_TData *)MeasuredValues);/* Read measured values */
}

bbstr 发表于 2014-9-12 14:52:51

AD_NTC1_6_TDeviceDataPtr DeviceDataPrv = INT_ADC0__DEFAULT_RTOS_ISRPARAM;
AD_NTC1_6_OnMeasurementComplete(DeviceDataPrv->UserData);
(void)ADC_PDD_GetResultValueRaw(ADC0_BASE_PTR, 0U);

ADC_PDD_GetResultValueRaw这个你重点看下,看看有没有清除掉中断位 0与1..5的清除可能有所区别的

daicp 发表于 2014-9-12 15:10:54

bbstr 发表于 2014-9-12 14:52
AD_NTC1_6_TDeviceDataPtr DeviceDataPrv = INT_ADC0__DEFAULT_RTOS_ISRPARAM;
AD_NTC1_6_OnMeasurementC ...

谢谢,我看看

daicp 发表于 2014-9-12 15:15:51

#define ADC_PDD_GetResultValueRaw(PeripheralBase, Index) ( \
      ADC_R_REG(PeripheralBase,(Index)) \
    )

#define ADC_R_REG(base,index)                  ((base)->R)

跟到头文件里复制过来的

bbstr 发表于 2014-9-12 15:32:08

(void)ADC_PDD_GetResultValueRaw(ADC0_BASE_PTR, 0U);改成

(void)ADC_PDD_GetResultValueRaw(ADC0_BASE_PTR, 0U);
(void)ADC_PDD_GetResultValueRaw(ADC0_BASE_PTR, 1U);
(void)ADC_PDD_GetResultValueRaw(ADC0_BASE_PTR, 2U);
(void)ADC_PDD_GetResultValueRaw(ADC0_BASE_PTR, 3U);
看看呢
页: [1]
查看完整版本: 在KDS环境下 KL16 6路ADC中断连续采样要怎样设置呢?