本帖最后由 lucky67 于 2017-6-29 10:11 编辑
请教大家,我在使用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);
- }
- }
复制代码
|
手册里说超过上限电压后AWD会置1。但我试了不会。
评分
查看全部评分
你是怎么确定模拟狗上限电压的?我刚才又测试了,发现假如我在上限寄存器里设置上限电压为2.869(ADC_HTR=0x024b)时,实际触发电压是1.7V左右。但设置成上限电压为3.216(ADC_HTR=0x0292)时,触发电压又变成2.89V左右了。真搞不懂什么原因
ADC看门狗没能按照预想方案成功运行,作废,采用其他方案了。
看来我也只能想其它方案了。苦!
评分
查看全部评分
参考电压与设置的电压有0.5V左右的差别,但是我现在测试出来实际触发电压跟设定电压,在不同电压状态下的差值 是不一样的