打印
[STM8]

STM8S1O5K4的AD采集不知道出了什么问题,求大神!

[复制链接]
1546|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
STM8S1O5K4的AD采集不知道出了什么问题,求大神!使用AD0通道直接接的3.3V   调试的时候采集数据完全不对,低于2.5V就采集不了。
上图是调试的时候,寄存器的值。求大神搭救!!
#include"iostm8s105k4.h"
int i;
unsigned int H,L;
unsigned int dianya;
void delay(unsigned int z)
{
  unsigned int a;
  for(a=z;a>0;a--);
}
void Init_AD(void)
{     
      ADC_CSR=0x00; //选择通道
      ADC_CR2|=0x08; // 数据排列,右对齐
      ADC_TDRL=0x01;
      ADC_CR1|=0X01;
}
void Init_UART2(void)
{
      UART2_CR1=0x00;
      UART2_CR2=0x00;
      UART2_CR3=0x00;
      // 设置波特率,必须注意以下几点:
      // (1) 必须先写BRR2
      // (2) BRR1存放的是分频系数的第11位到第4位,
      // (3) BRR2存放的是分频系数的第15位到第12位,和第3位
      // 到第0位
      // 例如对于波特率位9600时,分频系数=2000000/9600=208
      // 对应的十六进制数为00D0,BBR1=0D,BBR2=00
      UART2_BRR2=0x00;
      UART2_BRR1=0x0d;
      UART2_CR2=0x2c;//允许接收,发送,开接收中断
}
void UART2_sendchar(unsigned char c)
{
      while((UART2_SR & 0x80)==0x00);
      UART2_DR=c;
}
void main()
{

        Init_AD();
        Init_UART2();
        delay(1000);
        while (1)
        {
                delay(1000);
                ADC_CR1|=0x01;
                // 再次将CR1寄存器的最低位置1,开启AD转换
                while((ADC_CSR & 0x80)!=0x80); // 等待转换结束      
                ADC_CSR&=0x7F;
                L=ADC_DRL;
                H=ADC_DRH;
                dianya=H*256+L;
                delay(1000);               
        }
}

沙发
airwill| | 2014-4-8 06:14 | 只看该作者
图上也没有看到什么问题,
"使用AD0通道直接接的3.3V   调试的时候采集数据完全不对,"                    啥叫不对呢?
"低于2.5V就采集不了。"                                                                       啥叫采集不了? 死机了?

使用特权

评论回复
板凳
tozxq| | 2014-4-8 08:49 | 只看该作者
请参考下例程,注意为了转换准确,丢弃了第一次的转换结果。


  STM8的C语言编程-- AD转换

在许多的单片机应用系统中,都需要A/D转换器,将模拟量转换成数字量。在STM8单片机中,提供的是10位的A/D,通道数随芯片不同而不同,少的有4个通道,多的则有16个通道。
利用ST的开发工具,生成一个C语言程序的框架,然后修改其中的main.c,修改后的代码如下。

//  程序描述:通过AD模块,采样电位器的电压,改变LED的闪烁频率

#include "STM8S207C_S.h"

// 函数功能:延时函数
// 输入参数:ms -- 要延时的毫秒数,这里假设CPU的主频为2MHZ
// 输出参数:无
// 返 回 值:无
// 备    注:无
void DelayMS(unsigned int ms)
{
  unsigned char i;
  while(ms != 0)
  {
    for(i=0;i<250;i++)
    {
    }
    for(i=0;i<75;i++)
    {
    }
    ms--;  
  }     
}

main()
{
  int i;

  // 将PD3设置成推挽输出,以便推动LED
  PD_DDR = 0x08;
  PD_CR1 = 0x08;              
  PD_CR2 = 0x00;

  // 初始化A/D模块
  ADC_CR2 = 0x00;             // A/D结果数据左对齐
  ADC_CR1 = 0x00;             // ADC时钟=主时钟/2=1MHZ
                              // ADC转换模式=单次
                              // 禁止ADC转换
  ADC_CSR = 0x03;             // 选择通道3
  ADC_TDRL = 0x20;            

  for(;;)                     // 进入无限循环                              
  {
    ADC_CR1 = 0x01;           // CR1寄存器的最低位置1,使能ADC转换
    for(i=0;i<100;i++);       // 延时一段时间,至少7uS,保证ADC模块的上电完成
    ADC_CR1 = ADC_CR1 | 0x01; // 再次将CR1寄存器的最低位置1
                              // 使能ADC转换
    while((ADC_CSR & 0x80) == 0); // 等待ADC结束
         
    i = ADC_DRH;              // 读出ADC结果的高8位
    DelayMS(i);               // 延时一段时间
         
    PD_ODR = PD_ODR ^ 0x08;   // 将PD3反相
  }
}
                                 

使用特权

评论回复
地板
guoduliang|  楼主 | 2014-4-8 13:54 | 只看该作者
airwill 发表于 2014-4-8 06:14
图上也没有看到什么问题,
"使用AD0通道直接接的3.3V   调试的时候采集数据完全不对,"                     ...

采集3.3V电压  按道理说ADC值为1023   现在只有几百。

使用特权

评论回复
5
airwill| | 2014-4-8 13:59 | 只看该作者
采集3.3V电压  按道理说ADC值为1023   
现在是 0x396, 就是 918. 好象少了点. 这个和信号源, 噪声, 参考电压有关, 差得不是太多, 也可以检查一下硬件和信号。

使用特权

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

本版积分规则

6

主题

11

帖子

0

粉丝