打印
[STM32F4]

AD采集数据如何转换

[复制链接]
307|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xxrs|  楼主 | 2022-10-16 11:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
采样函数及中断函数:
    unsigned int ADC16_Sample(char ADC,unsigned int AverageNum)
{
  //unsigned long int ADC_SumU=0;//无符号模式的累加值
  signed long int ADC_SumS=0;//有符号模式的累加值  
  unsigned int *SD16CCTL;    //ADCx控制寄存器选择指针
  int i;
  SD16CCTL=(unsigned int *)&SD16CCTL0;//指针指向ADC0控制寄存器
  *SD16CCTL |=SD16IE;              //打开选中的ADC的中断
  _EINT();                         //开总中断
  P1OUT &= ~CS;
  ADC16_VrefOn();
  *SD16CCTL |= SD16SC;             //向选中的ADC发出"开始采样"命令  
  for(i=0;i<AverageNum;i++)        //循环连续采样
  {
    for(unsigned int j=0;j<10000;j++);
     while(ADC_Flag==0) LPM0;           //等待一次采样结束
     ADC_Flag=0;
     ADC_SumS+=(int)ADC_Result[ADC]; //按有符号模式累加
  }                                    //采样次数达到
  ADC16_VrefOff();  
  P1OUT |= CS;
  *SD16CCTL &=~ SD16SC;                //向选中的ADC发出"停止采样"命令
  *SD16CCTL &=~ SD16IE;                //关闭相应ADC的中断  
  return(ADC_SumS>>4); //有符号数据格式平均值/AverageNum
}
  
#pragma vector=SD16_VECTOR
__interrupt void SD16ISR(void)
{
  switch (SD16IV)                           //判断中断类型
  {
  case 2:                                   // SD16MEM Overflow
    break;
  case 4:                                   // ADC0 采样结束
    ADC_Result[0]=SD16MEM0+187;
    if(SD16MEM0>0X7FFF)
    {
      Num_Flag=1;
    }
    else
    {
      Num_Flag=0;
    }
    break;           // 保存ADC0采样结果
  }
ADC_Flag=1;                                //ADC中断已执行标志                        
__low_power_mode_off_on_exit();            //唤醒CPU
}

哪位帮忙分析下什么原因,谢谢了。

使用特权

评论回复
沙发
xxrs|  楼主 | 2022-10-16 11:32 | 只看该作者
采集0.08v到0.4v的电压值,但是AD转换后的数据比模拟值要偏小,而且随着信号的增大,偏差越来越大。量程范围内,最大偏差10mv

使用特权

评论回复
板凳
huangchui| | 2022-10-16 11:34 | 只看该作者

ad采集的精度?

使用特权

评论回复
地板
zhaoxqi| | 2022-10-16 11:35 | 只看该作者
基准电压是否稳定?

使用特权

评论回复
5
yszong| | 2022-10-16 11:37 | 只看该作者
唤醒后延迟一些时间再进行ADC采集,看看数据是否会准确一些?

使用特权

评论回复
6
supernan| | 2022-10-16 11:39 | 只看该作者
信号没放大再采样吗?

使用特权

评论回复
7
chenjunt| | 2022-10-16 11:45 | 只看该作者
AD误差跟基准源的精度有关,另外如此之低的信号不能直接送AD,否则不但量程浪费了,精度也容易不足。

使用特权

评论回复
8
zhanghqi| | 2022-10-16 11:49 | 只看该作者
内部参考源的精度有比较大的影响,你看一下器件手册

使用特权

评论回复
9
morrisk| | 2022-10-16 13:21 | 只看该作者
这个程序的倒没啥问题的。

使用特权

评论回复
10
dingy| | 2022-10-16 13:24 | 只看该作者
信号放大是不是需要AD自己有通道增益才行呀

使用特权

评论回复
11
xxrs|  楼主 | 2022-10-16 13:27 | 只看该作者
可以通过线性拟合进行补偿。

使用特权

评论回复
12
zhanghqi| | 2022-10-16 13:29 | 只看该作者
有可能是硬件电路的问题。

使用特权

评论回复
13
xxrs|  楼主 | 2022-10-16 13:31 | 只看该作者

问题是你用的什么电压基准啊

使用特权

评论回复
14
dingy| | 2022-10-16 13:33 | 只看该作者
没看明白

使用特权

评论回复
15
SantaBunny| | 2023-2-21 22:32 | 只看该作者
如果是做量程切换,只能选择电阻很小的开关,同时注意开关的平坦度和温度漂移参数,如果系统精度要求很高,那就只能做软件校正或者选择可编程放大器如AD8250/1/3等

使用特权

评论回复
16
yangxiaor520| | 2023-2-22 07:50 | 只看该作者
你是想问什么?一上来就贴程序。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

405

主题

7415

帖子

1

粉丝