打印
[STM8]

STM8S105S4的AD模拟狗问题,设置上下限后不能触发

[复制链接]
601|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
请教大家,我在使用STM8S105S4的AD转换时,AD转换已经可以正常工作,但在启用模拟狗时,实际电压远远超过上限电压时,AWD位总是无法置1。
我用的是IAR,发现设置好ADC_HTRL=0x01;  ADC_HTRH=0xf5;后,打开IAR的寄存器监视,里面显示出却是高低位反过来了。试过用库函数也是一样。如下图:
比如我程序里设置ADC_HTRL=0x01;    ADC_HTRH=0xf5;后,这样计算,上限电压是2.45。AD转换后显示的电压达到3.2V了AWD都还没置1请问这是什么原因?
全部代码如下:
#include "iostm8s105s4.h"
#include<stdio.h>

void Clock_Config(void);
void AD_Config(void);
void AD_Read(void);
void delay_us(unsigned int nCount);
void delay_ms(unsigned int nCount);

int main(void){
    Clock_Config();
    AD_Config();
    while(1){
      AD_Read();
      if(ADC_CSR_AWD==1)
      {printf("%s\n","Vol UP!!!");ADC_CSR_AWD=0;}
      delay_ms(1000);
    }
}

void Clock_Config(void){
    //==启用外部晶振.不分频。
    CLK_ECKR=0x01;//HSE开
    CLK_ICKR=0x00;
    while(CLK_ECKR!=0x03);//等待HSE准备就绪
    CLK_SWR=0xb4;//设置HSE为主时钟源
    CLK_SWCR=0x03;//使能时钟切换,禁止时钟中断
    while(!(CLK_SWCR &0x08));    // 等待切换至HSE完成
}

void AD_Config(void){
    ADC_CSR_CH=0x09;//选择通道9;
    ADC_CR1|=0x00;//fadc=fmaster/2,单次转换,A/D关

    ADC_TDRH|=0x02;
    ADC_TDRL|=0x00;//关闭通道9的施密特触发器

    ADC_HTRL=0x01;
    ADC_HTRH=0xf5;
   
    ADC_LTRL=0x00;//设定AD模拟狗上限电压为2V,下限电压为0;
    ADC_LTRH=0x00;

    ADC_CR2_EXTTRIG=0;//禁止外部触发
    ADC_CR2_ALIGN=1;//数据右对齐
   
    ADC_CR1_ADON=1;//使能AD;   
    ADC_CSR_AWDIE=1;//使能模拟看门狗
}

void AD_Read(void){
    unsigned int ADVal_1=0;
    float ADVal_10=0;
    float AD_Temp=0;
    float ADVal=0;
    unsigned int TempL=0;
    unsigned int TempH=0;
   
  for(unsigned char i=0;i<10;i++){
        delay_ms(10);
        ADC_CR1_ADON=1;//开始转换;
        while(0==ADC_CSR_EOC);//等待转换完成        
        ADC_CSR_EOC=0;  //清除AD完成标志位
        TempL=ADC_DRL;
        TempH=ADC_DRH<<8;
        ADVal_1 = TempL|TempH;
        AD_Temp=AD_Temp+ADVal_1;
  }
  
    ADVal_10=AD_Temp/10;//取10次平均值
    ADVal=(ADVal_10*500)/1023;//*100用来防止损失位

    int b=(int)(ADVal/100);
    int c=(int)(ADVal-b*100);

    printf("v=%d.%.2d\n",b,c);
}


void delay_us(unsigned int nCount)
{
    nCount *= 2;
    while(--nCount){     asm("nop");asm("nop");  
    };
}

void delay_ms(unsigned int nCount)
{
    while(nCount--)
    {
        delay_us(1000);
    }
}


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

本版积分规则

10

主题

29

帖子

3

粉丝