打印
[开发工具]

IAR For STM8的ADC使用问题?

[复制链接]
4110|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hjl2832|  楼主 | 2011-4-21 10:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hjl2832 于 2011-4-21 13:48 编辑

今天在调试程序时居然发现了IAR FOR STM8的一个奇怪的BUG,我将AD采集的值赋给一个数组,结果却发现所有的值都错位。
附上相关程序如下:
//AD采集通道控制定义
#define   AD4051_AD0     0x00      
#define   AD4051_AD1     0x02   
#define   AD4051_AD2     0x04   
#define   AD4051_AD3     0x06      
#define   AD4051_AD4     0x08  
#define   AD4051_AD5     0x0a
#define   AD4051_AD6     0x0c
#define   AD4051_AD7     0x0f

unsigned int  VoutArray[4];       //** 充电电压 **
unsigned int  Vin1Array[4];       //** 太阳能板A电压 **
unsigned int  Vin2Array[4];       //** 太阳能板B电压 **
unsigned int  IinArray[4];        //** 充电电流 **
unsigned int  Iout1Array[4];      //** 负载电流1 **
unsigned int  Iout2Array[4];      //** 负载电流2 **
unsigned int  tempArray[4];       //** 温度电压 **
unsigned char  DatSamCnt=0;

/*******************************************************************************
** 函数名称 :DATA_acq()
** 函数功能 :模拟量数据采集
** 入口参数 :无
** 出口参数 :
*******************************************************************************/
unsigned int DATA_acq(unsigned char channel)
{
   unsigned int  ADC_DataH;
   unsigned char  ADC_DataL;
   PB_ODR = (PB_ODR & 0xf0)|channel;    //** 74HC4051 选通控制 **
   
   ADC_CR1|=0x01;         //** 将CR1寄存器的最低位置1,开启AD转换 **
   delay_us(5);
   ADC_CR1|=0x01;         //** 再次将CR1寄存器的最低位置1,开启AD转换 **
   while((ADC_CSR & 0x80)!=0x80);  //** 等待转换结束 **
   ADC_DataH = ADC_DRH;        //** 把高位用PB显示出来 **  //****
   ADC_DataL = ADC_DRL;        //** 把低位用PD显示出来 **  //****
   ADC_DataH = ADC_DataL | (ADC_DataH<<8);
   ADC_CSR&=(~0x80);      //** 软件清零 转换结束 标志位 **
   return (ADC_DataH);
}

/**************数据采集***********************************/
void ad_data_gather(void)
{
       if(DatSamCnt>=4){DatSamCnt=0;}
    // LastVoltgeIn=Vin_Voltge;
    VoutArray[DatSamCnt] = DATA_acq (AD4051_AD0);      //采集电池充电电压即电池电压
    IinArray[DatSamCnt] = DATA_acq (AD4051_AD1);      //采集电池充电电流
    Iout1Array[DatSamCnt] = DATA_acq (AD4051_AD2);      //采集负载1电流   
    Iout2Array[DatSamCnt] = DATA_acq (AD4051_AD3);      //采集负载2电流
    Vin1Array[DatSamCnt] = DATA_acq (AD4051_AD4);      //采集太阳能板电压
    Vin2Array[DatSamCnt] = DATA_acq (AD4051_AD5);      //采集风机电压
    tempArray[DatSamCnt] = DATA_acq (AD4051_AD6);      //采集温度传感器电压
}

执行ad_data_gather后却发现,所有数据都错位,VoutArray[DatSamCnt]的值等于DATA_acq (AD4051_AD6)的值,其它都按序错位,调试时设置断点于 VoutArray[DatSamCnt]处,再在 ADC_CSR&=(~0x80);      //** 软件清零 转换结束 标志位 **设断点看ADC_DRH和ADC_DRL的值,结果是等于(AD4051_AD0)通道的实际值; 而这个程序以前用于51和LPC2132上都是正确的。IAR FOR STM8 真的这么烂吗?感觉怪怪。
沙发
hjl2832|  楼主 | 2011-4-21 13:59 | 只看该作者
问题解决,给自己留个记号,也给朋友们提个醒。
问题的关键是在于STM8单片机的AD模块的功能跟其它的不一样,在右对齐模式中,必须先读低8位,再读高8位,否则读到的值是前一次的值。
在上面的程序中我用红字符标记的地方,是先读的高8位,再读低8位,所以出错。貌似STM8在右对齐模式时,一定要先读低8位才会刷新寄存器的值。
最后一点我不明白的是,用ST LINK调试时,明明看到的ADC_DRH和ADC——DRL是当前的正确值,为什么赋值给数组后却是前一次的值。

使用特权

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

本版积分规则

26

主题

1026

帖子

4

粉丝