你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
lucky67 提问时间:2017-6-29 10:07 /
5ST金币
本帖最后由 lucky67 于 2017-6-29 10:11 编辑

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

  3. void Clock_Config(void);
  4. void AD_Config(void);
  5. void AD_Read(void);
  6. void delay_us(unsigned int nCount);
  7. void delay_ms(unsigned int nCount);

  8. int main(void){
  9.     Clock_Config();
  10.     AD_Config();
  11.     while(1){
  12.       AD_Read();
  13.       if(ADC_CSR_AWD==1)
  14.       {printf("%s\n","Vol UP!!!");ADC_CSR_AWD=0;}
  15.       delay_ms(1000);
  16.     }
  17. }

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

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

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

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

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

  43. void AD_Read(void){
  44.     unsigned int ADVal_1=0;
  45.     float ADVal_10=0;
  46.     float AD_Temp=0;
  47.     float ADVal=0;
  48.     unsigned int TempL=0;
  49.     unsigned int TempH=0;
  50.    
  51.   for(unsigned char i=0;i<10;i++){
  52.         delay_ms(10);
  53.         ADC_CR1_ADON=1;//开始转换;
  54.         while(0==ADC_CSR_EOC);//等待转换完成        
  55.         ADC_CSR_EOC=0;  //清除AD完成标志位
  56.         TempL=ADC_DRL;
  57.         TempH=ADC_DRH<<8;
  58.         ADVal_1 = TempL|TempH;
  59.         AD_Temp=AD_Temp+ADVal_1;
  60.   }
  61.   
  62.     ADVal_10=AD_Temp/10;//取10次平均值
  63.     ADVal=(ADVal_10*500)/1023;//*100用来防止损失位

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

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


  68. void delay_us(unsigned int nCount)
  69. {
  70.     nCount *= 2;
  71.     while(--nCount){     asm("nop");asm("nop");  
  72.     };
  73. }

  74. void delay_ms(unsigned int nCount)
  75. {
  76.     while(nCount--)
  77.     {
  78.         delay_us(1000);
  79.     }
  80. }
复制代码




收藏 评论9 发布时间:2017-6-29 10:07

举报

9个回答
无薪税绵 回答时间:2017-6-30 08:10:41
需要开中断吗。
lucky67 回答时间:2017-6-30 10:06:18

手册里说超过上限电压后AWD会置1。但我试了不会。
wenyangzeng 回答时间:2017-6-30 10:23:02
我也遇到ADC_HTRL和ADC_HTRH配置后数据相反无法正常操作的问题,不知道是不是STM8的一个BUG。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

lucky67 回答时间:2017-6-30 11:27:38
wenyangzeng 发表于 2017-6-30 10:23
我也遇到ADC_HTRL和ADC_HTRH配置后数据相反无法正常操作的问题,不知道是不是STM8的一个BUG。 ...

你是怎么确定模拟狗上限电压的?我刚才又测试了,发现假如我在上限寄存器里设置上限电压为2.869(ADC_HTR=0x024b)时,实际触发电压是1.7V左右。但设置成上限电压为3.216(ADC_HTR=0x0292)时,触发电压又变成2.89V左右了。真搞不懂什么原因
wenyangzeng 回答时间:2017-6-30 13:10:12
lucky67 发表于 2017-6-30 11:27
你是怎么确定模拟狗上限电压的?我刚才又测试了,发现假如我在上限寄存器里设置上限电压为2.869(ADC_HTR ...

ADC看门狗没能按照预想方案成功运行,作废,采用其他方案了。
lucky67 回答时间:2017-6-30 13:53:03
wenyangzeng 发表于 2017-6-30 13:10
ADC看门狗没能按照预想方案成功运行,作废,采用其他方案了。

看来我也只能想其它方案了。苦!
林光光 回答时间:2017-7-2 22:44:37
会不会是硬件设计时,ADC的参考电压不一样

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

lucky67 回答时间:2017-7-6 15:19:47
林光光1号 发表于 2017-7-2 22:44
会不会是硬件设计时,ADC的参考电压不一样

参考电压与设置的电压有0.5V左右的差别,但是我现在测试出来实际触发电压跟设定电压,在不同电压状态下的差值 是不一样的
林光光 回答时间:2017-7-9 14:22:05
这个是有要求的,VDD与VDDA的压差 YA3Y2)[PI(RSC~MY2}5E7YL.png
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版