chenaiguo0503 发表于 2017-4-17 18:21:24

CSR8670配置ADC功能

如题,有一块CSR8670的评估板,想自己配置ADC功能,采集外部其他的一些数据,

请问有相关经验的指导下。

chenaiguo0503 发表于 2017-4-18 14:34:40

const TaskData ADC_Task = {adctask_handler};

void adctask_handler(Task task, MessageId id, Message message)
{
        switch (id)
        {
                case MESSAGE_ADC_READ_START :
            printf("ADC request ...\n");
                        break;
       
                case MESSAGE_ADC_RESULT :
      {
                        MessageAdcResult *result = (MessageAdcResult *)message;
                        uint16 reading = result->reading;

                        if(result->adc_source == adcsel_aio0)
                        {
                                   printf("%d,Vref = %d\n", reading, VmReadVrefConstant());
                    printf("ADC Reulst Success!\n");
                        }
                        else if (result->adc_source == adcsel_vref)
                        {
                                printf("adcsel_vref = %d\n", reading);
                        }
                               
      }
                break;

      default :
                        break;
        }
}

void AioReadStart(void)
{
        if (AdcRequest((TaskData *)&ADC_Task, adcsel_aio0))
        {
                MessageSendLater((TaskData *)&ADC_Task, MESSAGE_ADC_READ_START, NULL, 5000);
        }
}

liujinhan 发表于 2017-4-18 16:59:51

测过的代码:

#include <pio_common.h>
#include <adc.h>
#include <pio.h>
#include <stdlib.h>
#include <vm.h>



/*********************/
void Aio_Init(void);
void AIO_ReadStart(Task task, vm_adc_source_type adc_source, uint32 period);
void AIO_ReadReStart(Task task);
void Aio_Handler(Task task, MessageId id, Message message);


typedef struct
{
        TaskData        task;
        uint16        voltage_value;
    vm_adc_source_type        adc_source;
} AIO_TaskData_T;

AIO_TaskData_T aio_app;

#define AIO_READ_PERIOD 1000

#define MESSAGE_ADC_READ_START        (MESSAGE_ADC_RESULT+100)

void Aio_Init(void)
{
        aio_app.task.handler = Aio_Handler;
       
        aio_app.voltage_value = 0;
        aio_app.adc_source = adcsel_aio0;
       
        AIO_ReadReStart(&aio_app.task);
}


void AIO_ReadStart(Task task, vm_adc_source_type adc_source, uint32 period)
{       
        /* Request ADC Reading */
        if(AdcRequest(task, adc_source))
        {
                /* Successful request*/
                aio_app.adc_source = adc_source;
                MessageSendLater(task, MESSAGE_ADC_READ_START, NULL, period);
        }
}


void AIO_ReadReStart(Task task)
{       
        AIO_ReadStart(task, aio_app.adc_source, AIO_READ_PERIOD);
}

void Aio_Handler(Task task, MessageId id, Message message)
{
        switch(id)
        {
                case MESSAGE_ADC_READ_START:
                AIO_ReadReStart(task);
                break;
               
                case MESSAGE_ADC_RESULT:
                {
                        const MessageAdcResult* const result= (const MessageAdcResult*)message;
            uint16        reading = result->reading;
                                               
                        PRINT(("AIO: ADC msg source %u reading %u\n", result->adc_source, result->reading));
                        reading=0;
                       
                        #if 0
                        uint16 res;
                        if (result->adc_source<adcsel_vref)
                        /* for aio inputs continue to use the VREF reading which comes from the same ADC as the aio inputs */                       
                        {
                                /* for AIOs voltage(mV) = reading(ADC counts) * (mv_per_count = VREF(mV)/VREF(ADC counts)) */
                                res = (uint16)(((uint32)VmReadVrefConstant() * reading) / power->vref);
                        }
                        PRINT(("POWER: BC7 res %u\n", res));
                       
                        AIO_ReadReStart(task);
                       
                        #endif

                       
                       
                }
               
                break;
               
                default:
                        break;
               
        }
}



/*********************/

chenaiguo0503 发表于 2017-4-19 16:12:53

liujinhan 发表于 2017-4-18 16:59
测过的代码:

#include


谢谢提供代码帮助,另外,我想咨询下,读取AIO的时候,它的基准电压只能是通过(uint32)((uint32)VmReadVrefConstant() * (uint32)reading)) / power->vref这种公式计算吗?

VmReadVrefConstant固定为700,
power->vref大致为531,

liujinhan 发表于 2017-4-19 16:59:38

没有仔细研究过,你看代码吧。
代码怎么用就怎么用。

shiruquaan23 发表于 2018-2-16 19:41:23

不错,点个赞。。。。
页: [1]
查看完整版本: CSR8670配置ADC功能