搜索
bottom↓
回复: 5

CSR8670配置ADC功能

[复制链接]

出0入0汤圆

发表于 2017-4-17 18:21:24 | 显示全部楼层 |阅读模式
如题,有一块CSR8670的评估板,想自己配置ADC功能,采集外部其他的一些数据,

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

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2017-4-18 14:34:40 | 显示全部楼层
  1. const TaskData ADC_Task = {adctask_handler};

  2. void adctask_handler(Task task, MessageId id, Message message)
  3. {
  4.         switch (id)
  5.         {
  6.                 case MESSAGE_ADC_READ_START :
  7.             printf("ADC request ...\n");
  8.                         break;
  9.        
  10.                 case MESSAGE_ADC_RESULT :
  11.         {
  12.                         MessageAdcResult *result = (MessageAdcResult *)message;
  13.                         uint16 reading = result->reading;

  14.                         if(result->adc_source == adcsel_aio0)
  15.                         {
  16.                                    printf("%d,  Vref = %d\n", reading, VmReadVrefConstant());
  17.                     printf("ADC Reulst Success!\n");
  18.                         }
  19.                         else if (result->adc_source == adcsel_vref)
  20.                         {
  21.                                 printf("adcsel_vref = %d\n", reading);
  22.                         }
  23.                                
  24.         }
  25.                 break;

  26.         default :
  27.                         break;
  28.         }
  29. }

  30. void AioReadStart(void)
  31. {
  32.         if (AdcRequest((TaskData *)&ADC_Task, adcsel_aio0))
  33.         {
  34.                 MessageSendLater((TaskData *)&ADC_Task, MESSAGE_ADC_READ_START, NULL, 5000);
  35.         }
  36. }
复制代码

出0入0汤圆

发表于 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;
               
        }
}



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

出0入0汤圆

 楼主| 发表于 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,

出0入0汤圆

发表于 2017-4-19 16:59:38 | 显示全部楼层
没有仔细研究过,你看代码吧。
代码怎么用就怎么用。

出0入0汤圆

发表于 2018-2-16 19:41:23 | 显示全部楼层
不错,点个赞。。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 03:36

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表