发 帖  
原厂入驻New
[问答]

【求助】AD采样问题。。。

1091
分享
求助。。。。
代码如下。。。。。
#include <stdio.h>
#include <string.h>
#include "Uarttimer.h"
  
#define HAL_ADC_CHN_A7            0x07
#define HAL_ADC_REF_AVDD          0x80   
#define HAL_ADC_DEC_512     0x30
#define ADC_TO_CELSIUS(ADC_VALUE)       ((float)(ADC_VALUE*3.3/4096.0/0.022))
unsigned int value;
uint count=0;             //用于定时器计数
int lock=0;
char buf[10];
void Init()
{     
    T4CTL |= 0x08 ;          //开溢出中断     
    T4IE = 1;                //开T4中断
    T4CTL |= 0xA0;           //不分频
    T4CTL &= ~0x03;          //自动重装 00->0xff  
    T4CTL |= 0x10;           //启动
    ADCIE=0;                 //AD中断
    EA = 1;
}
unsigned int Read_Vddvalue(void)
{
  unsigned int value;
  ADCIF=0;                                                          //清ADC中断标志位
  while(!ADCIF);                                                    //判断是不是转换完成
  value=ADCL>>2;                                                    //结果保存于value中(低位)
  value|=ADCH<<6;                                                   //结果保存于value中(高位)
  return(value);
}
/****************************************************************************
* 程序入口函数
****************************************************************************/
void main(void)
{   
    int nv=0;
    P0_7=1;
    DISABLE_ALL_INTERRUPTS();     //关闭所有中断  
    InitUART();                           //初始化串口
    Initclock();                          //初始化时钟
    Init();
    while(1)
    {
      if(ADCIF)
      {
        ADCIF = 0;
        value=ADCL>>2;                                                    //结果保存于value中(低位)
        value|=ADCH<<6;
        nv=(int)ADC_TO_CELSIUS(value);
        sprintf(buf, "%d", nv);
        UartSendString(buf, strlen(buf));
        //DelayMS(1);
      }
    }
}

//定时器T4中断处理函数
#pragma vector = T4_VECTOR
__interrupt void T4_ISR(void)
{
    IRCON = 0x00;            //清中断标志, 也可由硬件自动完成
    if(++count>250)
    {
      count=0;
      ADCCON3=(HAL_ADC_REF_AVDD|HAL_ADC_DEC_512|HAL_ADC_CHN_A7);
    }

}
为什么定时器0.25ms启动一次ADC(4KHz)但是实际串口发送数据采样率为十赫兹。。。
即采1Hz信号每周期10个点(excel绘图)纠结好久了。。。
0
2014-7-8 09:30:17   评论 分享淘帖 邀请回答
3个回答
串口数据发送不用时间的啊
2014-7-8 10:46:32 评论

举报



ntmusic 发表于 2014-7-8 10:46
串口数据发送不用时间的啊



那也不应该从4kHz变为10Hz吧。。。o(╯□╰)o
2014-7-8 13:36:24 评论

举报

本帖最后由 ntmusic 于 2014-7-8 15:06 编辑

这个自己可以粗略估算一下的,即使不考虑额外运算时间,纯发送字节数据,按波特率9600,8位数据位1位停止位来计算,每秒也只能传送约1066字节的数据。就算你1帧数据就1字节,那么也只能达到1K的数据刷新率。加上你还有浮点运算和数值转换程序(用的还是stdio.h中的,极大耗费运算速度),并且不可能连续发送,一帧数据我看也有10字节,这么算下来,最快也就每秒十几帧了。为了提高速度,可以将波特率提高,并且不要运算好再上传,而是直接传送AD结果(2字节),到计算机再进行运算,这样将极大提高数据刷新率。
2014-7-8 15:03:10 评论

举报

撰写答案

你正在撰写答案

如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
我要提问
关闭

站长推荐 上一条 /8 下一条

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