CSR8670配置ADC功能
如题,有一块CSR8670的评估板,想自己配置ADC功能,采集外部其他的一些数据,请问有相关经验的指导下。 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);
}
} 测过的代码:
#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;
}
}
/*********************/
liujinhan 发表于 2017-4-18 16:59
测过的代码:
#include
谢谢提供代码帮助,另外,我想咨询下,读取AIO的时候,它的基准电压只能是通过(uint32)((uint32)VmReadVrefConstant() * (uint32)reading)) / power->vref这种公式计算吗?
VmReadVrefConstant固定为700,
power->vref大致为531, 没有仔细研究过,你看代码吧。
代码怎么用就怎么用。 不错,点个赞。。。。
页:
[1]